「Docker Compose」- docker-compose.yaml(学习笔记)

官方文档

Compose file version 3 reference | Docker Documentation

模板文件(docker-compose.yaml)

我们常用的 docker-compose.yaml 模板(直接复制):

version: '3'

services:
  backend:
    # 镜像配置
    image: <image address>
    # 容器配置
    container_name: <container name>
    # 网络配置
    hostname: <hostname>
    network_mode: host
    ports:
      - "<host port>:<container port>"
    # 服务管理配置
    restart: always
    # 运行命令、及其环境信息
    volumes:
      - /etc/localtime:/etc/localtime
    environment:
      - <key>=<value>
    # 覆盖 ENTRYPOINT 参数
    entrypoint: /bin/entrypoint
    command: ["ls", "-l"]

运行命令

docker-compose, run a script after container has started? – Stack Overflow

运行多行命令(多行脚本):

version: '3'

services:
  backend:
    ...
    entrypoint: 
      - sh
      - -c
    command:
      - |
        while true
        do
            // do some stuff
        done

环境变量(Environment)

Environment variables in Compose | Docker Documentation
docker-compose invalid type, it should be a string – DevOps Stack Exchange

供 Container 使用的环境变量

这里的“环境变量”是指“在运行时传递到容器中的环境变量”,等价于 docker run –env 命令。

使用如下形式定义环境变量(注意 environment 为数组):

version: '3'
services:
  api:
    image: 'node:6-alpine'
    env_file:
     - ./Docker/api/api.env
    environment:
     - NODE_ENV=production

供 YAML 使用的环境变量

Environment variables in Compose | Docker Documentation

通过定义 .env 文件(或通过 docker-compose –env-file /path/to/envfile 参数),来指定环境变量文件的路径。

然后,我们便能够在 docker-compose.yaml 中使用这些环境变量:

version: '3'
services:
  web:
    image: "webapp:${TAG}"

注意事项:
1)引号问题:在 .env 中定义的环境变量,其 <VALUE> 不要使用引号(除非需要)。引号会被视为 <VALUE> 的成分;

资源限制(Resource Limits)

How to specify Memory & CPU limit in docker compose version 3 – Stack Overflow

version: "3.6"
services:
  example-container:
    deploy:
      # 资源限制
      resources:
        limits:
          cpus: '0.50'
          memory: 500M

针对 Compose file reference Version 3 配置,需要使用 –compatibility 选项启动服务:

docker-compose --compatibility up -d

日志轮转(Logging)

version: "3.6"
services:
  example-container:
    # 日志处理
    logging:
      driver: "json-file"
      options: 
        max-size: "500M"
        max-file: "3"

存储数据(Volume)

version: "3.9"

services:

  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: data-web
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static
      - type: volume
        source: nfs-storage-foo
        target: /srv/nfs
        volume:
          nocopy: true

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "data-db:/var/lib/postgresql/data"

volumes:
  data-web:
  data-db:
  nfs-storage-foo:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

常用工具

将 docker run 转化为 Docker Compose 文件:
1)https://github.com/magicmark/composerize
2)Composerize

转义字符

美元符号

escaping – How can I escape a $ dollar sign in a docker compose file? – Stack Overflow

在 docker-compose.yaml 中,通过 $$ 来表示 $ 符号,以防止被解析为变量;

参考文献

Option network_mode: host in docker compose file not working as expected – Open Source Projects / Compose – Docker Forums
Compose file version 3 reference | Docker Documentation
Convox Docs