Docker Compose 配置文件 Docker-Compose.yml 文件详解

每一个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。java

image

指定镜像tag或者ID。示例:mysql

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

注意,在version 1里同时使用imagebuild是不容许的,version 2则能够,若是同时指定了二者,会将build出来的镜像打上名为image标签。web

buildredis

用来指定一个包含Dockerfile文件的路径。通常是当前目录.。Fig将build并生成一个随机命名的镜像。sql

注意,在version 1bulid仅支持值为字符串。version 2里支持对象格式。
docker

build: ./dir

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

context为路径,dockerfile为须要替换默认docker-compose的文件名,args为构建(build)过程当中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。示例:
Dockerfile:数据库

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

docker-compose.yml:json

build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  context: .
  args:
    - buildno=1
    - password=secret

command

用来覆盖缺省命令。示例:ubuntu

command: bundle exec thin -p 3000

command也支持数组形式:数组

command: [bundle, exec, thin, -p, 3000]

links

用于连接另外一容器服务,如须要使用到另外一容器的mysql服务。能够给出服务名和别名;也能够仅给出服务名,这样别名将和服务名相同。同docker run --link。示例:

links:
 - db
 - db:mysql
 - redis

使用了别名将自动会在容器的/etc/hosts文件里建立相应记录:

172.17.2.186  db
172.17.2.186  mysql
172.17.2.187  redis

因此咱们在容器里就能够直接使用别名做为服务的主机名。

ports

用于暴露端口。同docker run -p。示例:

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

expose

expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose

expose:
 - "3000"
 - "8000"

volumes

挂载数据卷。同docker run -v。示例:

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

volumes_from

挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:

volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw

container:container_name格式仅支持version 2

environment

添加环境变量。同docker run -e。能够是数组或者字典格式:

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

depends_on

使用 Compose 时,最大的好处就是少打启动命令,可是通常项目容器启动的顺序是有要求的,若是直接从上到下启动容器,必然会由于容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会由于找不到数据库而退出,为了不这种状况咱们须要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动前后的问题。
例以下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

ersion: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默认状况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,由于在配置文件中定义了依赖关系。

external_links

连接搭配docker-compose.yml文件或者Compose以外定义的服务,一般是提供共享或公共服务。格式与links类似:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

注意,external_links连接的服务与当前服务必须是同一个网络环境。

extra_hosts

添加主机名映射。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229

将会在/etc/hosts建立记录:

162.242.195.82  somehost
50.31.209.229   otherhost

extends

继承自当前yml文件或者其它文件中定义的服务,能够选择性的覆盖原有配置。

extends:
  file: common.yml
  service: webapp

service必须有,file可选。service是须要继承的服务,例如webdatabase

net

设置网络模式。同docker的--net参数。

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

dns

自定义dns服务器。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

完整列子:

zookeeper:
  image: ce3dc5339ed2
  #指定为镜像名称或镜像 ID
  privileged: false
  restart: always
 # 默认值为 no ,即在任何状况下都不会从新启动容器;当值为 always 时,容器老是从新启动;当值为 on-failure 时,当出现 on-failure #报错容器退出时,容器从新启动。
  log_driver: json-file
  #默认的driver是json-file。只有json-file和journald能够经过docker-compose logs显示日志
  ports:
  - ip::2181/tcp:2181/tcp
   #暴露端口信息。
   #使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)均可以。
   # - "3000"
   #- "8000:8000"
   #- "127.0.0.1:8001:8001"
   #注:当使用 HOST:CONTAINER 格式来映射端口时,若是你使用的容器端口小于 60 你可能会获得错误得结果,由于 YAML 将会解析 xx:yy 这种数字格式为 60 进制。因此建议采用字符串格式。
  volumes:
  - /data/zookeeper/logs/:/zookeeper/logs/
  - /data/zookeeper/data/:/zookeeper/data/
  - /data/zookeeper/conf/:/zookeeper/conf/
 # 挂载一个目录或者一个已存在的数据卷容器,能够直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来讲,数据卷是只读的,这样能够有效保护宿主机的文件系统。
  #Compose的数据卷指定路径能够是相对路径,使用 . 或者 .. 来指定相对目录。
  #卷挂载路径设置。能够设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
  command: /root/zookeeper.sh 
  #覆盖容器启动后默认执行的命令。
  environment:
  -.utf8
  - TZ=Asia/Shanghai
  #设置环境变量。你可使用数组或字典两种格式。
  #只给定名称的变量会自动获取它在 Compose 主机上的值,能够用来防止泄露没必要要的数据。
   #environment:
   #- RACK_ENV=development
   #- SESSION_SECRET
   
   
  # depends_on
   #在使用 Compose 时,最大的好处就是少打启动命令,可是通常项目容器启动的顺序是有要求的,若是直接从上到下启动容器,必然会由于容器依赖问题而启动失败。
#例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会由于找不到数据库而退出,为了不这种状况咱们须要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动前后的问题。
  #例以下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:
 #version: '2'
 #services:
  # web:
   #  build: .
   #  depends_on:
   #    - db
   #    - redis
   #redis:
    # image: redis
  # db:
    # image: postgres

    
    
  #links
 #还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器链接问题,与Docker client的--link同样效果,会链接到其它服务中的容器。
  #格式以下:
  #links:
   #- db
    #- db:database
    #- redis
 #使用的别名将会自动在服务容器中的/etc/hosts里建立。例如:
  #172.12.2.186  db
  #172.12.2.186  database
  #172.12.2.187  redis

sso:
  image: 698063d64ab5
  privileged: false
  restart: always
  log_driver: json-file
  ports:
  - 172.16.0.13:7000/tcp:7000/tcp
  - 172.16.0.13:10000/tcp:10000/tcp
  volumes:
  - /data/tomcat/sso/logs/:/tomcat/logs/
  - /data/tomcat/sso/server.xml:/tomcat/conf/server.xml
  - /data/tomcat/sso/catalina.sh:/tomcat/bin/catalina.sh
  - /data/tomcat/sso/sso.properties:/tomcat/webapps/sso/WEB-INF/classes/sso.properties
  - /data/webapps/sso/:/tomcat/webapps/sso/
  command: /root/tomcat.sh
  environment:
  -.utf8
  - TZ=Asia/Shanghai
  - DEBUGPORT=10000
  - CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom
相关文章
相关标签/搜索