Docker_学习笔记系列之docker-compose

docker官方提供的用于批量容器编排,compose是官方提供的开源项目

主要的目的是实现一个应用同时需要多个子服务协同完成,根据docker-compose文件将不同的服务部署到不同的容器中

单台机器,编排多个容器【如一个项目需要:redis,mysql,Nginx,web,相当于4个关联的容器】

官网文档:https://docs.docker.com/compose/

1.docker-compose安装

# 下载
官方:sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

备用:sudo curl -L https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose

# 赋权目录
sudo chmod +x /usr/local/bin/docker-compose

# 查看
docker-compose --version

docker-compose version 1.17.1, build 6d101fb
docker-py version: 2.6.1
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

2.运用docker-compose三步骤


Using Compose is basically a three-step process:

1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

3. Run docker-compose up and Compose starts and runs your entire app.

3.docker-compose.yaml文件编排规则

官方文档:https://docs.docker.com/compose/compose-file/

yaml文件版本和docker引擎的版本有关联

dockerfile文件一样都是键值对形式
# 第一层:版本层
version: '版本号'
# 第二层:服务层
services:
服务1:
# 服务配置
images
build
networks
volumes
服务2:
服务3:
# 第三层其它配置
volumes:
networks:
configs:

# 关键字介绍
version 版本号,不同的版本号对应着不同的docker引擎,默认向下兼容,详细见上面的官方文档
Services 服务名称,定义不同的服务
networks 网络,指定的网络,每个服务也可以指定自己的网络,前提该网络必须先存在或者最外层networks定义的网络,默认创建 bridge 网络,如果使用相同的网络,docker就允许服务间通过服务名互相通信了
volumes 用于指引 Docker 来创建新的卷

# 常用配置范例如下
version: "3.8"
services:

redis:  # 将创建单独的容器的redis服务
  image: redis:alpine    # 指定镜像,一般是包含仓库地址的镜像名,会自动去仓库拉取
  ports:
    - "6379:6379"        # 指定容器映射出的端口
    - "5000:5000"
  volumes:
    - type: volume        # 定义一个volume新卷,注意无论在宿主机还是容器中修改内容都会实时反应到对应文件中
    source: myredis-data  # 定义卷名,通过docker volume inspect myredis-data 可查看卷名对应的宿主机目录位置
    target: /app         # 定义上面的卷与redis服务中的/app目录
  networks:
    - frontend        # 指定容器使用的网络,必须在构建前先存在
  command: python /app/AsyncIssuedMain.py -type 2  # 指定容器启动时启动的命令,默认覆盖dockerfile中cmd指定的命令
  secrets:
    - source: web_token  # 指定密钥的名字,需要在外层已经定义存在的,以普通文件挂载到副本中,在宿主机的位置为/run/secrets
    target: secret-name # 定义的密钥文件名,即在副本中为/run/secrets/secret-name
  stop_grace_period: 1m30s  # 定义优雅的停服时间,停容器时给id为1的进程发送SIGTERM信号,默认10s,如果10s后没有处理该信号,则会被SIGKILL信号强制杀掉
  deploy:        # 此节点是用于集群模式在多台服务器上创建多个副本即多个相同的容器不容的ip和容器名,提升并发
    replicas: 2  # 创建n个副本,默认为1
    update_config:  # 定义在滚动升级update时的具体操作
      parallelism: 2  # 每次更新副本的数量
      failure_action: rollback   # 定义升级失败后自动回滚,默认是pause升级失败自动阻止其他副本升级
    restart_policy:  # 定义容器异常退出时的策略
      condition: on-failure  # 容器以非0返回值退出,会立即重启
      max_attempts: 3    # 最多重启次数
      window: 120s  # 最多等待时间确认是否重启成功
      delay: 10s   # 每次重启的间隔时间
    placement:   # 定义本服务和主机属性相关的副本中的限制
      max_replicas_per_node: 1   # 定义最大副本的数量
      constraints:
        - "node.role==manager"  # 表示只在管理节点上部署副本,支持副本id、hostname、引擎标签、自定义标签指定

db:
  build: .   # 基于当前yaml文件目录下的dockerfile文件构建镜像,默认镜像名为:compose文件目录名_compose文件定义的服务名
  volumes:
    - /usr/db-data:/var/lib/postgresql/data  # 指定主机与容器对应的映射目录
    - /configs/config.py:/app/config.py  # 宿主机目录中的文件在容器第一次启动时会覆盖容器中对应文件名的内容
  networks:
    - backend
  secrets:
    - db_password  # 指定使用的密钥
  environment:  # 在副本中添加环境变量
    DB_USER: SUN
    DB_PASSWD_FILE: /run/secrets/db_password  # 密码的位置(挂载到每个服务副本中的密钥)
    DB_NAME: ORDER
  deploy:
    placement:   # 定义本服务和主机属性相关的副本中的限制
      constraints:
- 'node.role == worker'   # 部署在工作节点上
# 自定义标签需要通过docker node update --label-add db_center=yes 工作节点主机名,部署前提交创建
          - 'node.labels.db_center == yes'  # 且工作节点的自定义标签为db_center的机器上
networks:
frontend:
backend:
driver: overlay # 默认都是采用此网络驱动
driver_opts:
encrypted: 'yes'  # 是否加密数据层,一般涉及数据库支付等时根据需求配置,会增加开销
volumes:
db-data:
secrets:  # 数据层加密时配置密钥
db_password:
  external: true   # 密钥定义为stack部署前必须存在
web_token:
  file: ./devsecrets/payment_token   # 部署时按需创建密钥,需要在主机路劲下的文件中配置所需的值,不安全
实战部署wordpress博客程序

官方文档:https://docs.docker.com/compose/wordpress/

常用命令

执行下面所有的命令前提是,切换到含有docker-compose.yml文件的目录下

# 帮助命令
docker-compose --hlep
# 加-d以后台运行服务
docker-compose up -d
# 按指定的文件构建容器,默认是当前目录下的docker-compose.yml文件构建
docker-compose -f docker-compose-beijin.yml up -d
# 停止并且删除服务,并删掉所有的资源如容器、网络等镜像和映射不会删
docker-compose down
# 查看服务运行情况
docker-compose ps
# 查看服务的启动日志及服务标准输出日志
docker-compose logs
# 重启服务
docker-compose restart
# 停止服务运行
docker-compose stop
# 查看容器中的运行的进程情况,默认每个服务的进程id为1
docker-compose top
# stop掉服务了,删除资源使用如下命令
docker-compose rm

猜你喜欢

转载自blog.51cto.com/15127518/2685243