正如单节点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,因为在文件中已经指定了其规则是运行在管理节点 ,当然这个分配是随机的,可以是这两个的容器都在同一台管理节点,而下图则是刚好被分配到两个管理节点中。
在浏览器新的标签页输入 任一节点IP 即可看到 WordPress 安装界面,安装完成之后,输入 任一节点IP 即可看到 WordPress 页面。

查看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 ~]#