一份标准配置文件应该包含 version、services、networks 三大部分。version 定义了版本信息,services 定义了服务的配置信息,包含应用于该服务启动的每个容器的配置,最后networks 定义了网络信息,提供给 services 中的 具体容器使用,类似于命令行的 docker network create。其中,services和networks是比较重要的部分。

 

下面先来看一个列子: 

version: '3.7'
services:
  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ~/data/db:/data/db
    networks:
      - webapp-network

  web:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: web-backend
    restart: on-failure
    environment:
      PORT: 5000
      WAIT_HOSTS: mongodb:27017
      MONGODB_URI: mongodb://mongodb:27017/myblog_db2
    depends_on:
      - mongodb
    ports:
      - 5000:5000
    networks:
      - webapp-network

networks:
  webapp-network:
    driver: bridge

首先来说一下版本号。V1 版本的 docker-compose.yml 文件格式主要区别就是: 没有 services 声明 ,不支持 depends_on ,不支持命名的 volumes, networks, build arguments 声明 。而V2版本仅支持单机模式,V3版本支持单机模式也支持多机模式。例子中这里我们使用的是V3。

接下来是services,这里面包含很多子的服务,是多个容器的集合。下面来详细讲解services里面会用到标签有哪些。

1. image:指定服务所使用的镜像,如果本地不存在,拉取镜像。

2. build:有时候我们可能不是使用dockerhub里面的镜像,这个时候就需要使用我们自己编写的Dockerfile里自定义的镜像。如何编写Dockerfile可以参看我的其他文章。build又有两个自标签:context和dockerfile。context是用于指定上下文目录路径,dockerfile是用于指定我们所使用的Dockerfile的路径,可以是相对路径,也可以是绝对路径。

3.container_name:指定容器的名称。

4.restart:重启策略。

restart: "no"         # no是默认的重启策略,在任何情况下都不会重启容器。 

restart: always     # 指定为always时,容器总是重新启动。如果手动kill容器,则无法自动重启。

restart: on-failure   # 如果退出代码指示出现故障错误,则on-failure将重新启动容器。

restart: unless-stopped # 在容器已经stop掉或Docker stoped/restarted的时候才重启容器。

这个restart在3.7中已经被restart_policy所替代,具体参数如下:

condition:值可以为 none 、on-failure 以及 any(默认)
delay: 尝试重启的等待时间,默认为 0
max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。
windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。

5. depends_on:解决了容器的依赖、启动先后的问题。该容器会在deponds_on中的容器启动后,才执行启动。

6. ports:指定端口号。使用HOST:CONTAINER格式。

7.env_file:定义一个专门存放变量的文件。.env文件。

8.environment :设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置。和Dockerfile 中的 ENV 指令类似。

9.volumes:挂载一个目录或者一个已存在的数据卷容器,使用 HOST:CONTAINER 这样的格式。

10. links:已经不推荐使用了,可以使用networks。连接需要使用的其他容器。

11.external_links:在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要external_links。它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。

12. networks:顶级的networks用于声明有哪些网络。子networks用于指明该容器加入哪个网络中。

 

以上就是本次例子中想要分享的一些标签,更多的标签可以去官网的api文档中查看。以后有使用到更多的标签,还会再进行补充,有不同的欢迎留言讨论。

 

参考链接:

1. https://docs.docker.com/compose/compose-file/

2. https://blog.csdn.net/liguangxianbin/article/details/79492866

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐