Swarm介绍
Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。
Docker Engine CLI和API包括了管理Swarm节点命令,比如添加,删除节点,以及在Swarm中部署和编排服务。也增加了服务栈(Stack),服务(Service),任务(Task)概念。
swarm特点
1.Docker Engine集成集群管理
使用Docker Engine CLI 创建一个Docker Engine的Swarm模式,在集群中部署应用程序服务
2.去中心化设计
Swarm角色分为Manager和Worker节点,Manager节点故障不影响应用使用。
3.扩容缩容
4.期望状态协调
Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。
5.多主机网络
可以为服务指定overlay网络。但初始化或更新应用程序时,Swarm manager会自动为overlay网络上的容器分配IP地址。
6.服务发现
Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。
7.负载均衡
实现服务副本负载均衡,提供入口访问。
8.安全传输
Swarm中的每个节点使用TLS相互验证和加密,确保安全的其他节点通信
9.滚动更新
升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到向前版本。
集群部署
环境部署要求
使用swarm前提
Docker版本1.12+
集群节点之间保证TCP 2377 (集群管理),TCP/UDP 7946 (容器网络发现)和UDP 4789 (Overlay网络)端口通信
节点规划
1.#系统环境
2.[root@docker-client ~]# cat /etc/redhat-release
3.CentOS Linux release 7.5.1804 (Core)
4.[root@docker-client ~]# uname -r
5.3.10.0-862.3.3.el7.x86_64
主机名 | IP地址 | 用途 |
---|---|---|
Manager | 192.168.200.113 | swarm管理节点 |
Worker01 | 192.168.200.114 | swarm工作节点 |
Worker02 | 192.168.200.115 | swarm工作节点 |
三台客户端全都安装Docker-ce
安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
添加docker的CE版本的yum源配置文件
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
ll /etc/yum.repos.d/docker-ce.repo
安装CE版本的docker
yum -y install docker-ce
systemctl start docker #启动docker
systemctl enable docker #添加开机启动
docker version #查看docker版本
添加docker国内镜像源
在开始学习docker之前,我们首先要更改一下docker的默认源镜像下载地址(默认是从国外下载,很慢),我们需要添加国内的源地址
vim /etc/docker/daemon.json
cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
systemctl daemon-reload
systemctl restart docker
三台都装这几个镜像
docker pull centos
docker pull Nginx
docker pull Nginx:1.15
docker pull Nginx:1.14
docker pull Nginx:1.13
docker pull Nginx:1.12
docker images
DockerSwarm集群初始化与工作节点成员添加
初始化docker swarm管理节点
在Manager端进行如下操作
docker swarm init --advertise-addr 192.168.200.113
Swarm initialized: current node (sdib4e7xtr487nacdd12uc08h) is Now a manager. #集群初始化:当前节点是一个管理节点
To add a worker to this swarm, run the following command: #若要向该集群添加工作节点,请运行以下命令:
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377 #docker swarm添加集群工作节点的命令字符串
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在work01上
在两个工作节点进行如下操作
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377
在work02上
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377
在Manager上查看所有节点成员信息
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
njawag7xglmaziwf8o3rg4nbu * manager Ready Active leader 18.09.1
0u5cb5jt9n1n31bq7uhbzrcj1 worker01 Ready Active 18.09.1
73h26e9b9ngwxmwtj0lc5r7jb worker02 Ready Active 18.09.1
集群服务管理
docker swarm集群管理需要所有集群节点进行时间同步
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --->时区亚洲
date +%F-%H-%M-%s --->查看时间
查看docker service帮助信息
docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service #创建一个新服务
inspect display detailed information on one or more services #查看服务详细信息
logs Fetch the logs of a service or task #查看服务的日志
ls List services #查看服务列表
ps List the tasks of one or more services #查看服务的任务情况
rm Remove one or more services #删除一个服务
rollback Revert changes to a services configuration #服务配置回滚
scale Scale one or multiple replicated services #调整服务副本数
update Update a service #更新一个服务的副本资源
集群服务的创建,查看与资源调整
在Manager节点上启动服务
docker service create --replicas 2 --name test centos ping www.baidu.com
命令说明
--replicas 2 :启动两个服务的副本容器
--name test :服务的名字叫做test
centos:启动的镜像的名字(本地没有会自动下载)
ping www.baidu.com :副本里最后启动的命令进程
查看服务的种类列表
docker service ls
查看test服务的副本任务情况
docker service ps test
查看test服务的详细信息--pretty test易读的方式显示
docker service inspect --pretty test
扩展服务实例数
docker service scale test=3
查看服务列表
docker service ls
查看具体服务副本信息
docker service ps test
对服务的副本进行资源限制
docker service inspect --pretty test
docker service update --limit-cpu=0.5 test
docker service update --limit-memory 500M test
查看test服务详细信息
docker service inspect --pretty test
查看服务的副本运行状态
docker service ps test
从上边我们发现服务的副本运行有停止的,我们可以通过过滤器,只查看运行状态的副本容器
docker service ps -f 'desired-state=running' test
集群副本的更新与回滚
创建Nginx-test服务,并启动三个副本
查看Nginx-test服务的副本运行情况
docker service ps Nginx-test
docker service ls
将服务Nginx-test的副本镜像更新成Nginx:1.12版
查看服务列表
docker service ls
查看服务的副本运行信息
docker service ps Nginx-test
将Nginx-test的副本更新回滚到上一次
docker service update --rollback Nginx-test
查看服务列表
docker service ls
查看Nginx-test服务的
docker service ps Nginx-test
集群副本的更新策略与回滚策略
创建服务时设定副本的更新及回滚策略
docker service create --name my_web --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 Nginx:1.12
命令说明
docker service create \
--name my_web \ #服务的名字
--replicas 10 \ #一共启动10个服务副本
--update-delay 10s \ #更新时10s间隔
--update-parallelism 2 \ #更新时一次性更新两个任务
--update-failure-action continue \ #更新失败时继续更新下一个
--rollback-parallelism 2 \ #回滚时一次性更新两个任务
--rollback-monitor 20s \ #回滚监控20s
--rollback-max-failure-ratio .2 \ #回滚失败率20%
Nginx:1.12
查看服务列表及副本运行状况
docker service ls
docker service ps my_web
将服务my_web的副本镜像更新到Nginx:1.13版
docker service ls
docker service update --image Nginx:1.13 my_web
docker service ls
将服务my_web的副本更新回滚到上一个版本
docker service ls
docker service update --rollback my_web
docker service ls
集群服务的删除
删除集群服务my_web
docker service ls
docker service rm my_web
docker ps -a
查看work01容器进程
docker ps -a
查看work02容器进程
docker ps -a
集群数据管理(数据持久化)
以volume卷挂载容器的方式启动swarm集群
docker service create --mount type=volume,src=Nginx-vol,dst=/usr/share/Nginx/html --replicas 3 --name test01 Nginx
docker volume ls
local Nginx-vol #数据卷有了
docker service ls
ll -d /var/lib/docker/volumes/Nginx-vol
以bind挂载容器的方式启动swarm集群
在三台机器上都创建目录/app/www
mkdir -p /app/www --->三台都需要创建目录
集群方式启动bind挂载容器
docker service create --mount type=bind,src=/app/www,dst=/usr/share/Nginx/html --replicas 3 --name test02 Nginx
docker service ls
docker service ps test02
手动填写内容,并非交互查看容器的网页目录
echo "xin" > /app/www/xin
docker ps -a
docker exec c28 ls /usr/share/Nginx/html
以NFS挂载容器的方式启动swarm集群
三台机器上都安装NFS(work02作为服务端)
yum -y install nfs-utils --->三台都需要安装
mkdir -p /data/ --->work02上创建
echo "welcome to yunjisuan" > /data/index.html --->work02创建网页文件
在work02上修改nfs配置文件
vim /etc/exports
/data 192.168.200.0/24(rw,no_root_squash)
cat /etc/exports
systemctl start nfs
netstat -antup | grep rpcbind
showmount -e localhost
在Manager上测试连接NFS
showmount -e 192.168.200.115
删除之前创建的容器
docker service ls
docker service rm test01
docker service rm test02
以NFS挂载容器的方式启动swarm集群
docker volume ls
docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/Nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"' --name test01 Nginx
特别提示:给用一个没有创建过的卷(web-vol),要不会失败
docker service ps test01
docker volume ls
df -hT | grep data
查看之前添加的网页文件
docker ps
docker exec 030 ls /usr/share/Nginx/html
docker exec 030 cat /usr/share/Nginx/html/index.html
将集群服务test01的node节点扩充到3个
docker service ps test01
docker service scale test01=3
docker service ps test01
特别提示
以自动挂载NFS共享存储的方式启动swarm集群容器,type类型只能是volume,卷的名字需要在启动时创建(启动前没有这个卷),因此创建volume的同时进行nfs共享挂载的话,需要同时创建一个opts.json的支持文件
ls /var/lib/docker/volumes/web-vol/
_data opts.json #就是这个文件
ls /var/lib/docker/volumes/Nginx-vol/
_data #而之前创建好的volume卷没有这个文件
集群服务发布
在之前我们所启动的所有容器,如果想要访问,那么只能通过docker exec进去看。并不能如同生产环境中一下,让用户从外部访问,那么swarm的集群服务,如果发布能让用户从外部访问的容器呢?
启动swarm集群并暴露宿主机88端口
docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/Nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"' --name test01 -p 88:80 --replicas 3 Nginx
查看swarm集群启动情况
ss -antup | grep 88
docker service ls
进行访问测试
curl 192.168.200.113:88
curl 192.168.200.114:88
curl 192.168.200.115:88
集群统一配置管理
创建一个自定义的Nginx.conf
vim Nginx.conf
cat Nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root /usr/share/Nginx/html;
index index.html index.htm;
}
}
}
将配置文件加入docker config管理
docker config ls
docker config create Nginx.conf Nginx.conf
docker config ls
启动集群并应用集群配置管理保存的配置文件
docker service create --name Nginx --replicas 3 --config source=Nginx.conf,target=/etc/Nginx/Nginx.conf -p 8080:80 Nginx
查看集群节点容器的配置文件应用情况
docker service ls
docker ps
清理服务后再次进行测试。
docker service ls
docker service rm Nginx
创建一个首页文件
vim index.html
cat index.html
docker config create index.html index.html
docker config ls
将docker config管理的Nginx.conf和index.html都应用进集群容器
docker service create --name Nginx --replicas 3 --config source=Nginx.conf,target=/etc/Nginx/Nginx.conf --config source=index.html,target=/usr/share/Nginx/html/index.html -p 8080:80 Nginx
curl 192.168.200.113:8080
curl 192.168.200.114:8080
curl 192.168.200.115:8080
清除配置管理
docker config ls
docker config rm index.html
Docker容器自动化方向最终架构图示详解
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。