Docker에서의 Consul
Docker에서의 Consul (Consul on Docker)
이 페이지는 컨테이너화된 Consul 데이터센터에 접근하고 구성 리로드, 스냅샷 백업, 환경 변수 설정을 수행하는 방법을 설명해요.
출처: 문서
본문
컨테이너 접근 (Access containers)
컨테이너화된 Consul 데이터센터에는 여러 가지 방법으로 접근할 수 있어요.
Docker exec
docker exec를 사용해 Consul 컨테이너 안에서 직접 Consul 명령을 실행할 수 있어요.
$ docker exec <container_id> consul members
Node Address Status Type Build Protocol DC Partition Segment
server-1 172.17.0.2:8301 alive server 1.14.3 2 dc1 default <all>
client-1 172.17.0.3:8301 alive client 1.14.3 2 dc1 default <default>
Docker exec attach
대화형 셸을 열고 컨테이너에 포함된 Consul 바이너리를 사용해 컨테이너 안에서 명령을 실행할 수도 있어요.
$ docker exec -it <container_id> /bin/sh
# consul members
Node Address Status Type Build Protocol DC Partition Segment
server-1 172.17.0.2:8301 alive server 1.14.3 2 dc1 default <all>
client-1 172.17.0.3:8301 alive client 1.14.3 2 dc1 default <default>
로컬 Consul 바이너리 (Local Consul binary)
PATH에 로컬 Consul 바이너리가 있다면 CONSUL_HTTP_ADDR 환경 변수를 내보내 Consul 서버 컨테이너의 HTTP 주소를 가리킬 수 있어요.
$ export CONSUL_HTTP_ADDR=<consul_server_container_ip>:8500
이 방식은 컨테이너 대신 로컬 머신에서 Consul 바이너리를 실행하지만, 컨테이너에서 실행 중인 Consul 서버와 계속 통신해요.
$ consul members
Node Address Status Type Build Protocol DC Partition Segment
server-1 172.17.0.2:8301 alive server 1.21.2 2 dc1 default <all>
client-1 172.17.0.3:8301 alive client 1.21.2 2 dc1 default <default>
구성 리로드 (Reload configuration)
메모리 내 리로드를 수행하려면 컨테이너에 SIGHUP을 보내요.
$ docker kill --signal=HUP <container_id>
Consul Autopilot
데이터센터에 합의(consensus)를 유지할 만큼 충분한 서버가 있는 한 Consul의 autopilot 기능은 컨테이너가 중지된 서버를 제거해요.
Autopilot의 설정은 구성 가능하며, Docker에서 Consul을 실행할 때 다음 구성을 권장해요. 자세한 내용은 Autopilot 구성 참조를 확인해요.
cleanup_dead_servers— 중지된 컨테이너가 데이터센터에서 제거되도록true로 설정해야 해요.last_contact_threshold— 죽은 서버가 빠르게 제거되도록 충분히 작게 설정해야 해요.server_stabilization_time— 불안정한 서버가 안정화될 때까지 데이터센터에 추가되지 않도록 충분히 크게(수 초 단위) 설정해야 해요.
스냅샷으로 데이터 백업 (Backup data with snapshots)
consul snapshot 명령을 사용해 Consul 데이터센터를 백업할 수 있어요.
$ docker exec <container_id> consul snapshot save backup.snap
이렇게 하면 backup.snap 스냅샷 파일이 컨테이너 안에 남아요. 스냅샷을 영구 볼륨(persistent volume)에 저장하지 않는다면 docker cp를 사용해 스냅샷을 컨테이너 밖으로 옮겨야 해요.
$ docker cp <container_id>:backup.snap ./
백업을 자동으로 저장하려면 Consul Enterprise의 snapshot agent를 사용해요. Consul Enterprise의 snapshot agent는 스냅샷을 Amazon S3와 Azure Blob Storage에도 저장할 수 있어요.
환경 변수 (Environment variables)
Consul Docker 이미지는 -e 플래그로 여러 환경 변수를 전달하는 것을 지원해요.
CONSUL_CLIENT_INTERFACE— Consul이 DNS, gRPC, HTTP API를 노출하는 인터페이스의 이름을 지정해요.CONSUL_CLIENT_ADDRESS— Consul이 DNS, gRPC, HTTP API 같은 클라이언트 트래픽에 바인딩하는 주소를 지정해요.CONSUL_BIND_INTERFACE— Consul이 내부 Consul 클러스터 통신에 사용하는 인터페이스를 지정해요.CONSUL_BIND_ADDRESS— Consul이 내부 Consul 클러스터 통신에 바인딩하는 주소를 지정해요.CONSUL_DATA_DIR— Consul이 컨테이너 재시작에도 유지할 데이터를 저장하는 디렉터리를 지정해요. 기본값은/consul/data예요.CONSUL_ALLOW_PRIVILEGED_PORTS— 불리언 값이에요.true로 설정하면 Consul 바이너리에setcap이 실행되어 권한 있는 포트(privileged ports)에 바인딩할 수 있게 해요.CONSUL_CONFIG_DIR— Consul 에이전트가 로드하는 추가 구성 파일을 위한 컨테이너 디렉터리를 지정할 수 있어요. 기본 위치는/consul/config디렉터리예요.CONSUL_LOCAL_CONFIG— 구성 옵션의 JSON 문자열을 Consul 에이전트에 전달해요.
다음은 CONSUL_LOCAL_CONFIG를 사용해 여러 줄 구성(multi-line configuration)을 정의하는 예시예요.
$ docker run -d \
-e CONSUL_LOCAL_CONFIG='{
"datacenter":"us_west",
"server":true,
"enable_debug":true
}' \
hashicorp/consul:latest \
consul agent -server -bootstrap-expect=1 -data-dir=/consul/data