前言
在前面的文章中,已经介绍如何在本地通过Docker Machine
创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的。这一节,我们将继续学习 Docker 三剑客之一 : Docker Swarm
Docker Swarm
Docker Swarm 是Docker 的本地聚集类,它将一组Docker 主机转换为一个虚拟单独的 Docker 主机。Docker Swarm 使用标准的Docker API。所以与Docker 守护进程交互的工具都可以使用 Swarm 对多个主机进行转换扩展。 包括有:
- Docker Componse
- Docker Machine
- Dokku
Docker Swarm 支持即插即用原则,随着初始开发的结束,API 开发起来支持可插后端。 这意味着您可以交换调度后端 Docker Swarm 使用的开箱即用与后端您喜欢。 Swarm 的可切换设计为大多数用例提供了一个平滑的开箱体验。
安装 Docker Swarm
我们可以通过官方Docker Swarm 的镜像来创建一个集群,因为Docker Swarm 其实也是一个 Docker images
docker run swarm --help
$ docker run swarm --help
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
d85c18077b82: Pull complete 1e6bb16f8cb1: Pull complete 85bac13497d7: Pull complete Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8
Status: Downloaded newer image for swarm:latest
Usage: swarm [OPTIONS] COMMAND [arg...]
A Docker-native clustering system
Version: 1.2.9 (527a849)
Options:
--debug debug mode [$DEBUG]
--log-level, -l "info" Log level (options: debug, info, warn, error, fatal, panic)
--experimental enable experimental features
--help, -h show help
--version, -v print the version
Commands:
create, c Create a cluster
list, l List nodes in a cluster
manage, m Manage a docker cluster
join, j Join a docker cluster
help Shows a list of commands or help for one command
Run 'swarm COMMAND --help' for more information on a command.
因为是第一次使用镜像,所以Docker Engine 会检查当前环境是否有这个镜像,没有则拉取了最新的版本到本地。
使用Docker Swarm 镜像的好处
相比于其他方法,使用Swarm 镜像的好处在于
- 不需要额外再系统上安装任何二进制执行文件来使用 Swarm
- 可以通过docker engine 获取到最新版本
- 容器与Swarm 环境隔离。不需要单独维护
创建具有交互式容器的集群
集群,需要创建一个管理节点和工作节点。这里测试创建一个管理节点,在管理节点加入两个工作节点,这就组成一集群。
创建管理节点
docker-machine ls
查看现有虚拟主机
$ docker-machine.exe ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.102:2376 v19.03.5
发现已经有一个虚拟主机在运行,其实可以将这个主机作为管理主机
通过 SSH 连接管理节点,在第一个虚拟机 创建管理节点
docker-machine ssh default
连接虚拟主机,开启Swarm
docker@default:~$ docker swarm init --advertise-addr 192.168.99.102
Swarm initialized: current node (5mohlisxbrkogfbtzk6nujkfw) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
docker swarm init --advertise-addr 192.168.99.102
这里需要指定一个地址,因为虚拟机,通过ip address
可发现这个虚拟机有多个网卡,所以,我们需要指定一个地址。
创建主节点后,可以获取到一个 Token 这个token 呢 就是我们需要创建 服务节点所需要用到的。
docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
执行 docker info
后我们可以发现,当前Swarm 已经是活动的状态,管理节点 1
Swarm: active
NodeID: rzu7l3z4mysplwgdce8vj2364
Is Manager: true
ClusterID: uuq50bc4x4bckqfglkrj05vao
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
docker node ls
可以查看当前节点信息
docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5
创建工作节点
docker-machine create work1
创建一个默认的VirtualBox VM 的虚拟主机。
docker-machine ssh work1
连接虚拟主机后,将本节点加入管理节点
docker@work1:~$ docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
This node joined a swarm as a worker.
同样的,再创建一个work2 节点,加入到default 当中。
管理节点信息
当前主机上,我们可以查看到所有的虚拟主机情况。
$ docker-machine.exe ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.102:2376 v19.03.5
work1 - virtualbox Running tcp://192.168.99.103:2376 v19.03.5
work2 - virtualbox Running tcp://192.168.99.104:2376 v19.03.5
进入管理主机,查看节点的情况。
docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5
qqgd4abpjw08lwh31ddgez041 work1 Ready Active 19.03.5
gblxw2whlxl0k94nmfozhs7gl work2 Ready Active 19.03.5
服务和任务关系
- 服务是一组任务的集合,一个服务可以有多个任务。
- 任务是集群里面最小的一个单位,比如ping www.baidu.com
部署集群服务
docker-machine ssh default
连接管理主机
docker@default:~$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
c9b1b535fdd9: Pull complete Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
拉取一个 alpine linux
镜像
Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗
部署任务
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker service create --replicas 1 --name hello-world alpine ping www.baidu.com
--replicas
指定任务的数量--name
指定服务的名称alpine
需要运行的镜像名称ping www.baidu.com
镜像里面需要运行的命令
docker@default:~$ docker service create --replicas 1 --name hello-world alpine ping www.baidu.com
nzr66u3j32ndgzodw08cer1he
overall progress: 1 out of 1 tasks 1/1: running[==================================================>] verify: Service converged
常用命令
docker service ps <name>
查看服务的运行状态、以及进展
docker@default:~$ docker service ps hello-world
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j03uhnoauhet hello-world.1 alpine:latest default Running Running 8 minutes ago
docker service ls
查看当前Swarm 集群所运行的所有任务
docker@default:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
nzr66u3j32nd hello-world replicated 1/1 alpine:latest
监控服务
docker service inspect --pretty hello-world
命令可以概览服务的运行情况。
ID: nzr66u3j32ndgzodw08cer1he
Name: hello-world
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: alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Args: ping www.baidu.com
Init: false
Resources:
Endpoint Mode: vip
弹性伸缩
docker service update --replicas 2 hello-world
将原来的服务任务数量改为2次
docker@default:~$ docker service update --replicas 2 hello-world
hello-world
overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged
docker service ps <name>
查看本次任务的运行情况
docker@default:~$ docker service ps hello-world
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j03uhnoauhet hello-world.1 alpine:latest default Running Running 26 minutes ago
k6oudbv4e9he hello-world.2 alpine:latest work1 Running Running about a minute ago
这里将这两个任务分配到 default
work1
节点
查看 work1
节点运行情况
### 进入work1
docker-machine ssh work1
docker@work1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c86154f43f4 alpine:latest "ping www.baidu.com" 4 minutes ago Up 4 minutes hello-world.2.k6oudbv4e9henfqbhvulxt1y2
从集群退出
docker swarm leave
执行退出命令后,该节点已下线。
docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5
qqgd4abpjw08lwh31ddgez041 work1 Down Active 19.03.5
gblxw2whlxl0k94nmfozhs7gl work2 Ready Active 19.03.5