使用Docker创建运行Etcd集群

下载安装

安装Docker

下载Etcd

在这之前我犯个了糊涂,因为我使用的是macos系统,直接拷贝了本机的etcd文件使用,而Docker镜像使用的是alpinelinux,导致我的Docker一直启动不起来,所以这里要注意了。

废话少讲,去github下载对应的Etcd文件
https://github.com/etcd-io/etcd/releases

解压tar.gz包拿到etcdetcdctl这两个文件,把这两个文件放在某个目录中,比如~/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
03-05 16:03