每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。
image指定镜像tag或者ID。示例:
image:redisimage:ubuntu:14.04image:tutum/influxdbimage:example-registry.com:4000/postgresqlimage:a4bc65fd注意,在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签。
build
用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。
注意,在version 1里bulid仅支持值为字符串。version 2里支持对象格式。
build:./dirbuild:context:./dirdockerfileockerfile-alternateargs:buildno:1context为路径,dockerfile为需要替换默认docker-compose的文件名,args为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。示例:
Dockerfile:
ARGbuildnoARGpasswordRUNecho"Buildnumberbuildno"RUNscript-requiring-password.sh"$password"docker-compose.yml:
build:context:.args:buildno:1password:secretbuild:context:.args:-buildno=1-password=secret
command用来覆盖缺省命令。示例:
command:bundleexecthin-p3000command也支持数组形式:
command:[bundle,exec,thin,-p,3000]links用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link。示例:
links:-db-db:mysql-redis使用了别名将自动会在容器的/etc/hosts文件里创建相应记录:
172.17.2.186db172.17.2.186mysql172.17.2.187redis所以我们在容器里就可以直接使用别名作为服务的主机名。
ports用于暴露端口。同docker run -p。示例:
ports:-"3000"-"8000:8000"-"49100:22"-"127.0.0.1:8001:8001"exposeexpose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。
expose:-"3000"-"8000"volumes挂载数据卷。同docker run -v。示例:
volumes:-/var/lib/mysql-cache/:/tmp/cache-~/configs:/etc/configs/:rovolumes_from挂载数据卷容器,挂载是容器。同docker run --volumes-from。示例:
volumes_from:-service_name-service_name:ro-container:container_name-container:container_name:rwcontainer:container_name格式仅支持version 2。
environment添加环境变量。同docker run -e。可以是数组或者字典格式:
environment:RACK_ENV:developmentSESSION_SECRET:environment:-RACK_ENV=development-SESSION_SECRETdepends_on使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动redis 和 db 两个服务,最后才启动 web 服务:
ersion:'2'services:web:build:.depends_on:-db-redisredis:image:redisdb: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.82somehost50.31.209.229otherhostextends继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
extends:file:common.ymlservice:webappservice必须有,file可选。service是需要继承的服务,例如web、database。
net设置网络模式。同docker的--net参数。
net:"bridge"net:"none"net:"container:[nameorid]"net:"host"dns自定义dns服务器。
dns:8.8.8.8dns:-8.8.8.8-9.9.9.9完整列子:
zookeeper:image:ce3dc5339ed2#指定为镜像名称或镜像IDprivileged:falserestart:always#默认值为no,即在任何情况下都不会重新启动容器;当值为always时,容器总是重新启动;当值为on-failure时,当出现on-failure#报错容器退出时,容器重新启动。log_driver:json-file#默认的driver是json-file。只有json-file和journald可以通过docker-composelogs显示日志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吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Dockerclient的--link一样效果,会连接到其它服务中的容器。#格式如下:#links:#-db#-db:database#-redis#使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:#172.12.2.186db#172.12.2.186database#172.12.2.187redissso:image:698063d64ab5privileged:falserestart:alwayslog_driver:json-fileports:-172.16.0.13:7000/tcp:7000/tcp-172.16.0.13:10000/tcp:10000/tcpvolumes:-/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.shenvironment:-.utf8-TZ=Asia/Shanghai-DEBUGPORT=10000-CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom |