111、什么是stack (Swarm18)

 
什么是 stack ? 
 
在将这个之前先回顾一下前面部署WordPress的过程:
    1、创建secret
    2、创建mysql service
    3、创建WordPress service
 
也就是说,这个应用包含了两个service ; mysql + wordpress 。他们之间有明确的依赖关系,必须先启动mysql。
 
为了保证这个依赖关系,我们控制了 docker secret 和 docker service 命令的执行顺序,只不过这个过程是手工完成的。
 
假如我们需要频繁的在不同环境中部署WordPress应用,如果每次都手工执行效率就太低了,而且容器出错误。这是自动化的一个好机会,首先我们把这个工程写成一个自动化的脚本。
 
openssl rand -base64 20 | docker secret create mysql_root_password -
 
openssl rand -base64 20 | docker secret create mysql_password -
 
docker network create --driver overlay mysql_private
 
docker service create --name mysql --network mysql_private --secret source=mysql_root_password,target=mysql_root_password --secret source=mysql_password,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE='/run/secrets/mysql_root_password' -e MYSQL_PASSWORD_FILE='/run/secrets/mysql_password' -e MYSQL_USER='wordpress' -e MYSQL_DATABASE='wordpress' mysql:5.7
 
docker service create --name wordpress --network mysql_private --publish 80:80 --secret source=mysql_password,target=wp_db_password -e WORDPRESS_DB_HOST='mysql:3306' -e WORDPRESS_DB_NAME='wordpress' -e WORDPRESS_DB_USER='wordpress' -e WORDPRESS_DB_PASSWORD_FILE='/run/secrets/wp_db_password' wordpress
 
 
这个脚本大体上能够工作,实现了自动化,但是有两个缺点:
 
    1、目前只有两个service,还比较简单,现在的应用通常包含多个service,特别是采用 microservices 架构的应用,几十个service是很正常。用shell脚本启动和管理如此多的service将是一件非常有挑战的任务。
 
    2、我们还要维护service之间的依赖关系,比较容易出错。而且如何判断service正常运行也不是一件容易的事情,不光要看service是否存在,还要考虑service的实际运行状态。
 
我们希望有一种更高效和可靠的方法来部署基于service的应用,这就是stack。
 
stack 包含一系列service,这些service组成了应用。stack通过一个YAML文件定义每个service,并描述service使用资源和各种依赖。
 
WordPress的stack版本
 
version: '3.1'
 
services:
    db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress
            MYSQL_PASSWORD_FILE: /run/secrets/db_password
        secrets:
          - db_root_password
          - db_password
 
    wordpress:
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - "80:80"
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
        secrets:
          - db_password
secrets:
    db_password:
        file: db_password.txt
    db_root_password:
        file: db_root_password.txt
volumes:
    db_data:
 
1、service 中定义了两个 service : db 和 wordpress
2、secret 定义了两个 secret: db_password 和 db_root_password ,在 service db 和 wordpress 的定义中引用了这两个secret
3、volume定义了一个volume: db_data ,service db 使用了这个volume
4、wordpress 通过了 depends_on 指定自己依赖 db 这个 service 。 Docker 会保证 当 db 正常运行后再启动 wordpress
 
可以在YAML 中定义的元素远不止这些,完成的列表和使用方法可参考文档 https://docs.docker.com/compose/compose-file/
 
原文地址:https://www.cnblogs.com/www1707/p/10880848.html