Docker Swarm 叢集搭建

Donjan發表於2019-12-10

@[TOC]

環境介紹

我的兩臺虛擬主機

主機名centos IP 192.168.137.200 為管理節點
主機名node1 IP 192.168.137.2 為普通節點

系統為Centos 7 64位

安裝Docker

分別在兩臺主機裡安裝Docker

curl -sSL https://get.daocloud.io/docker | sh

開機啟動

service docker start
systemctl enable docker

執行docker info,我目前的Server Version: 19.03.2

開啟埠

firewall-cmd --zone=public --add-port=2377/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/tcp --permanent &&
firewall-cmd --zone=public --add-port=7946/udp --permanent &&
firewall-cmd --zone=public --add-port=4789/udp --permanent &&
firewall-cmd --reload

或者直接關閉防火牆

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動

2377埠是叢集管理通訊埠,只需要在管理節點開啟

7946 tcp,udp是節點間通訊使用埠,

4789 是overlay network使用的埠。

如果你需要在叢集暴露其他服務,則需要開啟相應埠,比如80

當然如果你是阿里雲主機,相應埠是在安全策略開啟,如果節點都在同一區域,則可以不開啟埠,使用內網IP。

建立叢集

在管理節點上執行

docker swarm init --advertise-addr 192.168.137.200

我們得到

[root@localhost ~]# docker swarm init --advertise-addr 192.168.137.200
Swarm initialized: current node (ykiyahkjoq3q0dn2rrnqd4ery) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-7vchqxxkk4p7vavh9h4hijydw 192.168.137.200:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

這裡已經有詳細說明了,加入一個普通節點只需要執行

docker swarm join --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-7vchqxxkk4p7vavh9h4hijydw 192.168.137.200:2377

我們在node1執行,這裡我們通過advertise-addr指定了本機的IP

docker swarm join --advertise-addr 192.168.137.2 --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-7vchqxxkk4p7vavh9h4hijydw 192.168.137.200:2377

可以看到,我們的node1已經成功加入叢集

[root@localhost ~]# docker swarm join --advertise-addr 192.168.137.2 --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-7vchqxxkk4p7vavh9h4hijydw 192.168.137.200:2377
This node joined a swarm as a worker.

我們在管理節點執行docker node list也能看到該節點

[root@localhost ~]# docker node list
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ykiyahkjoq3q0dn2rrnqd4ery *   centos              Ready               Active              Leader              19.03.2
hr3u7u010po2w6ugtcbbil8e7     node1               Ready               Active                                  19.03.2

這個token忘記了可以在管理節點執行docker swarm join-token worker獲得

[root@localhost ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-7vchqxxkk4p7vavh9h4hijydw 192.168.137.200:2377

如果要加入一個管理節點,執行docker swarm join-token manager獲得加入管理節點的token,正式部署推薦有3個以上管理節點

[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4ggr6t9qpoipck2ksobnphhwe0kcr47idiwaezh9uu672ueokf-9e6xiw7k9krf3abc2p3jrw9yn 192.168.137.200:2377

建立私有網路

叢集內的服務是可以自由通訊的,但目前我們有一些單個容器部署在管理節點,比如mysql,redis。需要一個私有網路提供通訊。在管理節點執行

docker network create -d overlay --attachable my-net #新增attachable引數,使得單個容器也能附加到此網路

安裝Portainer皮膚

這是一個叢集的視覺化管理皮膚,在管理節點執行

docker run -d --name portainer --restart=always -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /home/data/portainer/data:/data portainer/portainer

重啟一下docker

service docker restart

瀏覽器訪問我們的管理節點:192.168.137.200:9000 首次訪問需要設定密碼
在這裡插入圖片描述
選擇Local,連線我們本地的docker叢集
在這裡插入圖片描述
進入選擇local,至此視覺化管理皮膚安裝完畢
在這裡插入圖片描述

安裝MYSQL和Redis

docker run -d --name mysql8 \
   --restart=always \
   --network my-net \
   -v /home/data/mysql8:/var/lib/mysql \
   -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=user_center \
   mysql:8.0.18 \
   --sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION \
   --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

mysql 配置

docker exec -it mysql8 bash
mysql -uroot -p123456
alter user 'root'@'%' identified with mysql_native_password by '123456'; #更改身份驗證外掛
docker run -d --name redis \
   --restart=always \
   --network my-net \
   -v /home/data/redis:/data \
   redis:5.0.6 \
   --appendonly yes

這裡我們沒有對映埠到宿主機,並加入了私有網路my-net,然後叢集內的服務可以通過
mysql8:3306 root 123456 和 redis:6379訪問到mysql和redis。現在的mysql帶有一個user_center的資料庫,如果需要建立資料庫,可以進容器執行命令。以後的教程將講到部署mysql、redis的叢集。

《PHP微服務練兵》系列索引部落格:《PHP 微服務練兵》系列教程

相關文章