Docker Swarm 集群搭建
@[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 微服务练兵》系列教程
本作品采用《CC 协议》,转载必须注明作者和本文链接