使用Docker创建运行Etcd集群
下载安装
安装Docker
下载Etcd
在这之前我犯个了糊涂,因为我使用的是macos
系统,直接拷贝了本机的etcd
文件使用,而Docker
镜像使用的是alpine
linux,导致我的Docker
一直启动不起来,所以这里要注意了。
废话少讲,去github
下载对应的Etcd
文件
https://github.com/etcd-io/etcd/releases
解压tar.gz
包拿到etcd
和etcdctl
这两个文件,把这两个文件放在某个目录中,比如~/etcd
目录中。
创建Dockerfile文件
cd ~/etcd
touch Dockerfile
内容如下:
FROM alpine
ADD etcd /usr/local/bin/
ADD etcdctl /usr/local/bin/
RUN mkdir -p /var/etcd/
RUN mkdir -p /var/lib/etcd/
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
EXPOSE 2379 2380
CMD [ "/usr/local/bin/etcd" ]
创建镜像
我使用的etcd
版本号是3.4.4,所以我加了个tag给它,好方便以后区分。
docker build -t etcd:3.4.4 .
查看刚刚创建的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
etcd 3.4.4 ca85f276bf1b 12 minutes ago 46.9MB
创建容器
使用Docker Compose
创建
可以灵活的在一台服务器上部署1至N个Etcd
节点
创建3个容器
在目录~/etcd
下创建并编写docker-compose.yml文件
version: "3.7"
services:
etcd0:
image: "etcd:3.4.4"
container_name: etcd0
ports:
- "23800:2380"
- "23790:2379"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd0
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://192.168.3.19:23790
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd0:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
etcd1:
image: "etcd:3.4.4"
container_name: etcd1
ports:
- "23801:2380"
- "23791:2379"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd1
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://192.168.3.19:23791
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
etcd2:
image: "etcd:3.4.4"
container_name: etcd2
ports:
- "23802:2380"
- "23792:2379"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_NAME=etcd2
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://192.168.3.19:23792
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
- ETCD_INITIAL_CLUSTER_STATE=new
创建并运行
docker-compose up -d
Etcd参数说明:
--name 节点名称
--data-dir 指定节点的数据存储目录
--listen-peer-urls 监听URL,用于与其他节点通讯
--listen-client-urls 对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互
--initial-advertise-peer-urls 该节点同伴监听地址,这个值会告诉集群中其他节点
--initial-cluster 集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… 。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
--initial-cluster-state 新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
--initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
--advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
在项目中使用时,只要把这三个IP地址加入就行
//这仅是个举例
"etcd": {
"addrs": [
"192.168.3.19:23790",
"192.168.3.19:23791",
"192.168.3.19:23792"
]
}
验证
上面命令创建容器后会自动运行,现在来查看一下正在运行的容器。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23118af323b7 etcd:3.4.4 "/usr/local/bin/etcd…" 14 minutes ago Up 14 minutes 0.0.0.0:23792->2379/tcp, 0.0.0.0:23802->2380/tcp etcd2
a56c474096b4 etcd:3.4.4 "/usr/local/bin/etcd…" 14 minutes ago Up 14 minutes 0.0.0.0:23791->2379/tcp, 0.0.0.0:23801->2380/tcp etcd1
0f69893b4461 etcd:3.4.4 "/usr/local/bin/etcd…" 14 minutes ago Up 14 minutes 0.0.0.0:23790->2379/tcp, 0.0.0.0:23800->2380/tcp etcd0
选择并进入一个node,查看etcd
的运行情况
docker exec -it a56c474096b4 /bin/sh
查看列表,看它们之间是否能够互相通信
etcdctl member list
ok,没问题
3afe939858b1b0d7, started, etcd1, http://etcd1:2380, http://192.168.3.19:23791, false
4491176acad620db, started, etcd0, http://etcd0:2380, http://192.168.3.19:23790, false
848e3e65e4ec6f12, started, etcd2, http://etcd2:2380, http://192.168.3.19:23792, false