Docker 컨테이너에서 Consul 클라이언트 배포

Docker 컨테이너에서 Consul 클라이언트 배포

Docker 컨테이너에서 Consul을 실행할 때 Consul 클라이언트를 배포하는 개요를 설명하는 문서예요. 단일 클라이언트부터 여러 클라이언트(Docker compose)까지 살펴봐요.

출처: 문서

본문

이 주제는 Docker 컨테이너에서 Consul을 실행할 때 Consul 클라이언트를 배포하는 개요를 제공해요.

Consul 클라이언트 배포 및 실행 (Deploy and run a Consul client)

하나 이상의 서버 에이전트를 배포한 후, 데이터센터에 조인하는 컨테이너화된 Consul 클라이언트 에이전트를 배포할 수 있어요. 분리(detached) 모드는 사용하지 마세요. 그래야 나중에 클라이언트 로그를 참조할 수 있어요.

다음 명령은 Docker 컨테이너를 배포하고 retry-join 매개변수에 Consul 서버의 호스트 이름 또는 IP 주소를 포함시켜 Consul 클러스터에 조인하도록 지시해요.

$ docker run --name=consul-client hashicorp/consul consul agent -node=consul-client -data-dir=/consul/data -retry-join=consul-server
==> Starting Consul agent...
               Version: '1.21.2'
            Build Date: '2025-06-18 08:16:39 +0000 UTC'
               Node ID: '63a0c0ae-4762-2fa5-4b70-1cf526a1395b'
             Node name: 'consul-client'
            Datacenter: 'dc1' (Segment: '')
                Server: false (Bootstrap: false)
           Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, gRPC-TLS: -1, DNS: 8600)
          Cluster Addr: consul-server (LAN: 8301, WAN: 8302)
     Gossip Encryption: false
      Auto-Encrypt-TLS: false
           ACL Enabled: false
    ACL Default Policy: allow
             HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2
              gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2
      Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2

==> Log data will now stream in as it occurs:

2025-07-22T23:16:33.667Z [INFO]  agent.client.serf.lan: serf: EventMemberJoin: consul-client consul-server
2025-07-22T23:16:33.667Z [INFO]  agent.router: Initializing LAN area manager
2025-07-22T23:16:33.667Z [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=udp
2025-07-22T23:16:33.667Z [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=tcp
2025-07-22T23:16:33.667Z [INFO]  agent: Starting server: address=127.0.0.1:8500 network=tcp protocol=http
2025-07-22T23:16:33.668Z [INFO]  agent: started state syncer
2025-07-22T23:16:33.668Z [INFO]  agent: Retry join is supported for the following discovery methods: cluster=LAN discovery_methods="aliyun aws azure digitalocean gce hcp k8s linode mdns os packet scaleway softlayer tencentcloud triton vsphere"
2025-07-22T23:16:33.668Z [INFO]  agent: Joining cluster...: cluster=LAN
2025-07-22T23:16:33.668Z [INFO]  agent: (LAN) joining: lan_addresses=["consul-server"]
2025-07-22T23:16:33.668Z [INFO]  agent: Consul agent running!

##...

2022-12-15T18:59:46.454Z [INFO]  agent: Synced node info

새 터미널 세션에서 Consul 클라이언트 컨테이너 안의 consul members 명령을 실행해 에이전트가 데이터센터에 조인했는지 확인해요.

$  docker exec consul-client consul members
Node           Address          Status  Type    Build   Protocol  DC   Partition  Segment
consul-server  172.17.0.2:8301  alive   server  1.21.2  2         dc1  default    <all>
consul-client  172.17.0.3:8301  alive   client  1.21.2  2         dc1  default    <default>

출력은 클라이언트가 클러스터에 조인했고 서비스 정의를 받을 준비가 되었음을 확인해 줘요.

다중 에이전트 Consul 배포 (Multi-agent Consul deployment)

여러 클라이언트 컨테이너로 다중 에이전트 Consul 배포를 시작할 수 있어요. 다음 예시는 Consul 서버 consul-server1에 연결하려는 세 개의 Consul 클라이언트 컨테이너를 시작하는 Docker compose 파일을 사용해요. Consul 서버 클러스터 시작에 대한 자세한 내용은 Docker에서 Consul 서버 에이전트 배포를 참고하세요.

consul-clients.yml

version: '3.7'
services:
  consul-client1:
    image: hashicorp/consul:1.21.3
    container_name: consul-client1
    restart: always
    networks:
      - consul
    command: "agent -node=consul-client1 -client=0.0.0.0 -data-dir='/consul/data' -retry-join=consul-server1"
  consul-client2:
    image: hashicorp/consul:1.21.3
    container_name: consul-client2
    restart: always
    networks:
      - consul
    command: "agent -node=consul-client2 -client=0.0.0.0 -data-dir='/consul/data' -retry-join=consul-server1"
  consul-client3:
    image: hashicorp/consul:1.21.3
    container_name: consul-client3
    restart: always
    networks:
      - consul
    command: "agent -node=consul-client3 -client=0.0.0.0 -data-dir='/consul/data' -retry-join=consul-server1"
networks:
  consul:
    driver: bridge

다음 명령으로 클러스터를 시작할 수 있어요:

$ docker-compose -f consul-clients.yml up -d
[+] Running 4/4
 ✔ Network docker_consul     Created                                0.0s
 ✔ Container consul-client3  Started                                0.2s
 ✔ Container consul-client1  Started                                0.2s
 ✔ Container consul-client2  Started                                0.2s

이 명령은 세 개의 Consul 클라이언트 컨테이너를 분리 모드로 시작해요. 각 클라이언트는 consul-server1에 재연결을 시도하며 클러스터에 조인하도록 구성돼요.

어느 클라이언트 컨테이너 안에서든 consul members 명령을 실행해 클러스터 상태를 확인할 수 있어요:

$ docker exec consul-client1 consul members
Node            Address          Status  Type    Build   Protocol  DC   Partition  Segment
consul-server1  172.19.0.2:8301  alive   server  1.21.3  2         dc1  default    <all>
consul-client1  172.19.0.3:8301  alive   client  1.21.3  2         dc1  default    <default>
consul-client2  172.19.0.4:8301  alive   client  1.21.3  2         dc1  default    <default>
consul-client3  172.19.0.5:8301  alive   client  1.21.3  2         dc1  default    <default>

더 알아보기 (Learn more)