Docker部署Etcd静态集群需预先定义节点拓扑,通过--initial-cluster统一声明所有节点信息;配置时确保时间同步、端口开放、目录权限合理,并为各节点分配唯一name与对应IP;启动后用etcdctl验证成员状态及数据同步。

使用Docker部署Etcd集群并启用静态发现机制,核心在于提前明确所有节点信息,并在启动每个容器时通过--initial-cluster参数完整声明整个集群拓扑。这种方式配置清晰、启动可控,适合网络环境稳定、节点数量固定的生产或测试场景。
准备基础环境
确保所有宿主机已安装Docker(建议24.0+),时间同步(NTP服务启用),防火墙放行两个关键端口:
- 2379:客户端通信端口(HTTP API)
- 2380:节点间对等通信端口(Peer)
关闭SELinux或将其设为permissive模式;在每台机器上创建独立的数据目录(如/data/etcd)和配置目录(如/etc/etcd),并设置合理权限(避免root以外用户写入数据目录)。
规划节点与命名规范
静态发现要求每个节点有唯一且稳定的标识。推荐按如下方式统一管理:
- 为每台宿主机设置固定主机名(如
etcd1.example.com),并在/etc/hosts中映射IP,避免DNS依赖 - 定义统一的集群Token(如
my-etcd-cluster-2026),保证所有节点--initial-cluster-token一致 - 每个节点使用不同
--name(如etcd1、etcd2),且该名称必须与--initial-cluster中声明的名称完全匹配
例如三节点集群可规划为:
etcd1 → 192.168.9.81,name=etcd1
etcd2 → 192.168.9.82,name=etcd2
etcd3 → 192.168.9.83,name=etcd3
编写启动命令或配置文件
推荐使用环境变量方式启动(简洁、易脚本化),也可用YAML配置文件(更易维护)。以节点1为例:
docker run -d \ --name etcd1 \ --restart=always \ -p 2379:2379 -p 2380:2380 \ -v /data/etcd:/var/lib/etcd \ -e ETCD_NAME=etcd1 \ -e ETCD_DATA_DIR=/var/lib/etcd \ -e ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \ -e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \ -e ETCD_INITIAL_ADVERTISE_PEER_URLS=http://192.168.9.81:2380 \ -e ETCD_ADVERTISE_CLIENT_URLS=http://192.168.9.81:2379 \ -e ETCD_INITIAL_CLUSTER="etcd1=http://192.168.9.81:2380,etcd2=http://192.168.9.82:2380,etcd3=http://192.168.9.83:2380" \ -e ETCD_INITIAL_CLUSTER_TOKEN="my-etcd-cluster-2026" \ -e ETCD_INITIAL_CLUSTER_STATE="new" \ quay.io/coreos/etcd:v3.5.12
其余节点仅需替换ETCD_NAME、ETCD_INITIAL_ADVERTISE_PEER_URLS、ETCD_ADVERTISE_CLIENT_URLS及宿主机IP,ETCD_INITIAL_CLUSTER字符串保持完全一致。
验证集群状态
任一节点执行以下命令检查成员健康与角色:
docker exec etcd1 etcdctl \ --endpoints=http://127.0.0.1:2379 \ member list --write-out=table docker exec etcd1 etcdctl \ --endpoints=http://127.0.0.1:2379 \ endpoint status --write-out=table
输出中应显示三个成员,且IsLeader列仅有一个为true;Status列为healthy表示通信正常。可进一步写入测试键值验证数据同步:
docker exec etcd1 etcdctl put testkey "testvalue" docker exec etcd2 etcdctl get testkey
若能读出相同值,说明静态集群已成功建立并具备基本一致性能力。


















