Docker 容器编排利器 Docker Compose( 四 )


 version: "3.8" services: web:   build: .   depends_on:     - db     - redis redis:   image: redis db:   image: mysql上述 YAML 文件定义的容器会先启动 db 和 redis 两个服务 , 最后才启动 web 服务 。
ports
容器对外暴露的端口 , 格式:左边宿主机端口:右边容器端口 。
 ports: - "80:80" - "8080:8080"
expose
容器暴露的端口不映射到宿主机 , 只允许能被连接的服务访问 。
 expose: - "80" - "8080"
restart
容器重启策略 , 简单的理解就是 Docker 重启以后容器要不要一起启动:

  • no:默认的重启策略 , 在任何情况下都不会重启容器;
  • on-failure:容器非正常退出时 , 比如退出状态为非0(异常退出) , 才会重启容器;
  • always:容器总是重新启动 , 即使容器被手动停止了 , 当 Docker 重启时容器也还是会一起启动;
  • unless-stopped:容器总是重新启动 , 除非容器被停止(手动或其他方式) , 那么 Docker 重启时容器则不会启动 。
 services: nginx:   image: nginx   container_name: mynginx   ports:     - "80:80"   restart: always
environment
添加环境变量 。可以使用数组也可以使用字典 。布尔相关的值(true、false、yes、no)都需要用引号括起来 , 以确保 YML 解析器不会将它们转换为真或假 。
 environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET:或者以下格式:
 environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET
env_file
从文件中获取环境变量 , 可以指定一个或多个文件 , 其优先级低于 environment 指定的环境变量 。
 env_file: - /opt/runtime_opts.env # 绝对路径 - ./common.env # 相对路径 , 相对当前 docker-compose.yml 文件所在目录 - ./Apps/web.env # 相对路径 , 相对当前 docker-compose.yml 文件所在目录
注意:env 文件中的每一行需采用 键=值 格式 。以 # 开头的行会被视为注释并被忽略 。空行也会被忽略 。

command
覆盖容器启动后默认执行的命令 。
 command: echo "helloworld"该命令也可以是一个列表 。
 command: ["echo", "helloworld"]
volumes
数据卷 , 用于实现目录挂载 , 支持指定目录挂载、匿名挂载、具名挂载 。
  • 指定目录挂载的格式为:左边宿主机目录:右边容器目录 , 或者左边宿主机目录:右边容器目录:读写权限;
  • 匿名挂载格式为:容器目录即可 , 或者容器目录即可:读写权限;
  • 具名挂载格式为:数据卷条目名称:容器目录 , 或者数据卷条目名称:容器目录:读写权限 。
关于匿名挂载/具名挂载更多的内容请阅读《Docker 最常用的镜像命令和容器命令 》文章中容器相关命令部分的目录挂载(容器数据卷操作)的内容 。
 # 描述 Compose 文件的版本信息 version: "3.8" # 定义服务 , 可以多个 services: mysql: # 服务名称   image: mysql:8 # 创建容器时所需的镜像   container_name: mysql8 # 容器名称 , 默认为"工程名称_服务条目名称_序号"   ports: # 宿主机与容器的端口映射关系     - "3306:3306" # 左边宿主机端口:右边容器端口   environment: # 创建容器时所需的环境变量     MYSQL_ROOT_PASSWORD: 1234   volumes:       # 绝对路径     - "/mydata/docker_mysql/data:/var/lib/mysql"       # 相对路径 , 相对当前 docker-compose.yml 文件所在目录     - “./conf:/etc/mysql/conf.d“       # 匿名挂载 , 匿名挂载只需要写容器目录即可 , 容器外对应的目录会在 /var/lib/docker/volume 中生成     - "/var/lib/mysql"       # 具名挂载 , 就是给数据卷起了个名字 , 容器外对应的目录会在 /var/lib/docker/volume 中生成     - "mysql-data-volume:/var/lib/mysql"  # 定义数据卷 , 可以多个 volumes: mysql-data-volume: # 一个具体数据卷的条目名称   name: mysql-data-volume # 数据卷名称 , 默认为"工程名称_数据卷条目名称"


推荐阅读