docker運行etcd集羣

使用Docker建立運行Etcd集羣

下載安裝

安裝Docker

自行解決

下載Etcd

在這以前我犯個了糊塗,由於我使用的是macos系統,直接拷貝了本機的etcd文件使用,而Docker鏡像使用的是alpinelinux,致使個人Docker一直啓動不起來,因此這裏要注意了。node

廢話少講,去github下載對應的Etcd文件
https://github.com/etcd-io/etcd/releaseslinux

解壓tar.gz包拿到etcdetcdctl這兩個文件,把這兩個文件放在某個目錄中,好比~/etcd目錄中。git

建立Dockerfile文件

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

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地址加入就行tcp

//這僅是個舉例
"etcd": {
    "addrs": [
      "192.168.3.19:23790",
      "192.168.3.19:23791",
      "192.168.3.19:23792"
    ]
  }
IP地址能夠根據須要選擇使用。
IP地址能夠是任何一種能夠訪問該端口的
好比本機運行ETCD集羣: localhost:23790127.0.0.1:23790192.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
這裏有個小問題,集羣沒有完成選舉,後續完善
相關文章
相關標籤/搜索