Docker Compose相关参数

我与影子孤独终老i 提交于 2019-12-09 15:59:45

Compose和Docker版本兼容性对应关系如下:在这里插入图片描述

docker compose的顶级配置项有:

  1. version 定义了版本信息
  2. services 定义了服务的配置信息
    services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create
  3. networks 定义了网络信息,提供给 services 中的 具体容器使用
    networks 的定义类似于命令行的 docker network create
  4. volumes 定义了卷信息,提供给 services 中的 具体容器使用
    volumes 的定义类似于命令行的 docker volume create

services 常用相关配置

  1. container_name
    指定容器名称。默认将会使用项目名称服务名称序号
container_name: nginx-front
#指定容器名称后,该服务将不允许进行扩展(scale),因为Docker不允许多个容器具有相同的名称。
  1. labels
    定义容器的元数据(metadata)信息。例如可以为容器添加辅助说明信息
labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "test department"
  com.startupteam.release: "rc3 for v1.0"

3.构建过程中应用到的相关配置项
每个服务都必须通过 image 来指定镜像或 build 指令(需要 Dockerfile文件)等来自动构建生成镜像
如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置
image用法
指定镜像名称或镜像 ID。如果该镜像在本地不存在,Compose 将会拉取这个镜像

image: nginx:latest
image: 5673fdg8f9

build用法
类似于命令行的 docker build .
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 compose 将会利用它自动构建这个镜像,然后使用这个镜像

version: '3'
services:
  nginx-front:
    build: ./test
    也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。同时使用 dockerfile 指令指定 Dockerfile 文件     名
version: '3'
services:
  nginx-front:
    build:
      context: ./test
      dockerfile: Dockerfile-nginx
     如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 nginx-front:tag命名  
build: ./test
image: nginx-front:tag

4 . command
command指令可以覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000
  也可以写成类似 Dockerfile 中的格式
command: [bundle, exec, thin, -p, 3000]
  1. depends_on
    定于容器的依赖的其他容器及启动先后问题。以下例子中会先启动容器tomcat和redis再启动nginx
    但是并不意味着nginx-front服务会等待redis和tomcat完全启动之后才启动
version: '3'
services:
  nginx-front:
    build: ./test
    depends_on:
      - tomcat
      - redis
  redis:
    image: redis
  tomcat:
    image: tomcat

6.environment
设置环境变量。可以使用数组或字典两种格式
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据

environment:
  DEV_ENV: test
  SESSION_SECRET:
environment:
  - DEV_ENV=test
  - SESSION_SECRET
  1. ports
    映射端口信息
    宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)
ports:
 - "80"
 - "80:80"
 - "6379:6379"
 - "127.0.0.1:8080:8080"
   注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
  1. expose
    暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定容器内部的端口为参数
expose:
 - "80"
 - "443"
  1. networks
    容器需要要加入的网络,使用顶级networks 定义下的条目
services:
  nginx-front:
    networks:
     - test-network
...
networks:
  test-network:

10.extra_hosts
类似Docker中的 --add-host 参数,指定container额外的host解析

extra_hosts:
 - "registry.yun-ti.com:192.168.0.50"
 - "code.yun-ti.com:192.168.0.50"
  1. healthcheck
    通过命令检查容器是否健康运行
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 180s
  timeout: 10s
  retries: 3

volumes 常用相关配置

  1. volumes
    该指令中路径支持相对路径。数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
volumes:
 - /etc/conf
 - cache/:/tmp/cache
 - ~/home/nginxlogs:/var/logs/nginx:ro
  1. 卷的 bind 和 volume 的混合使用示例
version: "3.2"
services:
  nginx-front:
    image: nginx:alpine
    volumes:
      # 卷 (volume)
      - type: volume
        source: ngx-cfg-data
        target: /etc/nginx
        volume:
          nocopy: true
      # 挂载 (bind)
      - type: bind
        source: /home/static
        target: /usr/share/nginx/html
  mysql:
    image: mysql:5.7.3
    volumes:
      - "/var/run/mysql/mysql.sock:/var/run/mysql/mysql.sock"
      - "msyql-data:/var/lib/mysql"
volumes:
  ngx-cfg-data:
  mysql-data

容器的限制的参数

  1. ulimits
    指定容器的 ulimits 限制值。
    e.g.指定最大进程数为 65535,指定文件句柄数为65535
ulimits:
    nproc: 65535
    nofile:
      soft: 65535
      hard: 65535

2.sysctl
配置容器内核参数

sysctls:
  net.core.somaxconn: 10240
  net.ipv4.tcp_syncookies: 0
sysctls:
  - net.core.somaxconn=10240
  - net.ipv4.tcp_syncookies=0

编写一个版本 3.6的docker-compose.yml示例

version: "3.6"
services:

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

  mysql:
    image: mysql:5.7.3
    volumes:
      - db-data:/var/lib/mysql
    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:
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!