CodeGym /课程 /Docker SELF /创建docker-compose.yml

创建docker-compose.yml

Docker SELF
第 15 级 , 课程 2
可用

3.1 文件 compose.yaml

文件 compose.yaml (或者以下任意一种:docker-compose.yaml, docker-compose.yml, compose.yml)是一个主要的配置文件,Docker Compose用它来定义和管理多容器的应用程序。它描述了哪些容器(服务)需要运行、它们如何互相交互以及它们需要的资源。

为了统一,这节课我们会用compose.yaml这个版本,因为它是现代版本Docker Compose推荐的格式。

文件 compose.yaml 的结构

文件 compose.yaml 包含多个部分,每个部分描述应用程序配置的不同方面。主要的部分包括:

  1. version: 指定Compose文件的版本(比如'3.9')。
  2. services: 描述容器(服务)的设置和依赖关系。
  3. volumes: 定义容器和主机之间共享数据的存储卷。
  4. networks: 配置服务之间通信的网络。

3.2 基本指令

1. version

version指令定义了文件compose.yaml中使用的Docker Compose语法版本。截至本文撰写时,最流行的是版本3,特别是更新的3.8和3.9。

Yaml

version: '3.9'

2. services

services部分定义了Compose需要创建和运行的容器。每个service代表一个单独的容器,并具有特定的配置。

示例:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

在此示例中,定义了两个服务:webdbweb服务使用nginx:latest镜像并打开端口80。db服务使用mongo:latest镜像并连接一个用于存储数据的卷。

3. volumes

volumes部分用于定义可以连接到容器的数据卷。这对于在容器重新启动时保存数据非常有用。

示例:

Yaml

volumes:
  mongo-data:

4. networks

networks部分允许定义容器所属的自定义网络。这确保了隔离性以及网络连接的设置。如果未指定网络,Docker Compose将创建一个默认网络,所有服务都会连接到该网络。

示例:

Yaml

networks:
  front-end:
  back-end:

3.3 配置服务的指令

配置服务的主要指令:

1. image

指令 image 指定用于创建容器的镜像。

示例:

Yaml

services:
  web:
    image: nginx:latest

2. build

指令 build 用于指定 Dockerfile 的路径,用于构建镜像。

示例:

Yaml

services:
  app:
    build: ./app

3. ports

指令 ports 定义主机与容器之间的端口映射。

示例:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

指令 volumes 将卷挂载到容器中,允许在容器重启之间保留数据。

示例:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

指令 environment 为容器设置环境变量。

示例:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

指令 depends_on 指出该服务依赖于其他服务,并应在它们之后启动。

重要! 启动服务时,不能100%保证所有必需的服务完全准备好。它们会启动——没错,但后续的运行稳定性不一定得到保证。这个问题可以通过 health-check 解决,但我们稍后会谈到。

示例:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

指令 command 允许覆盖容器启动时执行的命令。

示例:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

指令 networks 将服务连接到一个或多个网络。

示例:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 完整示例

完整的 compose.yaml 文件示例

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

在这个示例中:

  • 定义了三个服务:webappdb
  • web 使用 Nginx 镜像,挂载配置文件,并依赖于服务 app
  • app 从本地 Dockerfile 构建,挂载应用程序源代码,并使用环境变量。
  • db 使用 MongoDB 镜像,并挂载一个用来存储数据的卷。
  • 创建了两个卷和两个网络,用于隔离和管理服务之间的交互。

注意:一个卷是 mongo-data,另一个是从主机机器挂载的目录(例如 ./app)。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION