[TOC] ## 概述 注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像 ### 新旧版本差异 旧版本(版本 1) ``` webapp: image: examples/web ports: - "80:80" volumes: - "/data" ``` 新版本 (版本 2 ) ``` version: "2" services: webapp: image: examples/web ports: - "80:80" volumes: - "/data" ``` 添加了 版本信息, 2. 所有服务放在了 services 下 ## 指令 ### build 指定 `Dockerfile`路径,并构建它 `Dockerfile`所在绝对或相对路径 `build: /path/to/build/dir` ### command 覆盖容器启动后默认执行的命令 ``` web: build: . command: python manage.py runserver 0.0.0.0:8000 ``` ### devices 指定设备映射 ``` devices: - "/dev/ttyUSB1:/dev/ttyUSB0" ``` ### env_file 导入 env 环境 ``` env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env ``` common.env ```bash # common.env: 自持 # 注释 PROG_ENV=development ``` ### environment 设置环境变量 ``` environment: RACK_ENV: development SESSION_SECRET: //or environment: - RACK_ENV=development - SESSION_SECRET ``` > 如果变量名称或者值中用到`true|false,yes|no`等表达布尔含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义 ### expose 暴露端口,但不映射到宿主机 只被连接的服务访问,仅可以指定内部端口为参数 ``` expose: - "3000" - "8000" ``` ### extends 基于其它模板文件进行扩展 ``` # common.yml webapp: build: ./webapp environment: - DEBUG=false - SEND_EMAILS=false ``` ``` # development.yml web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db environment: - DEBUG=true db: image: postgres ``` > 推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息 ### extra_hosts ``` extra_hosts: - "googledns:8.8.8.8" - "dockerhub:52.1.157.61" ``` 会在启动后的服务容器中`/etc/hosts`文件中添加如下两条条目。 ``` 8.8.8.8 googledns 52.1.157.61 dockerhub ``` ### image 指定镜像名为或 id 指定镜像名为或 id ,Compose 会进行拉取 ``` image: ubuntu image: orchardup/postgresql image: a4bc65fd ``` ### labels 为容器添加 Docker 元数据 为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。 ``` labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com.startupteam.release: "rc3 for v1.0" ``` ### links 链接到其它服务中的容器 使用服务名称(同时作为别名)或服务名称:服务别名 ``` links: - db - db:database - redis ``` 使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如: ``` 172.17.2.186 db 172.17.2.186 database 172.17.2.187 redis ``` ### net 设置网络模式 使用和 docker client 的 --net 参数一样的值。 ``` net: "bridge" net: "none" net: "container:[name or id]" net: "host" ``` ### ports 暴露端口信息 ``` ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001" ``` ### ulimits 指定容器的 ulimits 限制值 ``` ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000 ``` ### volumes 数据卷所挂载路径设置 ``` volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro ``` ### volumes_from ``` 从另一个服务或容器挂载它的数据卷。 volumes_from: - service_name - container_name ``` ### 其它指令 #### 指定服务容器启动后执行的命令 `entrypoint: /code/entrypoint.sh` #### 指定容器中运行应用的用户名 `user: nginx` #### 指定容器中工作目录 `working_dir: /code` #### 指定容器退出后的重启策略为始终重启 `restart: always` #### 模拟一个假的远程控制台 `tty: true`