Docker Swarm


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 最后一条提到的方式解决:

接下来将 worker1worker2 加入进来:

查看集群

进入管理节点查看集群机器:

部署服务

我们使用 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

点赞 取消点赞 收藏 取消收藏

<< 上一篇: Docker Machine

>> 下一篇: Docker 的安全性