自行解决
在这以前我犯个了糊涂,由于我使用的是macos
系统,直接拷贝了本机的etcd
文件使用,而Docker
镜像使用的是alpine
linux,致使个人Docker
一直启动不起来,因此这里要注意了。node
废话少讲,去github
下载对应的Etcd
文件
https://github.com/etcd-io/etcd/releaseslinux
解压tar.gz
包拿到etcd
和etcdctl
这两个文件,把这两个文件放在某个目录中,好比~/etcd
目录中。git
cd ~/etcd touch Dockerfile
内容以下:github
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
docker build -t etcd:3.4.4 .
查看刚刚建立的镜像shell
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE etcd 3.4.4 ca85f276bf1b 12 minutes ago 46.9MB
使用Docker Compose
建立
能够灵活的在一台服务器上部署1至N个Etcd
节点macos
建立3个容器json
~/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
这里192.168.3.19是我电脑的ip
建立并运行服务器
docker-compose up -d
--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地址加入就行tcp
//这仅是个举例 "etcd": { "addrs": [ "192.168.3.19:23790", "192.168.3.19:23791", "192.168.3.19:23792" ] }
IP地址能够根据须要选择使用。
IP地址能够是任何一种能够访问该端口的
好比本机运行ETCD集群:localhost:23790
、127.0.0.1:23790
、192.168.3.19:23790
局域网其它电脑访问用:192.168.3.19:23790
外网的用:123.123.123.123:23790
上面命令建立容器后会自动运行,如今来查看一下正在运行的容器。
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
这里有个小问题,集群没有完成选举,后续完善