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

더 알아보기 (Learn more)