docker-compose配置文件详解
Docker Compose是使用yml文件来定义多个容器关系,因此掌握docker-compose.yml文件的写法能更好书写配置文件,方便管理多容器应用。其通过定义解析容器依赖关系来按顺序启动容器。
Compose配置文件中定义的每个服务都必须通过image标签指定镜像或build标签来执行构建。对于上下文中存在的Dockerfile使用compose命令时,其中的指令依然有效而不必在配置文件中重写设定。例如,在Dockerfile中定义的变量可以在docker-compose.yml文件中使用,用法就如shell脚本写法一样,形如${}即可。
以官网提供案例Compose specification | Docker Documentation为例,详解docker-compose.yml基本配置,如下:
1、指定服务使用的镜像:image
在services标签下的二级标签是frontend/backtend,这个名字是用户自定义的,它就是服务名。image则指定服务的镜像名称或者ID。如果镜像在本地不存在,Compose江汉参数拉取这个镜像。
2、指定构建上下文:build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up命令启动指示执行构建任务,这个构建标签就是build——它可以指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。其路径格式可以如下:
1)绝对路径:
build: /path/to/build/dir
2)相对路径:
build: ./dir
3)设定上下文根目录,再以此目录为准指定Dockerfile:
build:
context: ../
dockerfile: path/of/Dockerfile
如果同时指定了image和build两标签,那么Compose会构建镜像并且吧镜像命名为image后面的名字。
3、指定服务镜像启动命令:command
使用该命令可以覆盖容器启动后默认执行的命令(容器默认启动的命令有哪些呢?)
4、指定运行服务的容器名称:container_name
默认容器名称格式是<项目名>_<服务名>_<序号>。虽然可以自定义,但是如果想网桥控制容器的命名就得使用该命令指定容器名称:
container_name: app
5、指定服务依赖关系:depends_on
使用Compose最大的优势在于减少使用繁琐的启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没有启动数据库容器的时候启动了应用容器,这时候应用容器因为找不到数据库而退出(与非容器启动项目一样)。为了避免此种情况,得找到解决方案:加入一个标签,就是depends_on。该标签解决了容器依赖,启动先后顺序的问题。
如docker-compose实战之Nginx反向代理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中配置文件就使用了该标签:tomcat的启动依赖于nginx,即确保nginx启动成功tomcat才会启动。
如果docker-compose up 指定启动tomcat1,nginx也会启动。因为配置文件中定义了依赖关系,对于存在依赖关系的应用默认启动。
6、设置环境变量:environment
其与env_file标签完全不同,反而与arg有几分类似,作用就是设置环境变量。它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置——这也是其与arg最大的不同。
一般情况下arg标签的变量仅用在构建过程中,而environment和Dockerifle中的ENV指令一样会把变量一直保存在镜像、容器中,类似docker run -e的效果。
那么对于不同的镜像,这个标签下可以使用哪些环境变量呢?以MySQL为例,通过官网查看如下:
Mysql - Official Image | Docker Hub====>找到Environment Variables,其下就是MySQL在该标签下可以使用的变量:
对于自定义容器的环境变量设置可以参考Docker应用之部署微服项目 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中最后访问MySQL数据库url的设置。
7、设置容器互联:links
depends_on标签解决了启动顺序的问题,而links标签解决的事容器连接问题。
不过需要注意书写格式,例如上图中wordpress容器启动时理想结果会自动连接到db容器,但实际结果却是:
就是-db应该是- db,中间要有空格,如下:
其他需要提供list数据的标签,也应该注意,如depends_on等。
8、指定端口暴露:expose
该标签与Dockerfile中的EXPOSE指令一眼,用于指定暴露的端口——expose暴露当前容器的端口给其他的容器,或者暴露给同一个networks的容器。比如:
expose:
- "3000"
- "8000"
以上指令就是将当前容器端口3000和8000暴露给其他容器。
9、设置服务容器的端口映射:ports:
实际上expose暴露端口只能作为一种参考,docker-compose.yml的端口映射还需要ports作为映射端口的标签。其使用格式为:HOST:CONTAINER或者只指定容器的端口,宿主机会随机映射端口,可参考如下:
ports:
- "3000"
- "8000:8000"
- "127.0.0.1:8001:8001"
其与expose标签的区别是,expose不会将端口暴露给主机,主机无法访问expose的端口。简而言之就是:expose适用于容器之间,而ports暴露端口访问除了容器之间还包含容器与宿主机之间。
需要注意的是,当使用HOST:CONTAINER隐式端口时,尽量使用字符串格式。因为YAML使用60进制解析这种数字格式,如果容器端口小于60,可能会得到错误的结果。
还有其他很多配置,如:指定服务的DNS配置:dns;挂载临时目录:tmpfs;指定服务镜像的接入点:entrypoint;设置compose变量:env_file;选择项目外的容器:external_links;扩展连接服务器的hosts列表:extra_hosts;添加元数据:labels;配置服务日志:logging……等此处不详述,后续使用过程中详细阐述。
除了以上基本配置,还有网络配置,参考Docker网络之网络配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步