Docker学习(14) 使用Docker Stack部署应用(上)
- Docker Stack:可以解决大规模情境下多服务的部署和管理。
- docker stack 提供了期望状态、滚动升级、简单易容、易扩容,健康检查等特性简化了应用的管理。
使用Docker Stack 部署应用——简介
- Stack能够在单个声明文件中定义复杂的多服务应用。
- Stack提供简单的方式来部署应用和管理其完整的生命周期:初始化部署——>健康检查——>扩容——>更新——>回滚
- 在compose文件里定义应用,通过docker stack deploy来完成部署和管理。
- compose文件中包含构建应用所需的完整服务栈,包括卷、网络、安全以及应用所需的其他基础架构
- stack 是基于docker swarm 之上来完成部署的
使用Docker stack部署应用——详解
- 从系统的架构来说:Stack 位于docker 应用层级的最顶端,stack基于服务进行构建的,而服务是基于容器构建的。
顺序步骤
- 简单应用
- 深入分析stack文件
- 部署应用
- 管理应用
简单应用
实例应用的网址:https://github.com/dockersamples/atsea-sample-shop-app
该应用是由5个服务、3个网络、4个密钥以及3组端口映射构建的
获取源代码
$ git clone https://github.com/dockersamples/atsea-sample-shop-app
正克隆到 'atsea-sample-shop-app'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (25/25), done.
- 重点查看stack文件:docker-stack.yml,该文件定义了应用及依赖
lhf@lhf-virtual-machine:~/docker/stack$ ls atsea-sample-shop-app/
app database docker-compose.yml payment_gateway reverse_proxy
atsea_store.png devsecrets docker-stack.yml README.md windows
checkout.png docker-compose-dev.yml LICENSE REST.md
$ cat atsea-sample-shop-app/docker-stack.yml
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:
- 该文件定义了4个顶级关键词
-
- version:代表了Compose文件格式的版本
- services:定义了组成当前应用的服务有哪些
- networks:列出里必要的网络
- secrets:定义了应用用到的网络
深入分析Stack文件
- Stack文件,唯一的要求是version:一般需要的版本是3.0以及以上版本
- Docker根据stack文件部署应用的时候,首先检查并创建network:
- 网络:
networks:
front-tier:
back-tier:
payment:
driver: overlay
driver_opts:
encrypted: 'yes'
- 该文件定义了三个网络:networks: front-tier、back-tier、payment:,默认网络采用的是overlay驱动,新建对应的覆盖网络、但是payment网络比较特殊。需要数据层加密
-
- 加密数据层的两种方式:
-
- 在docker network create 命令中指定 -o encrypted参数。
- 在stack文件中driver_opts之下指定: encrypted: 'yes'
- 密钥:
- 密钥属于顶级对象:在stack文件中定义了4个:
secrets:
postgres_password:
external: true
staging_token:
external: true
revprox_key:
external: true
revprox_cert:
external: true
- 4个密钥都被定义了external:在stack部署之前,这些密钥必须存在。
- 服务
- 每个服务都是JSON集合。
reverse_proxy服务:
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
该服务定义了镜像、端口、密钥、网络
image:定义用于构建服务的docker镜像
Docker Stack 与Docker Compose的区别是:Stack不支持构建,所以部署stack之前,所以镜像必须提前构建。
ports:定义了两个映射
-
- 80:80:将swarm节点的80端口映射到每个服务的80端口
- 443:443:将swarm节点的443端口映射到每个服务的433端口
- 所有端口默认采用的Ingress模式,意味这集群的每个节点对应的端口都会被映射并且可以访问。
secrets:定义了两个密钥:revprox_cert和revprox_key
-
- 密钥以普通文件的形式挂载到服务副本当中
networks:确保所有副本都连接到front-tier当中
database服务
- 数据库服务在stack问中定义了:镜像、网络、密钥以及环境变量和部署约束。
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'
- envirnment:允许在副本中注入环境变量
-
- POSTGRES_USER: gordonuser:数据库用户
- POSTGRES_DB_PASSWORD_FILE: /run/secrets/postgres_password:数据密码位置
- POSTGRES_DB: atsea:数据库服务名称
- deploy :定义部署约束:保证该服务只在swarm集群的work节点之上
-
- 部署约束是一种拓扑感知定时任务:5种方式进行调度
-
- 节点ID:node.id == 02p4kw2uuw1a
- 节点名称: node.hostname == wrk-12
- 节点角色: node.role == manager
- 节点引擎标签: engine.labels.operatingsystem == ubuntu16.04
- 节点自定义标签: node.labels.zone == prod1
appserver服务
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
- deploy:新增内容
-
- replicas: 2期望服务的副本数为2
- update_config:定义服务在滚动升级的具体操作
- restart_policy:针对容器异常退出的容器策略
visualizer服务
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'
- visualizer:该服务定义了镜像,端口映射规则,更新配置以及部署约束,还挂载了一个指定卷,定义了容器优雅的停止方式
payment_gateway服务
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'
payment_gateway服务:定义镜像,密钥,网络,以及部署约束。
-
,,