docker-compose之配置docker-compose.yml


当前有三种版本的Compose配置文件格式:

  • Version 1

旧版格式,通过省略YAML的根配置项version来指定。

未声明版本的Compose配置文件都被视为V1版,所有的服务都作为根选项在Compose配置文件中声明。

支持V1的Compose最高到1.6.x,再高版本的Compose不推荐使用V1版Compose配置文件。

不支持数据卷、网络和构建参数配置。

V1的Compose不会利用网络优势,每个容器都位于默认的bridge网络上,并且可以从其他容器的IP地址访问,需要使用links来启用容器之间的发现。

  • Version 2.x

通过YAML的根配置项version来指定,具体配置如version: '2'或version: '2.1'等。

必须在Compose配置文件根选项指定版本号,并且主版本数字为2,且所有服务必须在services配置项下声明。

1.6.0+版本的Compose都支持V2,Docker Engine的版本需要1.10.0+版本。

支持数据卷和网络的配置。

默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。很大程度上links不是必要的。

V2中加入了环境变量替换。

  • Version 3.x

最新版本,也是推荐使用版本,推出该版的目的是为了在Compose和Docker Engine的swarm模式之间形成交叉兼容。

通过YAML的根配置项version来指定,具体配置如version: '3'或version: '3.1'等。

V3删除了多个配置项,但也新增了更多配置项。

关于Compose配置文件版本的常见注意事项:

在声明V2和V3版本时需注意:

在指定Compose配置文件要使用的版本时,需同时指定主版本数字和次版本数字。如果未给定次版本数字,则默认使用0而不是最新版本,因此将不支持再更高版本中才加入的新功能。比如version: '3',使用的是3.0版本而不是目前最新的3.8版本。

在使用多Compose配置文件时需注意:

使用多个Compose配置文件扩展服务时,每个文件必须为相同的版本。

Compose配置文件格式版本 Docker Engine 版本

3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

示例:

version: "3.8"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints:
          - "node.role==manager"
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  frontend:
  backend:

volumes:
  db-data:

 docker-compose.yml

version: '3'
services:
  proxy:
    image: nginx
    ports:
      - "80:80"
    networks:
      - frantnet
  webapp:
    build: .
    networks:
      - frantnet
      - endnet
  redis:
    image: redis
    networks:
      - endnet
networks:
  frantnet:
  endnet:

  参数说明:

  •     version: 声明语法版本
  •     services: 指定服务
  •     image: 指定使用的镜像
  •     build: 使用编译Dockerfile的方式得到的镜像
  •      networks: 使用, 创建网络
  •      volumes: 数据卷, 处理容器中数据的持久化方式, 如果在多个容器见共享数据卷,则必须在顶级的volumes中定义这个数据卷
version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume  # 随机找一个临时目录
        source: mydata
        target: /data
      - type: bind  # 绑定相对目录,绝对目录
        source: ./nginx/logs
        target: /var/log/nginx
  jenkins:
    image: jenkins/jenkins:lts
    volumes:
      - jenkins_home:/var/jenkins_home
      - mydata:/data
volumes:
  mydata:
  jenkins_home:



volumes两种方式:

1)绝对路径

db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [直接使用宿主机的本地路径]:/var/lib/mysql

2)卷标

db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [卷标名称]:/var/lib/mysql

volumes:
[卷标名称]:


使用卷标的方式,简洁易于管理,但是数据实际存放的位置需要费点周折才能看到。

查看某个卷信息: docker volume inspect volume_name
查看所有卷: docker volume ls



---

docker run -v /docker_dir ...
docker run -v /home:/docker_dir ...

当不指明宿主机目录时,Docker会默认在宿主机上创建一个临时目录: /var/lib/docker/volumes/[VOLUME_ID]/_data作为宿主机上的被挂载目录。




  •           environment: 定义环境变量
  •           ports: 定义端口映射
  • container_name: 指定容器名称
  • restart: 
    •   no是默认的重启策略,在任何情况下都不会重启容器。
    • always指定时,容器总是重新启动。
    • on-failure如果退出代码指示失败错误,则该策略会重新启动容器。
    • unless-stopped总是重新启动容器,除非容器停止(手动或其他方式)。

          

常用命令:

docker-compose -f docker-compose-dev.yml config

-f: 指定配置文件
-p: 指定项目名称

config:不会执行真正的操作,而是显示docker-compose程序解析的配置文件内容

示例:

docker-compose -p testnet -f docker-compose-net.yml up -d

常用服务:

elasticsearch:

version: "3.9"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.23
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      # docker cp elasticsearch:/usr/share/elasticsearch/config/ ./es/
      - ./es/config:/usr/share/elasticsearch/config
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - elastic

networks:
  elastic:

更多参考项: Docker Compose 配置文件 docker-compose.yml 详解 - 云+社区 - 腾讯云 (tencent.com)