docker中swarm技术
docker swarm技术是docker社区提供的docker的集群管理调度工具,通过api来管理多个主机上的docker,通过overlay网络来实现不同主机之间容器的通信与访问。实现容器的调度,资源的分配,以及副本。
docker swarm中几个重要概念
docker swarm提供的两种api接口
标准的api接口
提供对外的访问接口,使之能够访问和管理docker集群。
集群管理api接口
集群之间管理通信的接口
overlay(覆盖/叠加网络)
在现有的实例网络之上构建一个逻辑网络,忽略底层的硬件机制。是虚拟化技术网络的重要组成。基于二层,可轻易扩展。
微服务
通常以容器为单位,进行开发,测试,部署,扩展,微服务之间通过api接口进行访问。
提供了一种高度模块化,可扩展,可维护的软件系统,为了快速响应市场的复杂变化。
滚动更新
不停机更新软件版本
副本数
swarm会维持用户所期望的副本数量
声明服务模型
隐藏实现过程,只需要指定目标
安全策略
强制执行TLS
传输层安全
docker swarm的特性
管理工具与docker engine集成,无需额外安装
去中心化设计:在swarm中任何一个节点都能称为manager,也能降级为worker。可以在任意节点升级权限,然后使用管理命令。
声明式服务模型:定义各种所期望的服务状态
扩缩容,使用docker swarm可以非常容器的实现容器数量的扩容和缩容。
期望值:swarm会让服务运行在一个期望值
多主机网络
服务发现,内置dns服务,会自动分配dns
负载均衡,集群式部署基本功能
默认安全。强制执行TLS
滚动更新:不停机更新
docker swarm中关键概念
节点
在swarm集群中每一个docker主机都是一个节点,节点又分为管理节点和工作节点
管理节点功能
调度
编排
集群管理
默认情况下,创建swarm集群的主机就是manager的leader。
服务与任务
服务定义了在工作节点上要执行的任务,是swarm集群中调度的最小单位。
负载均衡
swarm使用负载均衡入口来公开对外提供的服务,部署服务时可以指定端口,如果未指定则会随机使用3w~32767之间的端口。外部组件可以访问任意节点,然后节点会将请求转发到正在运行所请求的任务实例的节点上。
docker swarm的使用案例
拓扑
以docker26版本为例
基础环境配置
修改主机名,设置hosts文件
hostnamectl set-hostname
192.168.10.101 manager 192.168.10.102 worker01 192.168.10.103 worker02
防火墙添加策略
tcp/2377
集群管理所使用的端口,包括服务的部署,调度,节点间协调等。
tcp-udp/7946
节点间心跳消息与发现服务,节点状态同步
tcp-udp/4789
用与overlay网络的数据传输
防火墙命令
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --reload
部署docker swarm群集
docker swarm init --advertise-addr 192.168.10.101
advertise:通告,广播 意味着该管理节点将通过该ip宣告自己的存在
之后会生成令牌,其他docker主机需通过该令牌加入到该集群。在其他docker主机复制执行即可。
查看集群信息三种方法
docker info
在信息中应该有swarm单元
Swarm: active NodeID: x3v12rmfw9c0isq1nppaaoogh Is Manager: true ClusterID: 0mps950k70s2oqphe75jzykqq Managers: 1 Nodes: 3
在管理节点上执行命令
docker node ls
-
-
带星号表示是leader节点,注意availability的三种状态。active(活跃的)
该节点可以被指派容器
pause(暂停)
该节点不能被指派新容器,但是已经存在的容器保持运行。
drain(排空)
该节点不能被指派容器,同时已有的容器会被调度到其他可用的节点上。
状态的修改办法以管理节点为例
docker node update --availability drain manager(更新后的状态,那个节点)
-
查看节点的详细信息
docker node inspect 主机名
docker swarm群集的使用
为某个节点添加标签,然后创建服务指定该节点
添加标签
docker node update --label-add group=g2 worker01
查看标签信息
docker node inspect worker01
创建服务生成容器到指定节点
docker service create --name mynginx --constraint 'node.labels.group==g2' nginx
查看mynginx所在主机
docker service ps mynginx
节点的提权与降权
提权为manager
docker node promote worker01 worker02
降权为worker节点
docker node demote worker01 worker02
节点的退出
管理节点
docker swarm leave
如果管理节点所在群集还有其他节点,则需要加上--force
工作节点
docker swarm leave
那个节点要退出,在那个节点上执行该命令
加入
利用管理节点的token重新加入
管理节点退出后再次加入需要重新生成token,再让其他节点加入。
注意事项
swarm集群解散后,其管理的service也会被删除掉
docker swarm的服务管理
创建服务
docker service create -p 80:80 --replicas 2 --name web nginx
-p 端口映射
--replicas 指定服务副本数,根据服务器性能和需要酌情创建。
--name 服务名称
nginx 镜像(可在线拉取,可使用本地)
在创建服务时需要从网上拉取镜像,需要校验序列,因此本地拉取镜像不可取
查看服务的日志
docker service logs -f web
-f 指定服务名称
退出ctrl+c
想要拉取本地镜像的办法
首先确保容器所在节点都有新版本的镜像
然后为镜像打标签
docker tag myimage:tag myimage:local
在创建时使用修改后的镜像名称加标签
docker service create --name myservice \ --replicas 3 \ myimage:local
创建服务时任务的状态
Accepted (accepted)
这是任务初始状态,表示任务已经被接受,但尚未被调度到节点上执行。
Pending (pending)
表示任务已被调度到某个节点上,但尚未启动。此状态可能出现在等待资源分配、等待容器启动等情况下。
Assigned (assigned)
任务已经被分配到一个具体的节点上,但尚未开始准备。
Preparing (preparing)
任务正在被准备中,即 Docker 正在做启动容器前的准备工作,比如拉取镜像、配置网络等。
Ready (ready)
任务准备就绪,即将启动。
Starting (starting)
容器正在启动过程中。
Running (running)
容器已经启动并正在运行。
Complete (complete)
任务已完成。对于一次性任务,这意味着任务已经成功完成;对于服务中的任务,则表示任务被终止,但可以被替换。
Shutdown (shutdown)
任务已经被停止或关闭。这可能是由于服务更新、故障恢复或其他原因导致的。
Failed (failed)
任务失败。这可能是由于容器退出状态非零、健康检查失败等原因造成的。
Rejected (rejected)
任务被拒绝。这通常是由于资源不足或节点不可用等原因导致的。
Orphaned (orphaned)
任务与服务失去联系,通常发生在服务被删除而任务仍在运行的情况下。
Updating (updating)
任务正在进行更新操作,如滚动更新服务。
Reverting (reverting)
任务正在回滚到先前的状态,通常是在更新失败后发生的。
查看服务
所有服务
docker service ls
指定服务
docker service ps 服务名
显示服务详细信息
docker service inspect 服务名
以json语言格式显示
docker service inspect --pretty 服务名
以人性化的方式显示服务的详细信息
服务的扩缩容
docker service scale 服务名=数量
扩容数量调大
缩容数量调小
删除服务
docker service rm 服务名
滚动更新
先创建测试服务
docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
注意版本
--update-delay是--update-config的一个参数,常见的参数如下
docker service update \ redis \ --image redis:3.0.7 \ --update-config \ Parallelism=2 \ Delay=10s
parallelism
同时更新的容器数
执行滚动更新
docker service update --image 新版本 服务名
滚动更新拉取本地镜像的办法
在更新时指定本地镜像标签
docker service update --image mynginx:local 服务名称
加入overlay网络
创建overlay网络
docker network create --driver overlay 网络名称
创建服务时加入到该网络
docker service create --replicas 3 --network 网络名称 --name myweb nginx
如果有其他容器也使用该网络那么就能与同一个网络之中的其他容器通信。
docker run --dit --name pc02 --net=服务器名称 ccentos:7
数据卷的创建与应用
创建数据卷
docker volume create product-kgc
创建容器来连接数据卷
docker service create --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html --replicas 1 --name kgc-web-01 nginx
注意写法 src时宿主机的卷,dst是容器内的卷
--mount type=的几种类型
volume,挂载位于/var/lib/docker/volumes中的卷,是通过docker命令创建的卷
bind:挂载宿主机目录到容器,一般用于共享存储
tmps:只存在于内存的临时文件系统,读写速度快,但不会永久保存数据。
需要注意,一个--mount只能选择一个路径,使用多个--mount来挂载多个路径,包括文件的映射。宿主机上的目录挂载到容器内会覆盖同名的目录!!!
因为容器是运行时的程序所在,因此文件的修改大多需要重启容器,或者触发再次加载文件的动作。
多次挂载的命令格式
docker service create \ --name kgc-web-01 \ --replicas 1 \ --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html \ --mount type=volume,src=config-volume,dst=/etc/nginx \ nginx
宿主机挂载到容器内的目录会覆盖原有的同名目录
只读挂载:如果您希望保留容器内的文件,并且只是想读取宿主机目录的内容,可以使用 readonly 参数来挂载为只读模式。
docker run --name some-nginx --mount type=bind,src=/path/to/host/directory,dst=/usr/share/nginx/html,readonly nginx
映射文件的办法
通过创建符号链接
docker exec -it kgc-web-01 sh -c 'ln -sf /etc/nginx/nginx.conf /etc/nginx/nginx.conf'
需要使用-sf强制覆盖所有的链接
确保容器内的用户有权限访问这些文件和目录
在进行文件挂载的时候要确保文件提前存在
在使用bind时,可以利用nfs,glusterfs来创建共享存储。
然后去创建相关文件进行验证