随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

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)

 

posted on   池塘里洗澡的鸭子  阅读(11045)  评论(0编辑  收藏  举报
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示