镜像准备
Docker Stack 不支持 “build” 编排指令,所以需要将镜像预先准备好。此处使用阿里云的容器镜像服务,将本地构建好的镜像推送至阿里云镜像仓库:
$ docker login --username=brusw@outlook.com registry.cn-hangzhou.aliyuncs.com
$ docker tag brusw/sample:latest registry.cn-hangzhou.aliyuncs.com/brusw/sample:latest
$ docker push registry.cn-hangzhou.aliyuncs.com/brusw/sample:latest
服务部署
创建编排文件
博客站点一共包含 3 个服务:koa(服务端)、nuxt(展示前端)、admin(管理后台),数据库使用 MySQL(容器服务,未作集群部署)。参考 Docker Compose v3 语法,创建一个 docker-stack.yml 文件,内容如下:
version: "3.7"
services:
koa:
image: registry.cn-hangzhou.aliyuncs.com/brusw/blog-koa
ports:
- "3000:3000"
networks:
- frontend
- backend
volumes:
- /srv/www/blog/config:/usr/src/app/config
deploy:
replicas: 2
resources:
limits:
memory: 100M
restart_policy:
condition: on-failure
update_config:
order: start-first
placement:
constraints: [node.role==worker]
nuxt:
image: registry.cn-hangzhou.aliyuncs.com/brusw/blog-nuxt
ports:
- "5000:5000"
networks:
- frontend
deploy:
replicas: 2
resources:
limits:
memory: 200M
restart_policy:
condition: on-failure
update_config:
order: start-first
placement:
constraints: [node.role==worker]
admin:
image: registry.cn-hangzhou.aliyuncs.com/brusw/blog-admin
ports:
- "8080:8080"
networks:
- frontend
deploy:
replicas: 2
resources:
limits:
memory: 50M
restart_policy:
condition: on-failure
update_config:
order: start-first
placement:
constraints: [node.role==worker]
networks:
frontend:
external: true
backend:
external: true
添加集群网络
登录集群管理节点,创建两个 overlay 类型的网络,用于集群服务之间的通信:
$ docker network create --driver overlay frontend
$ docker network create --driver overlay --attachable backend
声明
--attachable
参数表示当前网络可以被容器直接加入。
接下来将现有 MySQL 容器(brusw-mysql80)添加到 backend 集群网络:
$ docker network connect backend brusw-mysql80
执行部署命令
由于使用的是私有仓库,部署命令需要加上 --with-registry-auth
参数,确保其他节点可以拉取镜像:
$ docker stack deploy -c docker-stack.yml --with-registry-auth brusw_blog
Creating service brusw_blog_koa
Creating service brusw_blog_nuxt
Creating service brusw_blog_admin
常用命令
列出集群服务
$ docker stack services brusw_blog
ID NAME MODE REPLICAS IMAGE PORTS
3uw2muy7wz5e brusw_blog_admin replicated 2/2 registry.cn-hangzhou.aliyuncs.com/brusw/blog-admin:latest *:8080->8080/tcp
jz0odkclw5si brusw_blog_koa replicated 2/2 registry.cn-hangzhou.aliyuncs.com/brusw/blog-koa:latest *:3000->3000/tcp
h7z7akeuq8n8 brusw_blog_nuxt replicated 2/2 registry.cn-hangzhou.aliyuncs.com/brusw/blog-nuxt:latest *:5000->5000/tcp
服务扩(缩)容
$ docker service scale brusw_blog_koa=2
brusw_blog_koa scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
更新指定服务
$ docker service update --force brusw_blog_koa
brusw_blog_koa
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged