Docker Swarm
Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官 方对容器云生态进行支持的核心方案。
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容 器云平台。
注:Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令
docker swarm
,请注意与旧的Docker Swarm
区分开来。
以下介绍的 Swarm 指 Swarm 模式。
基本概念
Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。
节点
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点(node)。
节点分为管理(manager)节点和工作(worker)节点。
服务和任务
任务(Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务(Services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services
按照一定规则在各个工作节点上运行指定个数的任务。global services
每个工作节点上运行一个任务
两种模式通过 docker service create
的 --mode
参数来指定。
创建 Swarm 集群
初始化集群
忘了 token 的话可以通过以下命令获取:
docker swarm join-token worker
增加工作节点
启动之后我们可以通过如下命令将 worker1
加入集群:
报错,采用 https://github.com/moby/moby/issues/34825#issuecomment-331100937 最后一条提到的方式解决:
接下来将 worker1
和 worker2
加入进来:
查看集群
进入管理节点查看集群机器:
部署服务
我们使用 docker service
命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。
新建服务
docker service create --replicas 3 -p 8000:80 --name nginx nginx:1.13.7-alpine
服务创建&部署完成后,就可以通过上述三个节点中的任意一个来访问 Nginx 页面了:
查看服务
docker service ls
docker service ps nginx
docker service logs
docker service logs nginx
删除服务
docker service rm nginx
在 Swarm 集群中使用 Compose 文件
使用 docker service create
一次只能部署一个服务,使用 compose.yml
我们可以一次启动多个关联的服务。我们以在 Swarm 集群中部署 Wordpress 为例进行说明,首先在管理节点上创建如下 docker-compose.yml
文件:
version: "3"
services:
wordpress:
image: wordpress
ports:
- 8000:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:
部署服务
docker stack deploy -c docker-compose.yml wordpress
查看服务
docker stack ls
移除服务
docker stack down wordpress
注:该命令不会移除服务所使用的数据卷,如果你想移除数据卷请使用
docker volume rm
管理敏感数据
在动态的、大规模的分布式集群上,管理和分发密码、证书等敏感信息是极其重要的工作。
Docker 目前已经提供了 secrets
管理功能,用户可以在 Swarm 集群中安全地管理密码、密钥证书等敏感数据,并允许在多个 Docker 容器实例之间共享访问指定的敏感数据。
创建 secret
openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -
查看 secret
创建 MySQL 服务
docker network create -d overlay mysql_private
docker service create \
--name mysql \
--replicas 1 \
--network mysql_private \
--mount type=volume,source=mydata,destination=/var/lib/mysql \
--secret source=mysql_root_password,target=mysql_root_password \
--secret source=mysql_password,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_USER="wordpress" \
-e MYSQL_DATABASE="wordpress" \
mysql:latest
docker service create \
--name wordpress \
--replicas 1 \
--network mysql_private \
--publish target=30000,port=80 \
--mount type=volume,source=wpdata,destination=/var/www/html \
--secret source=mysql_password,target=wp_db_password,mode=0400 \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
-e WORDPRESS_DB_HOST="mysql:3306" \
-e WORDPRESS_DB_NAME="wordpress" \
wordpress:latest
管理配置数据
在 Docker 17.06 以上版本中,Docker 新增了 docker config
子命令来管理集群中的配置信 息,以后你无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。
注:
config
仅能在 Swarm 集群中使用
创建 config
touch redis.conf
echo "port 6380" > redis.conf
docker config create redis.conf redis.conf
查看 config
docker config ls
创建 Redis 服务
docker service create \
--name redis \
# --config source=redis.conf,target=/etc/redis.conf \
--config redis.conf \
-p 6379:6380 \
redis:latest \
redis-server /redis.conf
无评论