全国协议5人面授小班,企业级独立开发考核,转业者的IT软件工程师基地 登录/注册 | 如何报名
当前位置: 服务端相关   >  docker compose 配置文件指令详解
admin · 更新于 2021-08-06

1. 梳理工程中各个服务和容器的关系

Docker Compose配置文件有多个层级,直接学习指令不便于理解,通过一个熟悉的例子来掌握它是个更好的办法。

以先前的配置文件为例,从Docker Compose的角度看,多个互相关联的容器构成了一个工程。这个工程中包含应用服务app和数据缓存服务cache。

  • 缓存服务cache包含redis容器,它提供给工程中的其他容器redis服务。

  • 应用服务app中包含我们自定义的Dockerfile构建生成的容器,容器的运行依赖redis服务。

Tips: 需要注意的是,先前借用宿主机网络直接进行容器通信过于简单粗暴。我们只需要对外暴露flask 应用的 5000 端口就足够了,因此在 Docker Compose 容器编排中,需要维护额外的 Docker 网络,来处理这个工程中各容器通信。

2. 详解配置指令

这里是上一节中使用的 Docker Compose 配置文件,它包含许多内容,从每个容器的各个细节控制,到网络、数据卷等的定义。

本节我们加入了注释来快速了解它。

# 指定配置文件的版本号version: "3.8"# 服务services:
	# 服务名称cache
    cache:
     # 标明构建的镜像
      image: redis:6.0.5      # 生成的容器名称
      container_name: my_redis      # 指定网络
      networks:
          - mynetwork      # 设定挂载
      volumes:
          - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro      # 容器启动后执行命令
      command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    # 服务名称app 
    app:
      # 构建镜像
      build:
          # 指定上下文
          context: .          # 指定构建脚本
          dockerfile: ./Dockerfile-multi-stage      # 生成的容器名称
      container_name: my_hello      # 指定网络
      networks:
          - mynetwork      # 配置环境变量
      environment:
          - REDIS_HOST=my_redis      # 指名容器依赖关系
      depends_on:
          - cache      # 宿主机与容器端口映射
      ports:
          - "5000:5000"# 网络配置,与services在同一层级,注意书写格式对齐networks:
  # 标识自定义的网络,对应容器中指定的网络的名称
  mynetwork:
   # 在容器网路中展示的名称
    name: my_network    # 网络驱动类型
    driver: bridge
代码块
  • 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
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

基本的结构示意图如下:

接下来,我们认识一下这个例子中出现的一些常用指令:

2.1 version

版本号标识我们定义的 docker-compose.yml 文件内容所采用的版本,目前 Docker Compose 的配置文件已经迭代至了第三版,其所支持的功能也越来越丰富,建议使用最新的版本来定义。对照表如下:

Compose 配置文件版本Docker 版本
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
1.01.9.1.+

2.2 service

在 Docker Compose 把 service 作为配置的最小单元。使用时,我们首先要为每个服务定义一个名称,用以区别不同的服务。在这个例子里,cache、redis 就是服务的名称。虽然看上去每个 service 里的配置内容就像是在配置单个容器,但其实 service 代表的是一个应用集群的配置,这个部分我们会在后续的实战环节接触到。

2.3 image

类似于Dockerfile中的FROM指令。需要注意,一定要注明镜像的具体版本号,不要使用latest版本(不标明版本即为latest),不同的执行时间,latest指代的镜像会发生改变。准确执行唯一指定的容器才能使得整个工程正确运行。

2.4 build

build另一种指定镜像的方式,通过 build 这个配置我们能够直接采用 Dockerfile 来构建镜像,定义构建的环境目录。

如果我们通过这种方式指定镜像,那么 Docker Compose 先会帮助我们执行镜像的构建,之后再通过这个镜像启动容器。Docker Compose 我们能够指定更多的镜像构建参数,例如 Dockerfile 的文件名,构建上下文,构建参数等等。

此外,与image指令类似,我们希望Dockerfile的构建也是唯一可靠的,因此之前Dockerfile的写法也是不够稳定的,请读者自行在Dockerfile中的镜像和依赖上标明合适的版本号。

2.5 container_name

指定容器名称,如果不指定,会以<项目名称><服务名称><序号>。其中项目名称默认是当前工作目录的名字。

2.6 command

例如上面的配置里,我们希望修改 Redis 的启动命令,加入配置文件以便对 Redis 服务进行配置,那么我们可以直接通过 command 配置来修改。command会覆盖镜像中的CMD指令。

2.7 depends_on

在上面的例子里,我们的 app 依赖 cache,使用 depends_on 这个配置项,列出这个服务所有依赖的其他服务即可。在 Docker Compose 为我们启动项目的时候,会检查所有依赖,按照依赖指定的启动顺序来依次启动容器。

2.8 volumes

在 Docker Compose 里定义文件挂载的方式与 Docker里也并没有太多的区别,使用 volumes 配置可以像 docker 的 -v 选项一样来指定外部挂载和数据卷挂载。在这个例子中,我们将redis的配置文件挂载到容器中。

2.9 ports

ports 这个配置项,它是用来定义端口映射的。我们可以利用它进行宿主机与容器端口的映射,这个配置与 docker 中 -p 选项的使用方法是近似的。

2.10 environment:

设置环境变量, 类似于 Dockerfile 的 ENV

2.11 networks

网络也是容器间互相访问的桥梁,网络的配置对于多个容器组成的应用系统来说也是非常重要的。在 Docker Compose 里,我们可以为整个应用系统设置一个或多个网络。

要使用网络,我们必须先声明网络。声明网络的配置同样独立于 services 存在,是位于根配置下的 networks 配置。在上面的例子里,我们声明了网络mynetwork,在服务的配置中,直接使用networks指定mynetwork即可。

2.12 name

networks下的name的作用类似于 container_name指令,在这个例子中,mynetwork 创建的 docker 网络被命名为 my_network, 使用命令 docker network ls 可以查看到它。

3.小结

本节带领大家认识了配置文件的基本结构和常用指令,这些指令是我们构建 Docker Compose 工程中最最常用的,是指令当中的“骨干成员”,请务必要掌握它们的基本用法。


为什么选择汉码未来