每个docker-compose.yml必须定义image
或者build
中的一个,其它的是可选的。
指定镜像tag或者ID。示例:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
build
用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。
注意,在version 1
里bulid
仅支持值为字符串。version 2
里支持对象格式。
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:
build:
context: .
args:
buildno: 1
password: secret
build:
context: .
args:
- buildno=1
- password=secret
用来覆盖缺省命令。示例:
command: bundle exec thin -p 3000
command
也支持数组形式:
command: [bundle, exec, thin, -p, 3000]
用于链接另一容器服务,如需要使用到另一容器的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
所以我们在容器里就可以直接使用别名作为服务的主机名。
用于暴露端口。同docker run -p
。示例:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose
。
expose:
- "3000"
- "8000"
挂载数据卷。同docker run -v
。示例:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
挂载数据卷容器,挂载是容器。同docker run --volumes-from
。示例:
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name
格式仅支持version 2
。
添加环境变量。同docker run -e
。可以是数组或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
使用 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 两个服务,因为在配置文件中定义了依赖关系。
链接搭配docker-compose.yml
文件或者Compose
之外定义的服务,通常是提供共享或公共服务。格式与links
相似:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意,external_links
链接的服务与当前服务必须是同一个网络环境。
添加主机名映射。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229
将会在/etc/hosts
创建记录:
162.242.195.82 somehost 50.31.209.229 otherhost
继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。
extends:
file: common.yml
service: webapp
service
必须有,file
可选。service
是需要继承的服务,例如web
、database
。
设置网络模式。同docker的--net
参数。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
自定义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
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。