Outline:
- Basic Idea
- Commands
- docker-stack.yml
Docker Stack是Docker Compose的进化版, 是Docker原生的部署和管理多服务应用的方案, 默认集成在Docker引擎中, 且提供了简单的声明式接口对应用进行部署和全生命周期管理
Basic Idea
虽然是Docker Compose的进化版, 但是Stack是Docker原生的, 和Swarm一样
- 事实上, Docker Stack依赖于Docker Swarm, Stack将被部署到Swarm上
对应用的任何变更都应该通过Stack文件进行声明, 然后用docker stack deploy
部署
- Stack文件是Stack的配置的唯一声明, 所有Stack相关的改动都要体现在Stack文件中
- 不要用命令来修改
Docker Stack不支持build, 意味着在部署Stack之前, 所有镜像必须提前build, 这一点不同于Docker Compose
具体细节就不赘述了, 用的时候再查
Commands
部署
列出Stack
列出Swarm集群的全部Stack:
查看Stack详情
删除Stack
从Swarm中移除Stack
docker-stack.yml
Docker Stack根据Stack文件部署应用, 也就是docker-stack.yml
docker-stack.yml
就是docker-compose.yml
, 唯一的区别就是Docker Stack文件的version
要大于3.0
项目地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| version: "3.2"
services: reverse_proxy: image: dockersamples/atseasampleshopapp_reverse_proxy ports: - "80:80" - "443:443" secrets: - source: revprox_cert target: revprox_cert - source: revprox_key target: revprox_key networks: - front-tier
database: image: dockersamples/atsea_db environment: POSTGRES_USER: gordonuser POSTGRES_DB_PASSWORD_FILE: /run/secrets/postgres_password POSTGRES_DB: atsea networks: - back-tier secrets: - postgres_password deploy: placement: constraints: - 'node.role == worker'
appserver: image: dockersamples/atsea_app networks: - front-tier - back-tier - payment deploy: replicas: 2 update_config: parallelism: 2 failure_action: rollback placement: constraints: - 'node.role == worker' restart_policy: condition: on-failure# delay: 5s max_attempts: 3 window: 120s secrets: - postgres_password
visualizer: image: dockersamples/visualizer:stable ports: - "8001:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: update_config: failure_action: rollback placement: constraints: - 'node.role == manager'
payment_gateway: image: dockersamples/atseasampleshopapp_payment_gateway secrets: - source: staging_token target: payment_token networks: - payment deploy: update_config: failure_action: rollback placement: constraints: - 'node.role == worker' - 'node.labels.pcidss == yes'
networks: front-tier: back-tier: payment:` driver: overlay driver_opts: encrypted: 'yes'
secrets: postgres_password: external: true staging_token: external: true revprox_key: external: true revprox_cert: external: true
|
关键字
顶级关键字:
version
: 代表Compose文件格式的版本号. 要应用于Stack, 需要 > 3.0
services
networks
: 默认用overlay
网络, 因为是Swarm模式
secrets
:
external
: 在Stack部署之前, 该密钥必须存在
网络
Docker Stack首先会检查并创建networks
, 因为服务依赖于网络
默认情况下, overlay网络的控制层是加密的, 如果要加密数据层, 需要在Stack文件中driver_opts
下指定encrypted: 'yes'
服务
服务只有一个必填的下级关键字image
, 指定构建服务副本所需的镜像
其余下级关键字:
Docker
: 指定Docker Registry, 默认是Docker Hub
ports
: 定义端口映射, 注意由于是Swarm模式, 默认网络是Ingress模式, port
项可以简写, 如果指定用Host模式, 则port
项要写完整格式
secrets
: 定义了密钥, 不同于网络, 密钥必须已经在顶级关键字secrets下定义, 且必须在系统上已存在
envirenment
: 向容器中注入环境变量, 一般都将它们以密钥形式传递
deploy
: 定义部署约束, 比如节点ID, 节点名称, 节点角色, 还有更新约束等待
- 更新约束就是
docker service uodate
的那些参数, replicas
之类