掘金 后端 ( ) • 2024-04-19 16:34

Docker Compose配置文件使用YAML语法,并具有一组语法规则和作用。用于定义多容器的组成、依赖关系、网络、卷等。以下是Docker Compose文件的主要语法规则和作用:

  1. version: 指定Compose文件遵循的版本标准

    指定Compose文件的版本。例如:"version: '3.8'"。

  2. services: 定义一组相互协作的服务

    定义要运行的服务,并配置每个服务的属性。每个服务都有一个唯一的名称,可以指定镜像、端口映射、环境变量等。例如:

    services: web: image: nginx:latest ports: - "80:80" environment: - HELLO=value定义一个服务名为web,镜像nginx,宿主机与容器80映射,容器内添加环境变量key为HELLO,值为value。

  3. networks:

    定义网络配置,用于连接不同的服务。可以为每个网络指定一个唯一的名称,并配置网络驱动、IP范围等。例如:

    networks: frontend: backend:

  4. volumes: 定义数据卷

    定义卷配置,用于持久化数据或共享数据。可以为每个卷指定一个唯一的名称,并配置卷的类型、路径等。例如:

    volumes: data:

在需要绑定卷的服务上进行挂载。

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    environment:
      - HELLO=value
    volumes:
      - data:/usr/local/nginx/html在服务中挂载data卷到容器内/usr/local/nginx/html目录。
  1. build: 指定如何从Dockerfile构建服务镜像

    定义构建服务镜像的配置。可以指定Dockerfile的路径、构建上下文、构建参数等。例如:

    services: app: build: context: . dockerfile: Dockerfile​

使用build配置来构建该服务的镜像,context指定了构建上下文的路径,dockerfile指定了Dockerfile的路径。

  1. depends_on: 表明服务间的依赖关系

    定义服务之间的依赖关系。可以确保在启动服务之前启动其所依赖的服务。例如:

    services: app: depends_on: - db

服务app依赖与db服务,db达到健康状态,开始启动app服务。

  1. environment: 设置服务的环境变量

    定义服务的环境变量。可以为服务设置一个或多个环境变量。例如:

    services: app: environment: - HELLO=value

  2. ports:映射服务内部端口到主机端口,实现外部访问容器内部服务。

    定义端口映射配置,用于将主机的端口映射到容器的端口。可以指定主机端口和容器端口的映射关系。例如:

    services: app: ports: - "8080:80"

宿主机8080与服务app80端口映射。

  1. restart: 设定服务的重启策略

    定义服务的重启策略。可以指定条件,在满足条件时自动重启服务。例如:

    services: app: restart: always

重启策略指定为always无论什么状态停止,都会重新启动。

重启策略还有其他选项,no,表示不重启,默认值。on-failure,表示非0状态停止时,进行重启。unless-stopped,表示手动停止时,不会被重启。当意外退出停止时,Docker Compose会进行重启。

  1. expose :仅向同一网络中的其他容器公开服务端口,不映射到主机端口

    暴露容器内部端口给其他容器,不映射到宿主机。

  2. links (已废弃):

    声明服务之间的连接。已废弃。Docker Compose会使用DNS进行映射每个服务,使用服务名即可连接。比如nginx容器内的ip为172.25.0.2,db容器内的ip为172.25.0.5,可以使用服务名进行互相访问,尝试使用ping进行验证,nginx访问db,不需要知道db的ip地址,使用db就可访问。

  3. healthcheck:配置服务健康检查机制

    healthcheck:
      test: [ "CMD-SHELL", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    
  • test: 使用CMD-SHELL执行命令pg_isready来检查数据库是否准备就绪。pg_isready是postgresql用于检查是否是用的程序。运行效果如下,

    pg_isready:5432 - 接受连接
    

    Redis、MySQL也提供了检查可用状态的程序,

    Redis使用redis-cli ping

    MySQL使用mysqladmin ping

  • interval: 每隔10秒执行一次健康检查。

  • timeout: 每次健康检查的超时时间为5秒。

  • retries: 如果连续5次健康检查失败,则认为服务不健康。

在依赖于该服务的服务中来要指定依赖于该服务,条件设置为心跳检测,如下,

    depends_on:
      db:
        condition: service_healthy

以上是Compose文件中常用的语法规则和作用。根据具体的需求和场景,可以使用不同的配置选项来定义和配置服务,达成自己是需要。

一个Docker Compose代码示例。

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - 8080
    ports:
      - 8080:8080
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres
    user: "postgres"
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      POSTGRES_PASSWORD: "abc123"
      POSTGRES_USER: postgres
      POSTGRES_DB: hello
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - 5432:5432
volumes:
  db-data:

db使用心跳检测,并在依赖db的服务中设置依赖条件。解决app在连接db时,db达到可用状态。

这份示例代码(含app代码、Dockerfile、docker-compose.yaml)存放在Gitee仓库https://gitee.com/ft/hello-go-db.git,可供下载、克隆和实验性修改,以便深入了解各个配置项的实际作用。

docker compose down           // 停止Docker Compose启动的服务,删除由Compose生成的网络和卷
docker compose down --volumes // 停止Docker Compose启动的服务,同时删除卷
docker-compose up	      // 启动Docker Compose定义的服务
docker-compose up -d	      // 启动Docker Compose定义的服务,在后台运行通过执行docker-compose命令(如docker-compose up、docker-compose down等)可以便捷地启动、停止、销毁由Compose文件定义的整个应用栈。

通过使用Docker Compose配置文件,定义多容器应用的构成、服务间的依赖关系、网络配置、数据卷方便对多个容器进行管理。

读完后,忍不住要加个关注!不是我吹,但你会后悔没关注的!