基本概念
Swarm
是使用SwarmKit构建的 Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm
是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与Mesos
、Kubernetes
竞争的实力。使用 Swarm 集群之前需要了解以下几个概念。
节点
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点
。
管理节点用于Swarm
集群的管理,docker swarm
命令基本只能在管理节点执行(节点退出集群命令docker swarm leave
可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader
,leader 通过raft
协议实现。
工作节点是任务执行节点,管理节点将服务 (service
) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。来自Docker
官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
服务和任务
任务(Task)
是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器;服务(Services)
是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services
按照一定规则在各个工作节点上运行指定个数的任务。global services
每个工作节点上运行一个任务
两种模式通过docker service create
的--mode
参数指定。来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。
安装
- 下载镜像
[xiaoxin@provider1 ~]$ sudo docker pull swarm Using default tag: latest latest: Pulling from library/swarm d85c18077b82: Pull complete 1e6bb16f8cb1: Pull complete 85bac13497d7: Pull complete Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8 Status: Downloaded newer image for swarm:latest docker.io/library/swarm:latest [xiaoxin@provider1 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centoscn/centos7.4-jdk1.8 latest 55f7929b1738 41 hours ago 581MB portainer/portainer latest ff4ee4caaa23 5 weeks ago 81.6MB swarm latest ff454b4a0e84 19 months ago 12.7MB
初始化swarm
[xiaoxin@provider1 ~]$ sudo docker swarm init --advertise-addr 10.1.1.82 Swarm initialized: current node (iqoigr0asgkeyocrtz4ovjw2h) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查看集群相关信息
[xiaoxin@provider1 ~]$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION iqoigr0asgkeyocrtz4ovjw2h * provider1 Ready Active Leader 19.03.5
注意上面node ID旁边那个*号表示现在连接到这个节点上。
添加节点到swarm集群中
在docker swarm init 完了之后,会提示如何加入新机器到集群,如果当时没有注意到,也可以通过下面的命令来获知 如何加入新机器到集群。
- 添加节点一
[xiaoxin@provider1 ~]$ sudo docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/swarm/join: dial unix /var/run/docker.sock: connect: permission denied
添加节点二
[xiaoxin@bgt-service ~]$ sudo docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377 This node joined a swarm as a worker.
查看节点
[xiaoxin@provider1 ~]$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION vv85wddm5roxkc2jejjanw2bj bgt-service Ready Active 19.03.5 iqoigr0asgkeyocrtz4ovjw2h * provider1 Ready Active Leader 19.03.5
在Swarm中部署服务(这里以nginx服务为例)
Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。
- 在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式
[xiaoxin@provider1 ~]$ sudo docker network create -d overlay ngx_net hy4wcoakeb6g5lsl2h8t98d3y [xiaoxin@provider1 ~]$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE 1f783cca478d bridge bridge local 1e4dbfa4d07a docker_gwbridge bridge local b5f4a1f83be7 host host local r1leqmn62roy ingress overlay swarm hy4wcoakeb6g ngx_net overlay swarm 4915a0c88274 none null local
在manager-node节点上使用上面这个覆盖网络创建nginx服务
[xiaoxin@provider1 ~]$ sudo docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx in8lbvfc0hv386lxj2l284ey5 overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
就创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
--replicas
:参数指定服务由几个实例组成。
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。
- 查看正在运行服务的列表
[xiaoxin@provider1 ~]$ sudo docker service ls ID NAME MODE REPLICAS IMAGE PORTS in8lbvfc0hv3 my-test replicated 1/1 nginx:latest *:80->80/tcp
查询Swarm中服务的信息
--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:
[xiaoxin@provider1 ~]$ sudo docker service inspect --pretty my-test ID: in8lbvfc0hv386lxj2l284ey5 Name: my-test Service Mode: Replicated Replicas: 1 Placement: UpdateConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Update order: stop-first RollbackConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Rollback order: stop-first ContainerSpec: Image: nginx:latest@sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2 Init: false Resources: Networks: ngx_net Endpoint Mode: vip Ports: PublishedPort = 80 Protocol = tcp TargetPort = 80 PublishMode = ingress
查询到哪个节点正在运行该服务。
如下该容器被调度到node1节点上启动了
[xiaoxin@provider1 ~]$ sudo docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS hibhqr5ebg2p my-test.1 nginx:latest provider1 Running Running 2 minutes ago
注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。
有上面命令可知,该服务在node1节点上运行。登陆该节点,可以查看到nginx容器在运行中
[xiaoxin@provider1 ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 52781e5b63a8 nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp my-test.1.hibhqr5ebg2pbt6auwg2zg7nf 6dffa3ce9c79 portainer/portainer "/portainer" 3 hours ago Up 3 hours 0.0.0.0:9000->9000/tcp hungry_roentgen
在Swarm中动态扩展服务(scale)
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:
比如将上面的my-test容器动态扩展到5个,命令如下:
[xiaoxin@provider1 ~]$ sudo docker service scale my-test=5 my-test scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged [xiaoxin@provider1 ~]$ sudo docker service ps my-test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS hibhqr5ebg2p my-test.1 nginx:latest provider1 Running Running 4 minutes ago x5ueiy7cae2b my-test.2 nginx:latest bgt-service Running Running 11 seconds ago g18c9mfo4zd0 my-test.3 nginx:latest bgt-service Running Running 11 seconds ago gbnvu3s2vmgx my-test.4 nginx:latest bgt-service Running Running 11 seconds ago 80u7oqfiknat my-test.5 nginx:latest provider1 Running Running 19 seconds ago [xiaoxin@provider1 ~]$
和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器
- 停止task
[xiaoxin@provider1 ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1a872773446 nginx:latest "nginx -g 'daemon of…" 45 seconds ago Up 43 seconds 80/tcp my-test.5.80u7oqfiknat311um583lvmvh 52781e5b63a8 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 4 minutes 80/tcp my-test.1.hibhqr5ebg2pbt6auwg2zg7nf 6dffa3ce9c79 portainer/portainer "/portainer" 3 hours ago Up 3 hours 0.0.0.0:9000->9000/tcp hungry_roentgen [xiaoxin@provider1 ~]$ sudo docker stop b1a872773446 52781e5b63a8 b1a872773446 52781e5b63a8
删除容器服务
[xiaoxin@provider1 ~]$ sudo docker service rm my-test //这样就会把所有节点上的所有容器(task任务实例)全部删除了 my-test
除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
[root@manager-node ~]# docker service update --replicas 3 my-test my-test
docker service update
命令,也可用于直接 升级 镜像等。
[root@manager-node ~]# docker service update --image nginx:new my-test
- 我的QQ
- QQ扫一扫
-
- 我的头条
- 头条扫一扫
-
评论