技术交流QQ群:①185473046   ②190706903   ③203744115   网站地图
登录

下次自动登录
现在的位置: 首页Docker>正文
Docker swarm容器集群使用教程
2021年10月28日 Docker 暂无评论 ⁄ 被围观 648次+

本教程中用到的配置文件请参考下面的连接

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容器集群使用教程完成。

     

  系统运维技术交流QQ群:①185473046 系统运维技术交流□Ⅰ ②190706903 系统运维技术交流™Ⅱ ③203744115 系统运维技术交流™Ⅲ

给我留言

您必须 [ 登录 ] 才能发表留言!



Copyright© 2011-2021 系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接