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文件
  • 部署应用
  • 管理应用

简单应用

$ 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服务:定义镜像,密钥,网络,以及部署约束。

  • ,,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容