正如单节点docker使用 docker-compose.yml 来一次配置、启动多个容器,在 Swarm 集群中也可以同样使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。

使用 docker service create 一次只能部署一个服务,使用 docker-compose.yml 我们可以一次启动多个关联的服务,所用到的命令为docker stack deploy。

下面以在 Swarm 集群中部署 WordPress 为例进行说明。

[root@docker-mgr1 ~]# cat docker-compose.yml
version: "3"

services:
  wordpress:
    image: wordpress
    ports:
      - 80: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: SuperUersPW
      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:

在 Swarm 集群管理节点新建该文件,其中的 visualizer 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。

在 Swarm 集群中使用 docker-compose.yml 我们用 docker stack 命令,下面我们对该命令进行详细讲解。

部署服务

部署服务使用 docker stack deploy,其中 -c 参数指定 compose 文件名。

[root@docker-mgr1 ~]# docker stack deploy -c docker-compose.yml wpblog
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.
Creating network wpblog_overlay
Creating network wpblog_default
Creating service wpblog_visualizer
Creating service wpblog_wordpress
Creating service wpblog_db

现在我们打开浏览器输入 任一节点IP:8080 即可看到各节点运行状态。mysql和visualizer,因为在文件中已经指定了其规则是运行在管理节点 ,当然这个分配是随机的,可以是这两个的容器都在同一台管理节点,而下图则是刚好被分配到两个管理节点中。

使用 compose 文件 在浏览器新的标签页输入 任一节点IP 即可看到 WordPress 安装界面,安装完成之后,输入 任一节点IP 即可看到 WordPress 页面。

使用 compose 文件

查看stack的情况

使用docker stack ls命令列出swarm集群中的全部stack,包括每个stack的名字和里面有多少个服务

[root@docker-mgr1 ~]# docker stack ls
NAME      SERVICES
wpblog    3

查看stack中的任务详情

使用docker stack ps <stack_name>列出某个指定的已经部署的stack相关详情。该命令支持stack名称作为主要的输入参数,来指定要查看的stack,列举出服务副本在节点上的分布情况以及当前状态。

[root@docker-mgr1 ~]# docker stack ps wpblog
ID             NAME                  IMAGE                             NODE             DESIRED STATE   CURRENT STATE           ERROR     PORTS
axjiuo4r37i6   wpblog_db.1           mysql:5.7                         docker-mgr1      Running         Running 2 minutes ago            
js1wr9u1obbe   wpblog_visualizer.1   dockersamples/visualizer:stable   docker-mgr1      Running         Running 3 minutes ago            
zpinjfq8g2h8   wpblog_wordpress.1    wordpress:latest                  docker-mgr2      Running         Running 2 minutes ago            
dppuw3bdtb4w   wpblog_wordpress.2    wordpress:latest                  docker-worker2   Running         Running 2 minutes ago            
w47siuv1km0d   wpblog_wordpress.3    wordpress:latest                  docker-worker1   Running         Running 2 minutes ago  

移除服务

要移除服务,使用 docker stack down <stack_name>可以停止stack,再用docker stack rm <stack_name>针对stack进行移除。

[root@docker-mgr1 ~]# docker stack down wpblog
Removing service wpblog_db
Removing service wpblog_visualizer
Removing service wpblog_wordpress
Removing network wpblog_default
Removing network wpblog_overlay
[root@docker-mgr1 ~]#