Docker配置⽂件详解
先来看⼀份 l ⽂件,不⽤管这是⼲嘛的,只是有个格式⽅便后⽂解说:
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
-
web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
可以看到⼀份标准配置⽂件应该包含 version、services、networks 三⼤部分,其中最关键的就是 services 和 networks 两个部分,下⾯先来看 services 的书写规则。
web:
image: hello-world
在 services 标签下的第⼆级标签是 web,这个名字是⽤户⾃⼰⾃定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下⾯这些格式都是可以的:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry:4000/postgresql
image: a4bc65fd
2. build
服务除了可以基于指定的镜像,还可以基于⼀份 Dockerfile,在使⽤ up 启动之时执⾏构建任务,这个构建标签就是 build,它可以指定Dockerfile 所在⽂件夹的路径。Compose 将会利⽤它⾃动构建这个镜像,然后使⽤这个镜像启动服务容器。
build: /path/to/build/dir
也可以是相对路径,只要上下⽂确定就可以读取到 Dockerfile。
build: ./dir
设定上下⽂根⽬录,然后以该⽬录为准指定 Dockerfile。
build:
context: ../
dockerfile: path/of/Dockerfile
注意 build 都是⼀个⽬录,如果你要指定 Dockerfile ⽂件需要在 build 标签的⼦级标签中使⽤ dockerfile 标签指定,如上⾯的例⼦。
如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后⾯的那个名字。
build: ./dir
image: webapp:tag
既然可以在 l 中定义构建任务,那么⼀定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 l ⽂件中也⽀持这样的写法:
build:
context: .
args:
buildno: 1
password: secret
下⾯这种写法也是⽀持的,⼀般来说下⾯的写法更适合阅读。
build:
context: .
args:
- buildno=1
- password=secret
与 ENV 不同的是,ARG 是允许空值的。例如:
args:
这样构建过程可以向它们赋值。
注意:YAML 的布尔值(true, false, yes, no, on, off)必须要使⽤引号引起来(单引号、双引号均可),否则会当成字符串解析。
3. command
使⽤ command 可以覆盖容器启动后默认执⾏的命令。
command: bundle exec thin -p 3000
也可以写成类似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
前⾯说过 Compose 的容器名称格式是:<;项⽬名称><;服务名称><;序号>
虽然可以⾃定义项⽬名称、服务名称,但是如果你想完全控制容器的命名,可以使⽤这个标签指定:
container_name: app
这样容器的名字就指定为 app 了。
5.depends_on
在使⽤ Compose 时,最⼤的好处就是少打启动命令,但是⼀般项⽬容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题⽽启动失败。
例如在没启动数据库容器的时候启动了应⽤容器,这时候应⽤容器会因为不到数据库⽽退出,为了避免这种情况我们需要加⼊⼀个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下⾯容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:
version: '2'
services:
web:
build: .
depends_on:
- db
-
redis
redis:
image: redis
db:
image: postgres
注意的是,默认情况下使⽤ docker-compose up web 这样的⽅式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置⽂件中定义了依赖关系。
6.dns
和 --dns 参数⼀样⽤途,格式如下:
dns: 8.8.8.8
也可以是⼀个列表:
dns:
- 8.8.8.8
- 9.9.9.9
此外 dns_search 的配置也类似:
dns_search: example
dns_search:
- ample
- ample
7. tmpfs
挂载临时⽬录到容器内部,与 run 的参数⼀样效果:
tmpfs: /run
tmpfs:
-
/run
- /tmp
8. entrypoint
在 Dockerfile 中有⼀个指令叫做 ENTRYPOINT 指令,⽤于指定接⼊点,第四章有对⽐过与 CMD 的区别。
在 l 中可以定义接⼊点,覆盖 Dockerfile 中的定义:
entrypoint: /code/entrypoint.sh
格式和 Docker 类似,不过还可以写成这样:
entrypoint:
- php
- -d
container容器用法- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
还记得前⾯提到的 .env ⽂件吧,这个⽂件可以设置 Compose 的变量。⽽在 l 中可以定义⼀个专门存放变量的⽂件。如果通过 docker-compose -f FILE 指定了配置⽂件,则 env_file 中路径会使⽤配置⽂件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。格式如下:
env_file: .env
或者根据 l 设置多个:
env_file:
- ./v
- ./v
- /v
注意的是这⾥所说的环境变量是对宿主机的 Compose ⽽⾔的,如果在配置⽂件中有 build 操作,这些变量并不会进⼊构建过程中,如果要在构建中使⽤变量还是⾸选前⾯刚讲的 arg 标签。
10. environment
与上⾯的 env_file 标签完全不同,反⽽和 arg 有⼏分类似,这个标签的作⽤是设置镜像变量,它可以保存变量到镜像⾥⾯,也就是说启动的容器也会包含这些变量设置,这是与 arg 最⼤的不同。
⼀般 arg 标签的变量仅⽤在构建过程中。⽽ environment 和 Dockerfile 中的 ENV 指令⼀样会把变量⼀直保存在镜像、容器中,类似 docker run -e 的效果。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
11. expose
这个标签与Dockerfile中的EXPOSE指令⼀样,⽤于指定暴露的端⼝,但是只是作为⼀种参考,实际上l的端⼝映射还得ports这样的标签。
expose:
- "3000"
- "8000"
12. external_links
在使⽤Docker过程中,我们会有许多单独使⽤docker run启动的容器,为了使Compose能够连接这些不在l中定义的容器,我们需要⼀个特殊的标签,就是external_links,它可以让Compose项⽬⾥⾯的容器连接到那些项⽬配置外部的容器(前提是外部容器中必须⾄少有⼀个容器是连接到与项⽬内的服务的同⼀个⽹络⾥⾯)。
格式如下:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
13. extra_hosts
添加主机名的标签,就是往/etc/hosts⽂件中添加⼀些记录,与Docker client的--add-host类似:
extra_hosts:
-
"somehost:162.242.195.82"
- "otherhost:50.31.209.229"
启动之后查看容器内部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
14. labels
向容器添加元数据,和Dockerfile的LABEL指令⼀个意思,格式如下:
labels:
labels:
- "ample.description=Accounting webapp"
- "ample.department=Finance"
- "ample.label-with-empty-value"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论