携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
Docker三剑客
Compose
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml ,格式为 YAML 格式
Compose
Compose文件格式
一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则。
Compose启动两个nginx容器
image
在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下面这些格式都是可以的:
container_name:容器的名字
build
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。
也可以是相对路径,只要上下文确定就可以读取到 Dockerfile
command
使用 command 可以覆盖容器启动后默认执行的命令。 command: nginx –g daemon off; command: [nginx,-g,daemon off;]
depends_on
在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。 例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
depends_on
例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:
注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。
links
还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。
dns
指定DNS
格式
dns: 8.8.8.8
也可以是一个列表:
dns:
- 8.8.8.8
- 9.9.9.9
entrypoint
在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点,我们之前有对比过与 CMD 的区别。在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:
expose
这个标签与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上docker-compose.yml的端口映射还得ports这样的标签。
ports
映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口
volumes
挂载一个目录或者一个已存在的数据卷容器 volumes: - /var/lib/mysql #挂载匿名卷 - /opt/data:/var/lib/mysql #将宿主机的目录挂载到容器 - datavolume:/var/lib/mysql #将数据卷datavolume挂载到容器
network_mode
网络模式,与Docker client的--net参数类似 network_mode: "bridge" network_mode: "host" network_mode: "none"
environment
环境变量设置,可使用数组或字典两种方式