Docker学习(14) 使用Docker Stack部署应用(上)

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:
  1. 网络
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'
  1. 密钥
  • 密钥属于顶级对象:在stack文件中定义了4个:
secrets:
  postgres_password:
    external: true
  staging_token:
    external: true
  revprox_key:
    external: true
  revprox_cert:
    external: true

  • 4个密钥都被定义了external:在stack部署之前,这些密钥必须存在。
  1. 服务
  • 每个服务都是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服务:定义镜像,密钥,网络,以及部署约束。

  • ,,

你可能感兴趣的:(Docker学习(14) 使用Docker Stack部署应用(上))