Docker Swarm
1. Docker Swarm 简介
- Docker Swarm 是 docker 的本地集群。将一些 docker 主机组成一个大的虚拟 docker 主机。swarm 支持 Docker 自身的 API 来操作,以下都可以实现 swarm 操作:
- Dokku
- Docker Compose
- Docker Machine
- Jenkins
- 像别的 Docker 项目一样,swarm 项目也遵循“替换,插入,运行”的原则。作为基础开发原则,API 是向后兼容的。意味着你可以替换你想要的 swarm 的调度模块。swarm 的可替换设计提供了平滑的使用便利性。也允许大规模生产环境上的部署,使用更强大的后端调度,如 Mesos。
1.1 明白 swarm 集群的创建
- 创建 swarm 集群的第一步是拉取 swarm 镜像 Docker Swarm image,然后使用 docker 来配置 warm 的管理节点,使所有节点来运行 swarm。这要求:
- 在每个节点上开放 TCP 端口来与 swarm 的管理节点通信
- 在每个节点安装 docker
- 创建管理 TLS 证书来加密通信。
- 如果你想手动安装或,有志于贡献,参考:Build a swarm cluster for production
1.2 服务发现
1.3 高级调度
1.4 SwarmAPI
2. 开始使用 Docker Swarm
- 你可以使用 swarm 可运行镜像来创建容器,或者使用可运行 swarm 二进制文件来创建 swarm 集群。本节将介绍两种方式,并讨论它们的利弊(discusses their pros and cons)
2.1 使用交互容器创建一个 swarm 集群
- 你可以使用 swarm 官方镜像来创建一个 swarm 集群。该镜像由 Docker 官方维护并定时自动更新。使用 docker run 来运行镜像,并且有很多选项和子命令来创建和管理集群。
- 和其它容器镜像一样,你可以下载 swarm:latest 镜像或其它版本。
james@james-CW65:~ > docker run swarm
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
dd72058debf0: Pull complete
cb543654edaf: Pull complete
44212202dc6d: Pull complete
Digest: sha256:c97a27b020ae4439432c842769d8e731661d5987962e33004114e4aba9d03b4c
Status: Downloaded newer image for swarm:latest
Usage: swarm [OPTIONS] COMMAND [arg...]
A Docker-native clustering system
Version: 1.2.8 (48d86b1)
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.
james@james-CW65:~ >
2.1.1 从容器运行 swarm 镜像
- ssh 到一个节点
- 使用 docker run 运行 swarm 镜像。最简单的命令是 docker run swarm --help
- 上面运行过后,镜像会退出。
james@james-CW65:~ > docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eeaf17dc3096 swarm "/swarm --help" 7 minutes ago Exited (0) 7 minutes ago gallant_lamarr
2.1.2 为什么使用镜像?
- 使用容器运行镜像有三个优势:
- 不需要安装二进制文件运行镜像
- 每次都可以用 docker run 来运行新镜像
- 容器使 swarm 环境与宿主机隔离。不需要维护环境。
- 因此运行镜像容器 是一个推荐的使用 swarm 集群的方式。所有以下文档都使用这种方式。
2.2 使用二进制运行 Swarm
2.2.1 为什么使用可执行文件
- 使用二进制可执行文件有个唯一的优点:如果你是开发者修改 swarm project 的代码,那你就不需要容器化后再测试运行,可以直接运行。
- 有以下缺点:
- 源代码编译是个负担
- 可执行文件没有容器化运行的优点,如隔离。
- 大部分文档都是使用容器运行的方法。
- 最后由于没有 docker 引擎,一些工具无法再集群节点上运行,如命令行工具。
3. 创建 swarm 集群
1. 生成发现 token,运行 swarm create 来生成 token:
james@james-CW65:~ > docker run swarm create
6e56a11eb2ac3ef3a7e467a99fa683b5
Token based discovery is now deprecated and might be removed in the future.
It will be replaced by a default discovery backed by Docker Swarm Mode.
Other mechanisms such as consul and etcd will continue to work as expected.
2. 启动 swarm 管理节点
- 集群中的管理节点负责调度集群中的容器。管理节点管理一系列的客户端 agents(也叫节点)
- swarm 的 agent 用于负责承载容器。它们通常是 docker daemon,你可以使用 docker API 与之交互。
- 本节创建 1 个管理节点,2 个工作节点
- 在 virtual Box 下创建一个 swarm 管理节点:
--swarm Configure Machine to join a Swarm cluster
--swarm-addr addr to advertise for Swarm (default: detect and use the machine IP)
--swarm-discovery Discovery service to use with Swarm
--swarm-experimental Enable Swarm experimental features
--swarm-host "tcp://0.0.0.0:3376" ip/socket to listen on for Swarm master
--swarm-image "swarm:latest" Specify Docker image to use for Swarm [$MACHINE_SWARM_IMAGE]
--swarm-join-opt [--swarm-join-opt option --swarm-join-opt option] Define arbitrary flags for Swarm join
--swarm-master Configure Machine to be a Swarm master
--swarm-opt [--swarm-opt option --swarm-opt option] Define arbitrary flags for Swarm master
--swarm-strategy "spread" Define a default scheduling strategy for Swarm
james@james-CW65:~/.docker/machine/cache > docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://6e56a11eb2ac3ef3a7e467a99fa683b5 swarm-master
Running pre-create checks...
Creating machine...
(swarm-master) Copying /home/james/.docker/machine/cache/boot2docker.iso to /home/james/.docker/machine/machines/swarm-master/boot2docker.iso...
(swarm-master) Creating VirtualBox VM...
(swarm-master) Creating SSH key...
(swarm-master) Starting the VM...
(swarm-master) Check network to re-create if needed...
(swarm-master) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Configuring swarm...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env swarm-master
james@james-CW65:~/.docker/machine/cache > docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.100:2376 v17.12.0-ce
swarm-master - virtualbox Running tcp://192.168.99.101:2376 swarm-master (master) v17.12.1-ce
//可以看的在swarm-master中运行了2个swarm容器,分别是join和manage
docker@swarm-master:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85edb0c36a44 swarm:latest "/swarm join --adver…" 6 minutes ago Up 6 minutes 2375/tcp swarm-agent
8ef6de0b0ea1 swarm:latest "/swarm manage --tls…" 6 minutes ago Up 6 minutes 2375/tcp, 0.0.0.0:3376->3376/tcp swarm-agent-master
- 创建一个工作节点
james@james-CW65:~/.docker/machine/cache > docker-machine create -d virtualbox --swarm --swarm-discovery token://6e56a11eb2ac3ef3a7e467a99fa683b5 swarm-agent-00
Running pre-create checks...
Creating machine...
(swarm-agent-00) Copying /home/james/.docker/machine/cache/boot2docker.iso to /home/james/.docker/machine/machines/swarm-agent-00/boot2docker.iso...
(swarm-agent-00) Creating VirtualBox VM...
(swarm-agent-00) Creating SSH key...
(swarm-agent-00) Starting the VM...
(swarm-agent-00) Check network to re-create if needed...
(swarm-agent-00) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Configuring swarm...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env swarm-agent-00
james@james-CW65:~/.docker/machine/cache > docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.100:2376 v17.12.0-ce
swarm-agent-00 - virtualbox Running tcp://192.168.99.102:2376 swarm-master v17.12.1-ce
swarm-master - virtualbox Running tcp://192.168.99.101:2376 swarm-master (master) v17.12.1-ce
//
docker@swarm-agent-00:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2886d0aa3906 swarm:latest "/swarm join --adver…" About a minute ago Up About a minute 2375/tcp swarm-agent
- 可以再添加几个工作节点。
3. 管理 swarn 集群
- 切换环境到 swarm-master:docker-machine env swarm-master
- 使用 docker info 获取集群信息
由于使用了docker swarm模式,这里的输出被覆盖了。
- 可以查看出每个节点都暴露了 2376 端口,每个节点都运行了 swarm agent 的容器。
- 不建议在生产环节中在 master 上运行 manager 和 agent,可能会导致 agent 失败引发问题。
- 检查运行在集群中的容器:
docker@swarm-master:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85edb0c36a44 swarm:latest "/swarm join --adver…" 33 minutes ago Up 33 minutes 2375/tcp swarm-agent
8ef6de0b0ea1 swarm:latest "/swarm manage --tls…" 34 minutes ago Up 34 minutes 2375/tcp, 0.0.0.0:3376->3376/tcp swarm-agent-master
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于