本教程中用到的配置文件请参考下面的连接
CentOS 7.x 安装Docker-ce社区版本
https://www.osyunwei.com/archives/11592.html
搭建docker本地私有镜像仓库
https://www.osyunwei.com/archives/11928.html
CentOS 7.x安装部署NFS文件共享服务器
https://www.osyunwei.com/archives/11942.html
一、Dcoker、Docker-Compose、Docker Swarm、Docker services、Docker stack简介
1、Dcoker
Docker是一个容器引擎,容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础
2、Docker-Compose
Docker-Compose是一个编排多容器分布式部署的工具,Docker中有很多容器需要启动,如果一个一个的启动效率低下,Docker-Compose只需要编写一个yaml文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,Docker-Compose可以在单机上构建一组任务,也可以在集群内运行
3、Docker Swarm
Docker Swarm是一款用来管理多台主机上的Docker容器的工具,可以启动容器,监控容器状态,启动新容器等服务,提供服务之间的负载均衡,Docker Swarm和K8s比较类似,但更加轻量,功能比kubernetes更少
4、Docker services
Docker services只能部署单个服务,创建单容器,单容器是指一条命令只能操作一个容器,但是这条命令可以在Docker Swarm集群的每个节点上生效
5、Docker stack
Docker stack就是基于Docker-Compose可以创建、操作多个容器,Docker-Compose可以在集群的每个节点上生效,Docker stack可以同时操作多个Docker services,docker-compose是在单机环境提供多容器编排工具,结合docker stack则实现了多主机容器编排服务
从Docker 1.12版本开始,swarm就集成到Docker中了,docker安装完成后默认就已经可以使用swarm了,swarm由docker官方开发并提供原生支持。
docker提供了服务容器化支持,而swarm则是进一步提供了管理整体服务容器能力的一套工具集,将以前单个独立的容器服务们进行了一个统一协调管理。
二、搭建docker-swarm集群环境
1、服务器准备
#准备一台管理master节点、两台工作node节点,总共三台服务器
#docker-swarm集群建议放在内网环境中
操作系统版本:CentOS 7.9.2009 x86_64
master01主机:
ip地址:192.168.21.8
主机名称:master01.k8s
node01节点
ip地址:192.168.21.9
主机名称:node01.k8s
node02节点
ip地址:192.168.21.10
上面三台服务器都安装好docker环境
2、端口设置(测试环境建议关闭防火墙)
集群内所有服务器保证以下端口开放
TCP 2377 #集群管理端口
TCP/UDP 7946 #节点通讯端口
UDP 4789 #overlay网络通讯端口
TCP 2375 #docker服务监听/远程管理端口
TCP 2376 #TLS加密端口
#默认情况下docker-swarm集群的管理节点也是工作节点,也可以运行任务,工作节点也能升级为管理节点
#在docker-swarm集群环境中,我们不可能每一次操作都登录到集群内的每一台服务器去执行命令
#这个时候就需要Docker开启Remote API远程访问(需要开放TCP 2375或TCP 2376端口),我们只需要在一台服务器上就能远程操作集群内的所有服务器
Docker开启Remote API访问2375端口
cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service-bak
vi /usr/lib/systemd/system/docker.service
#ExecStart后添加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
:wq! #保存退出
说明:
-H tcp://0.0.0.0:2375 表示监听本服务器所有ip地址的2375端口(服务器可能有内外和外网等多个ip地址,0.0.0.0代表所有本机ip地址)
-H tcp://192.168.21.10:2375 表示监听本服务器ip地址192.168.21.10的2375端口(192.168.21.10是本服务器自己的ip地址)
-H tcp://0.0.0.0:2375 不是设置可以远程访问的ip地址,是设置本服务器的ip地址,如果设置非本服务器配置的ip地址docker无法启动
systemctl daemon-reload #刷新配置
service docker restart #重启
#查看端口是否已经监听成功
netstat -nlp |grep 2375
[root@system]# netstat -nlp |grep 2375
tcp6 0 0 :::2375 :::* LISTEN 22590/dockerd
#测试Remote API访问2375端口
docker -H tcp://192.168.21.10:2375 images
#可以查看到images镜像列表
[root@system]# docker -H tcp://192.168.21.10:2375 images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.20.1 01dbf760f0dc 5 days ago 1.22GB
php-fpm 8.0.11 597d18ebb61d 7 days ago 2.66GB
mysql v8.0.26 b4d1dc08fa3f 7 days ago 548MB
centos 7.9.2009 8652b9f0cb4c 11 months ago 204MB
#强烈建议在外部防火墙设置只有指定的ip地址才能访问集群内所有服务器的2375端口
#如果不开启Remote API远程访问,以上配置可以不用设置,TCP 2375或TCP 2376端口可以关闭,整个docker-swarm集群不受任何影响,只是维护docker镜像等操作需要登录到每一台服务器去执行命令
3、在管理master节点机器上创建docker swarm集群
#在管理master节点执行以下命令docker swarm init --advertise-addr 192.168.21.8
#--advertise-addr将该ip地址的机器设置为swarm集群中所有管理master节点中的管理节点,我们只有一台管理master节点,可以不设置
[root@master01 ~]# docker swarm init --advertise-addr 192.168.21.8
Swarm initialized: current node (xqacvdif9r6p3o19kl0lxi1gc) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2chs2ueu0e8dd5j1sqwpt3j5wk0dtpj7niv7axrouxcv6w7745-21hljorln725s194bjha1y0gj 192.168.21.8:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
docker info | grep swarm #查看集群的相关信息
4、向docker swarm中添加工作node节点,在两个工作节点中分别执行如下命令
docker swarm join --token SWMTKN-1-2chs2ueu0e8dd5j1sqwpt3j5wk0dtpj7niv7axrouxcv6w7745-21hljorln725s194bjha1y0gj 192.168.21.8:2377
[root@node01 ~]# docker swarm join --token SWMTKN-1-2chs2ueu0e8dd5j1sqwpt3j5wk0dtpj7niv7axrouxcv6w7745-21hljorln725s194bjha1y0gj 192.168.21.8:2377
This node joined a swarm as a worker.
docker swarm join-token worker #查看向集群中添加工作节点的token
docker swarm join-token manager #查看向集群中添加管理节点的token
docker node ls #查看节点
[root@master01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xqacvdif9r6p3o19kl0lxi1gc * master01.k8s Ready Active Leader 19.03.9
t39hrd1k2vqq6u5ymoy9k1oey node01.k8s Ready Active 19.03.9
mno6pgz2suix086sr0ktz2flx node02.k8s Ready Active 19.03.9
docker node rm #移除节点命令
docker swarm leave #退出节点,在对应节点上执行
三、在swarm集群使用service创建管理容器
1、在管理master节点部署服务
1.1创建集群环境下的网络
docker network ls #查看集群环境下的网络列表
[root@master01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2832bf02a52f bridge bridge local
d3fd75136c85 docker_gwbridge bridge local
41e43a56f471 host host local
al21wvzzw9wi ingress overlay swarm
44494548b456 none null local
1.2创建docker服务通信的集群overlay网络
docker network create --driver overlay --subnet=192.168.1.0/24 --gateway=192.168.1.1 mycust-overlay
docker network inspect mycust-overlay #查看网络
docker network rm mycust-overlay #删除网络命令
--opt encrypted #加密通信,加密技术会带来不可忽视的性能损失,因此应该在生产中使用该选项之前对其进行测试。
--attachable #创建可由集群服务或独立容器用于在其他docker或其他独立容器相互通信的overlay
1.3使用service创建管理容器
#创建容器的时候,镜像标签要和下载镜像一致,docker service create默认先从网络下载镜像
#使用docker swarm集群强烈建议部署本地私有镜像仓库,提前下载好容器镜像,在所有节点执行
docker pull hub.osyunwei.com/nginx:1.20.1 #nginx容器镜像
docker pull hub.osyunwei.com/mysql:v8.0.26 #mysql容器镜像
docker pull hub.osyunwei.com/php-fpm:8.0.11 #php-fpm容器镜像
#我们创建3个容器
#多容器互联情况下,一定要根据自己的配置,调整好容器启动的先后顺序,比如在php-fpm容器未启动的情况下先启动nginx容器,nginx启动参数挂载的配置信息文件里面连接的是php-fpm容器,那么nginx容器是无法正常启动的。
#创建mysql容器
docker service create --replicas 1 --network mycust-overlay --name mysql -p 3306:3306 --mount type=bind,source=/docker/data/mysql/database,destination=/var/lib/mysql --mount type=bind,source=/docker/data/mysql/etc/mysql/my.cnf,destination=/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 hub.osyunwei.com/mysql:v8.0.26 --character-set-server=utf8 --collation-server=utf8_general_ci
#创建php容器
docker service create --replicas 1 --network mycust-overlay --name php --mount type=bind,source=/docker/data/web,destination=/data/web --mount type=bind,source=/docker/data/php/etc,destination=/usr/local/php/etc hub.osyunwei.com/php-fpm:8.0.11
#创建nginx容器
docker service create --replicas 3 --network mycust-overlay --name nginx -p 80:80 --mount type=bind,source=/docker/data/web,destination=/data/web --mount type=bind,source=/docker/data/nginx/conf/vhost,destination=/usr/local/nginx/conf/vhost --mount type=bind,source=/docker/data/nginx/conf/ssl,destination=/usr/local/nginx/conf/ssl --mount type=bind,source=/docker/data/nginx/conf/nginx.conf,destination=/usr/local/nginx/conf/nginx.conf hub.osyunwei.com/nginx:1.20.1
注意:
在有权限验证的docker私有Docker仓库,先要登录到私有仓库,使用docker service创建容器还需要指定--with-registry-auth参数,否则无法创建容器
示例:
docker login registry.example.com
docker service create \
--with-registry-auth \
--name my_service \
registry.example.com/acme/my_image:latest
#创建php容器
1、所有服务器先登录私有仓库
docker login hub.osyunwei.com
2、管理master节点创建容器,加上参数--with-registry-auth
docker service create --with-registry-auth --replicas 3 --network mycust-overlay --name mysql -p 3306:3306 --mount type=bind,source=/docker/data/mysql/database,destination=/var/lib/mysql --mount type=bind,source=/docker/data/mysql/etc/mysql/my.cnf,destination=/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 hub.osyunwei.com/mysql:v8.0.26 --character-set-server=utf8 --collation-server=utf8_general_ci
docker service create --with-registry-auth --replicas 1 --network mycust-overlay --name php --mount type=bind,source=/docker/data/web,destination=/data/web --mount type=bind,source=/docker/data/php/etc,destination=/usr/local/php/etc hub.osyunwei.com/php-fpm:8.0.11
docker service create --with-registry-auth --replicas 3 --network mycust-overlay --name nginx -p 80:80 --mount type=bind,source=/docker/data/web,destination=/data/web --mount type=bind,source=/docker/data/nginx/conf/vhost,destination=/usr/local/nginx/conf/vhost --mount type=bind,source=/docker/data/nginx/conf/ssl,destination=/usr/local/nginx/conf/ssl --mount type=bind,source=/docker/data/nginx/conf/nginx.conf,destination=/usr/local/nginx/conf/nginx.conf hub.osyunwei.com/nginx:1.20.1
#查看swarm集群中的服务
#查看swarm集群中的服务
docker service ls
#查看容器在哪一个节点运行
docker service ps nginx
#重启服务
docker service update --force nginx
#删除服务命令
docker service rm nginx
四、在swarm集群使用docker stack deploy创建管理容器
我们使用docker-compose来部署,docker-compose是在单机环境提供多容器编排工具,结合docker stack可以实现集群内部署
#创建docker-compose.yaml文件
mkdir -p /docker/data/docker-compose/conf
vi /docker/data/docker-compose/conf/dockerstack.yaml
version: '3'
services:
#容器名称
mysql:
image: hub.osyunwei.com/mysql:v8.0.26
networks:
- mycust-overlay
volumes:
- /docker/data/mysql/database:/var/lib/mysql
- /docker/data/mysql/etc/mysql/my.cnf:/etc/mysql/my.cnf
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
- MYSQL_ROOT_PASSWORD=123456
restart: always
deploy:
replicas: 1
#设置优先启动mysql
depends_on:
- mysql
#容器名称
php:
image: hub.osyunwei.com/php-fpm:8.0.11
networks:
- mycust-overlay
volumes:
- /docker/data/web:/data/web
- /docker/data/php/etc:/usr/local/php/etc
restart: always
deploy:
replicas: 3
#容器名称
nginx:
#容器所使用的镜像名称
image: hub.osyunwei.com/nginx:1.20.1
networks:
- mycust-overlay
#设置端口映射(宿主机端口:容器内端口)
ports:
- 80:80
volumes:
- /docker/data/web:/data/web
- /docker/data/nginx/conf/ssl:/usr/local/nginx/conf/ssl
- /docker/data/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
- /docker/data/nginx/conf/vhost:/usr/local/nginx/conf/vhost.conf
- /docker/data/nginx/conf/vhost:/usr/local/nginx/conf/vhost
restart: always
deploy:
replicas: 3
networks:
mycust-overlay:
external: true
:wq! #保存退出
#yaml文件格式有前后缩进和空格,一定要注意
#部署服务
#需要认证的私有仓库必须加 --with-registry-auth 才能下载镜像,部署成功
cd /docker/data/docker-compose/conf
#执行部署命令
docker stack deploy -c dockerstack.yaml --with-registry-auth wordpress
#查看服务列表
docker stack ls
[root@master01 conf]# docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 3 Swarm
#查看服务信息
docker stack ps wordpress
[root@master01 conf]# docker stack ps wordpress
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
na20pkrga33a wordpress_mysql.1 hub.osyunwei.com/mysql:v8.0.26 node02.k8s Running Running 7 minutes ago
oxkc2zywg4qo wordpress_nginx.1 hub.osyunwei.com/nginx:1.20.1 master01.k8s Running Running 7 minutes ago
r7teub05w7hp wordpress_php.1 hub.osyunwei.com/php-fpm:8.0.11 master01.k8s Running Running 7 minutes ago
10fw3wonv99n wordpress_nginx.2 hub.osyunwei.com/nginx:1.20.1 node02.k8s Running Running 7 minutes ago
bu6alvtv67pz wordpress_php.2 hub.osyunwei.com/php-fpm:8.0.11 node01.k8s Running Running 7 minutes ago
gl0h9po103eq wordpress_nginx.3 hub.osyunwei.com/nginx:1.20.1 node01.k8s Running Running 7 minutes ago
dd3uedaedbgt wordpress_php.3 hub.osyunwei.com/php-fpm:8.0.11 node02.k8s Running Running 7 minutes ago
#移除服务命令
docker stack down wordpress
扩展阅读:
Docker Swarm 集群节点管理常用操作
默认情况下,管理节点也作为工作节点,一个manager节点也能同时成为worker节点,建议禁止管理节点接收任务,管理节点只进行命令发布执行,负责管理整个集群,不参与工作任务。
#设置管理节点不接受工作任务
docker node update --availability drain master01.k8s
#查看集群信息
docker node ls
[root@master01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xqacvdif9r6p3o19kl0lxi1gc * master01.k8s Ready Active Leader 19.03.9
t39hrd1k2vqq6u5ymoy9k1oey node01.k8s Ready Active 19.03.9
mno6pgz2suix086sr0ktz2flx node02.k8s Ready Active 19.03.9
AVAILABILITY 的三种状态:
Active:调度器能够安排任务到该节点
Pause:调度器不能够安排任务到该节点,但是已经存在的任务会继续运行
Drain:调度器不能够安排任务到该节点,而且会停止已存在的任务,并将这些任务分配到其他 Active 状态的节点
MANAGER STATUS 的三种状态
Leader:为群体做出所有群管理和编排决策的主要管理者节点
Reachable:如果 Leader 节点变为不可用,该节点有资格被选举为新的 Leader
Unavailable:该节点不能和其他 Manager 节点产生任何联系,这种情况下,应该添加一个新的 Manager 节点到集群,或者将一个 Worker 节点提升为 Manager 节点
检查单个节点
docker node inspect node02.k8s --pretty
[root@master01 ~]# docker node inspect node02.k8s --pretty
ID: mno6pgz2suix086sr0ktz2flx
Hostname: node02.k8s
Joined at: 2021-10-23 04:31:39.533388698 +0000 utc
Status:
State: Ready
Availability: Active
Address: 192.168.21.10
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 2
Memory: 3.812GiB
Plugins:
Log: awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
Network: bridge, host, ipvlan, macvlan, null, overlay
Volume: local
Engine Version: 19.03.9
TLS Info:
TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBazCCARCgAwIBAgIUCt1EQisSLRZy5HlwXLzKuREOfx4wCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjExMDIyMTI0MjAwWhcNNDExMDE3MTI0
MjAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABAvJZh3fuOTdIEfS1YfVXfZWtWf+uJRqgOseE3gokVrPvzJez19VCQWI0MJ3
9Qf8yT964Z4kIFvH1JnQLpCh+DmjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBTmXb9dh+RQY0tlizzSUlbV4+E00DAKBggqhkjO
PQQDAgNJADBGAiEA5aA7mwHKHsZhaGQ2MOHYRW6un/gd9pH/WkbE8VBQgyICIQDi
b2tImJMQToibinUs+cPtrChWu0fVWVJhFOFVXLUGHQ==
-----END CERTIFICATE-----
Issuer Subject: MBMxETAPBgNVBAMTCHN3YXJtLWNh
Issuer Public Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC8lmHd+45N0gR9LVh9Vd9la1Z/64lGqA6x4TeCiRWs+/Ml7PX1UJBYjQwnf1B/zJP3rhniQgW8fUmdAukKH4OQ==
至此,Docker swarm容器集群使用教程完成。