Consul
Deploy Consul client agent on Docker
This topic provides an overview for deploying a Consul client when running Consul on Docker containers.
Deploy and run a Consul client
After you deploy one or more server agents, you can deploy a containerized Consul client agent that joins the datacenter. Do not use detached mode. That way you can reference the client logs later.
The following command deploys a Docker container and instructs it to join the Consul cluster by including a Consul server's hostname or IP address in the retry-join
parameter.
$ 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
In a new terminal session, run the consul members
command in the Consul client container to confirm the agent joined the datacenter.
$ 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>
The output confirms that the client joined the cluster, and is ready to accept service definitions.
Multi-agent Consul deployment
You can start a multi-agent Consul deployment with multiple client containers. The following example uses a Docker compose file to start three Consul client containers that try to connect to a Consul server consul-server1
. For more information about starting a Consul server cluster, see Deploy Consul server agents on Docker.
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
You can start the cluster with the following command:
$ 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
This command starts the three Consul client containers in detached mode. Each client is configured to join the cluster by retrying to connect to consul-server1
.
You can verify the status of the cluster by executing the consul members
command inside any of the client containers:
$ 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>