【Docker】 Docker Compose 文件编写

avatar
作者
筋斗云
阅读量:0

编写 Docker Compose 文件可以帮助我们简化和管理多容器应用程序的部署。Docker Compose 使用 docker-compose.yml 文件来定义和运行多个 Docker 容器,从而使得复杂的多服务应用程序能够轻松启动和维护。在本文中,我们将详细介绍 Docker Compose 文件的编写,包括其基本结构、各项配置、常用示例以及一些优化技巧。

Docker Compose 文件基础结构

Docker Compose 文件通常使用 YAML 格式编写,主要包含以下几个关键部分:

  • version:定义 Docker Compose 文件使用的版本。
  • services:定义服务及其配置。
  • networks:定义自定义网络(可选)。
  • volumes:定义数据卷(可选)。
  • configssecrets:用于定义和管理配置和机密信息(可选)。

基本结构示例

version: '3.9'  # 指定 Docker Compose 文件版本  services:   web:  # 定义服务名     image: nginx:latest  # 使用的镜像     ports:       - "8080:80"  # 映射端口     volumes:       - ./html:/usr/share/nginx/html  # 挂载数据卷     networks:       - webnet  # 连接到的网络    database:     image: postgres:13     environment:  # 设置环境变量       POSTGRES_USER: example       POSTGRES_PASSWORD: example       POSTGRES_DB: example_db     volumes:       - db_data:/var/lib/postgresql/data     networks:       - webnet  networks:   webnet:  # 定义自定义网络  volumes:   db_data:  # 定义数据卷 

Docker Compose 文件版本

Docker Compose 支持多个版本,每个版本支持的功能和格式可能有所不同。常见的版本有:

  • Version 1:最早的版本,语法简单,不推荐使用。
  • Version 2.x:增加了网络和数据卷支持,适合简单的多容器应用。
  • Version 3.x:支持更多特性,如 Docker Swarm 集群模式,更适合生产环境。

推荐使用最新的版本,以获得最新的功能和改进。

services:定义服务

services 部分用于定义应用程序中的各个服务(容器)。每个服务可以包含以下配置项:

1. image

image 指定服务使用的 Docker 镜像,可以是官方镜像或自定义镜像。

services:   web:     image: nginx:latest 

2. build

build 用于构建自定义镜像,通常与 Dockerfile 配合使用。

services:   app:     build:       context: ./app  # Dockerfile 所在目录       dockerfile: Dockerfile  # 可选,指定 Dockerfile 名称       args:  # 构建时的参数         APP_VERSION: 1.0 
示例
services:   web:     build: .     args:       BUILD_NUMBER: 123 

3. command

command 用于覆盖 Docker 镜像中定义的默认命令。

services:   app:     image: python:3.9     command: python app.py 

4. ports

ports 用于暴露服务端口,以便外部访问。格式为 HOST:CONTAINER

services:   web:     image: nginx:latest     ports:       - "8080:80"  # 将宿主机的 8080 端口映射到容器的 80 端口       - "443:443" 

5. volumes

volumes 用于将主机目录或命名卷挂载到容器中,以实现数据持久化。

services:   web:     image: nginx:latest     volumes:       - ./html:/usr/share/nginx/html  # 主机目录挂载到容器       - db_data:/var/lib/mysql  # 命名卷 

6. environment

environment 用于定义服务的环境变量,可以是键值对格式或 .env 文件。

services:   database:     image: postgres:13     environment:       POSTGRES_USER: user       POSTGRES_PASSWORD: password 

7. env_file

env_file 用于指定包含环境变量的文件,适用于需要大量变量的情况。

services:   app:     image: myapp:latest     env_file:       - .env 

8. networks

networks 用于将服务连接到一个或多个自定义网络。

services:   web:     image: nginx:latest     networks:       - webnet    app:     image: myapp:latest     networks:       - webnet       - backend  networks:   webnet:   backend: 

9. depends_on

depends_on 用于定义服务启动顺序。

services:   web:     image: nginx:latest     depends_on:       - app    app:     image: myapp:latest 

注意depends_on 并不等待依赖服务完全启动,只是保证启动顺序。如果需要保证服务完全启动后再启动其他服务,可以使用 wait-for-it 脚本或其他工具。

10. restart

restart 用于定义服务的重启策略。

services:   web:     image: nginx:latest     restart: always  # 始终重启    app:     image: myapp:latest     restart: on-failure  # 仅失败时重启 

11. healthcheck

healthcheck 用于定义服务的健康检查机制。

services:   web:     image: nginx:latest     healthcheck:       test: ["CMD", "curl", "-f", "http://localhost"]       interval: 30s       timeout: 10s       retries: 3 

12. logging

logging 用于配置日志驱动和选项。

services:   web:     image: nginx:latest     logging:       driver: json-file       options:         max-size: "10m"         max-file: "3" 

13. extra_hosts

extra_hosts 用于添加主机名解析。

services:   web:     image: nginx:latest     extra_hosts:       - "myhost:192.168.1.10" 

14. secrets

secrets 用于将机密信息注入到服务中。

services:   app:     image: myapp:latest     secrets:       - my_secret  secrets:   my_secret:     file: ./secret.txt 

15. configs

configs 用于将配置文件注入到服务中,通常用于集群模式。

services:   app:     image: myapp:latest     configs:       - source: my_config         target: /etc/config  configs:   my_config:     file: ./config.yml 

volumes:定义数据卷

volumes 部分用于定义全局数据卷,以便服务挂载和共享数据。

volumes:   db_data:   app_data:     driver: local 

networks:定义网络

networks 部分用于定义自定义网络,以便服务之间通信。

networks:   webnet:   backend:     driver: bridge 

完整示例

示例 1:简单的 Web 应用

以下是一个简单的 Node.js 和 MongoDB 应用程序的 Docker Compose 文件示例:

version: '3.9'  services:   web:     build: ./web  # 指定构建目录     ports:       - "3000:3000"     depends_on:       - mongo     networks:       - app_net    mongo:     image: mongo:4.4     volumes:       - mongo_data:/data/db     networks:       - app_net  volumes:   mongo_data:  networks:   app_net: 

示例 2:WordPress 和 MySQL

以下是一个 WordPress 和 MySQL 的 Docker Compose 文件示例:

version: '3.9'  services:   wordpress:     image: wordpress:latest     ports:       - "8080:80"     environment:       WORDPRESS_DB_HOST: db       WORDPRESS_DB_USER: exampleuser       WORDPRESS_DB_PASSWORD: examplepass       WORDPRESS_DB_NAME: exampledb     volumes:       - wordpress_data:/var/www/html     networks:       - wp_net    db:     image: mysql:5.7     environment:       MYSQL_DATABASE: exampledb       MYSQL_USER: exampleuser       MYSQL_PASSWORD: examplepass       MYSQL  _ROOT_PASSWORD: somewordpress     volumes:       - db_data:/var/lib/mysql     networks:       - wp_net  volumes:   wordpress_data:   db_data:  networks:   wp_net: 

示例 3:React、Node.js 和 Redis 应用

version: '3.9'  services:   frontend:     build: ./frontend     ports:       - "3000:3000"     networks:       - react_net    backend:     build: ./backend     ports:       - "5000:5000"     depends_on:       - redis     networks:       - react_net    redis:     image: redis:alpine     networks:       - react_net  networks:   react_net: 

Docker Compose 命令

在编写完 docker-compose.yml 文件后,可以使用以下命令来管理和运行多容器应用:

  • docker-compose up:启动并运行所有服务。
  • docker-compose down:停止并删除所有服务和网络。
  • docker-compose build:构建或重新构建服务。
  • docker-compose start:启动已存在的服务。
  • docker-compose stop:停止运行的服务。
  • docker-compose restart:重启服务。
  • docker-compose logs:查看服务日志。
  • docker-compose exec <service> <command>:在运行的容器中执行命令。
  • docker-compose ps:列出项目中正在运行的容器。

Docker Compose 文件优化技巧

1. 使用 .env 文件

.env 文件用于存储环境变量,以避免在 docker-compose.yml 中硬编码敏感信息。

# .env 文件示例 MYSQL_USER=exampleuser MYSQL_PASSWORD=examplepass 

docker-compose.yml 中引用:

services:   db:     image: mysql:5.7     environment:       MYSQL_USER: ${MYSQL_USER}       MYSQL_PASSWORD: ${MYSQL_PASSWORD} 

2. 合理利用 build 缓存

在构建镜像时,可以利用 Docker 缓存来加快构建速度:

  • 将不常更改的命令放在 Dockerfile 顶部。
  • 使用构建参数(ARG)来控制缓存失效。
services:   app:     build:       context: .       dockerfile: Dockerfile       args:         CACHEBUST: 1  # 控制缓存失效 

3. 使用多阶段构建

多阶段构建可以帮助减少镜像体积,尤其是对于需要编译的语言,如 Go 和 Java:

services:   app:     build:       context: .       target: production  # 指定构建阶段 

4. 使用 docker-compose.override.yml

docker-compose.override.yml 文件用于覆盖默认配置,通常用于开发环境。

# docker-compose.override.yml services:   web:     build:       args:         NODE_ENV: development     volumes:       - ./src:/app/src  # 绑定主机目录以便实时更新 

在启动时,Compose 会自动合并 docker-compose.ymldocker-compose.override.yml 文件。

结论

编写 Docker Compose 文件是一种有效管理和部署多容器应用的方法。通过合理配置和优化,可以轻松实现应用的快速部署、扩展和维护。在实际应用中,你可以根据需求选择合适的配置项和优化策略,从而提高应用的性能和稳定性。希望本文能帮助你更好地理解和编写 Docker Compose 文件。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!