0


【Docker】 Docker Compose 文件编写

编写 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:13environment:# 设置环境变量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.9command: 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:13environment: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.4volumes:- 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.7environment: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.7environment: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.ymlservices:web:build:args:NODE_ENV: development
    volumes:- ./src:/app/src  # 绑定主机目录以便实时更新

在启动时,Compose 会自动合并

docker-compose.yml

docker-compose.override.yml

文件。

结论

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

标签: docker 容器 运维

本文转载自: https://blog.csdn.net/u013675821/article/details/140877530
版权归原作者 cangloe 所有, 如有侵权,请联系我们删除。

“【Docker】 Docker Compose 文件编写”的评论:

还没有评论