Docker Compose

Docker Compose 完整指南

1. Docker Compose 简介

1.1 什么是 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用 的工具。它使用 YAML 文件 配置应用程序的所有服务(可单容器或多容器组成),支持通过简单命令一键完成服务的启动、停止、重建等操作。

1.2 为什么需要 Docker Compose

部署多容器应用时,需解决以下核心问题:

  • 控制容器启动顺序(如先启动数据库,再启动依赖它的应用)
  • 避免重复执行繁琐的 docker run 命令
  • 统一管理容器依赖、网络、数据卷等配置

Docker Compose 通过单个 YAML 文件声明所有配置,执行 docker-compose up 即可一键部署,大幅提升多容器应用的部署效率和可维护性。


2. docker-compose.yml 文件的基本结构

2.1 版本 (version)

新版本 Docker Compose 中,version 属性已弃用(version is obsolete),可直接省略。若需兼容旧版本,可指定版本号:

plain 复制代码
version: '3.8'  # 可选,兼容旧版 Docker Compose

2.2 服务 (services)

services 是核心配置块,用于定义应用中的各个服务实例,每个服务对应一个或多个容器。

基础示例
plain 复制代码
services:
  web:  # 自定义服务名称(需唯一)
    image: nginx:1.26.2  # 服务使用的镜像(名称:版本)
    ports:
      - "80:80"  # 端口映射:主机端口:容器端口
    volumes:
      - ./html:/usr/share/nginx/html  # 目录挂载:主机目录:容器目录
    networks:
      - app-network  # 关联的网络名称
2.2.1 核心配置关键字详解
关键字 作用 示例
image 指定已存在的镜像 image: nginx:1.27.3
build 通过 Dockerfile 构建镜像 ```yaml
build:
context: ./build # 构建上下文路径
dockerfile: Dockerfile.dev # 自定义 Dockerfile 名称
args: {BUILD_VERSION: 1.0}
plain 复制代码
| `container_name`    | 自定义容器名称(唯一)| `container_name: my-nginx`                                                                           |
| `restart`           | 容器重启策略         | `restart: always`(可选值:no/always/on-failure/unless-stopped)                                       |
| `depends_on`        | 定义服务依赖(控制启动顺序) | `depends_on: [db, redis]`                                                                            |
| `environment`       | 设置环境变量         | ```yaml
environment:
  - NGINX_HOST=example.com
  - NGINX_PORT=8080
```|
| `env_file`          | 引用外部环境变量文件 | `env_file: ./web.env`(文件内格式:`KEY=VALUE`)                                                       |
| `ports`             | 端口映射(主机:容器)| `- "8080:80"`(随机端口:`- "80"`)                                                                   |
| `volumes`           | 数据卷挂载(持久化/共享数据) | `- ./logs:/var/log/nginx`(命名卷:`- web-data:/var/www/html`)                                        |
| `networks`          | 关联自定义网络       | `- app-network`                                                                                      |
> ⚠️ 注意:`depends_on` 仅保证依赖服务**先启动**,不等待依赖服务"就绪"(如数据库完全启动),需在应用内处理服务就绪检测。
### 2.3 网络 (networks)
定义应用的网络环境,实现服务间隔离或通信。
#### 配置示例
```yaml
# 声明网络(默认使用 bridge 驱动)
networks:
  app-network:  # 自定义网络名称
    driver: bridge  # 网络驱动(可选,默认 bridge)
  backend-network:
# 服务关联网络
services:
  web:
    image: nginx:1.27.3
    networks:
      - app-network  # 可关联多个网络
      - backend-network

2.4 数据卷 (volumes)

定义数据卷,实现容器数据的持久化存储和服务间数据共享。

配置示例
plain 复制代码
# 声明命名数据卷
volumes:
  web-data:  # 自定义数据卷名称
  db-data:
# 服务挂载数据卷
services:
  web:
    image: nginx:1.27.3
    volumes:
      - web-data:/var/www/html  # 命名卷挂载
      - ./local-dir:/var/log/nginx  # 主机目录绑定挂载
  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql  # 数据持久化

3. 常用 Docker Compose 命令

命令 作用 扩展用法
docker-compose up 启动所有服务(前台运行) -d:后台运行(守护进程模式)build`:启动前重新构建镜像
docker-compose down 停止并删除容器、网络 -v:同时删除命名数据卷 all`:删除服务使用的镜像
docker-compose ps 查看运行中的服务状态 -a:显示所有服务(包括停止的)
docker-compose logs 查看服务日志 -f:实时跟踪日志:查看指定服务日志
docker-compose stop 停止运行中的服务(不删除容器) ` 指定服务
docker-compose start 启动已停止的服务 >:启动指定服务
docker-compose restart 重启服务 >:重启指定服务
docker-compose images 列出所有服务使用的镜像 -
docker-compose exec 进入运行中的容器 `docker-compose exec

4. 完整 docker-compose.yml 示例(WordPress + MySQL)

4.1 配置文件

plain 复制代码
version: '3.8'
services:
  # WordPress 服务
  wordpress:
    image: wordpress:6.7.2
    restart: always  # 总是自动重启
    ports:
      - "9090:80"  # 主机 9090 端口映射容器 80 端口
    environment:
      WORDPRESS_DB_HOST: db  # 数据库服务名称(容器间通信)
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      TZ: Asia/Shanghai  # 时区配置
    volumes:
      - ./wp-content:/var/www/html/wp-content  # 主题/插件持久化
    depends_on:
      - db  # 依赖 db 服务,启动顺序:db → wordpress
  # MySQL 数据库服务
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: somewordpress  # root 密码
      TZ: Asia/Shanghai
    volumes:
      - db-data:/var/lib/mysql  # 数据库数据持久化
# 声明数据卷(持久化 MySQL 数据)
volumes:
  db-data:
# 默认网络(无需额外配置,服务自动加入)
networks:
  default:

4.2 操作步骤

  1. 启动服务
plain 复制代码
docker-compose up -d  # 后台启动,首次运行会下载镜像
  1. 访问应用

打开浏览器访问 http://localhost:9090,进入 WordPress 安装界面。

  1. 修改默认语言

安装完成后,在 WordPress 后台 → 设置 → 常规 → 站点语言,选择 "简体中文"。

  1. 停止服务
plain 复制代码
docker-compose down  # 仅停止服务,数据保留
# docker-compose down -v  # 停止服务并删除数据卷(谨慎使用)

5. 进阶使用技巧

5.1 多环境配置

通过 docker-compose -f 指定不同环境的配置文件:

  • 基础配置:docker-compose.yml
  • 开发环境:docker-compose.dev.yml
  • 生产环境:docker-compose.prod.yml

启动命令:

plain 复制代码
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

5.2 配置复用

使用 extends 关键字复用其他 Compose 文件的服务配置:

plain 复制代码
# docker-compose.base.yml
services:
  web:
    image: nginx:1.27.3
    ports:
      - "80:80"
# docker-compose.dev.yml
services:
  web:
    extends:
      file: docker-compose.base.yml
      service: web
    volumes:
      - ./dev-html:/usr/share/nginx/html  # 开发环境额外配置

5.3 官方文档参考

相关推荐
H_老邪2 小时前
Docker 反向代理部署方案
运维·docker·容器
小陈工2 小时前
Python Web开发入门(一):虚拟环境与依赖管理,从零搭建纯净开发环境
开发语言·前端·数据库·git·python·docker·开源
国医中兴3 小时前
边缘计算中的存储挑战与解决方案
微服务·云原生·容器·kubernetes·k8s
李子焱3 小时前
第二节:n8n私有化部署全攻略(基于 Docker)
运维·docker·容器
云草桑3 小时前
Odoo 19.0 Docker Desktop快速部署 和Ubuntu24上安装1panel面板
运维·docker·容器·odoo
维度攻城狮3 小时前
Docker 部署 Dify,快速私有化搭建专属知识库问答
人工智能·docker·部署·dify·知识问答
杰克尼3 小时前
知识点总结--day12(常用组件3/3)
云原生·eureka
杨浦老苏3 小时前
开源OSINT调查平台Flowsint的安装
网络安全·docker·可视化·群晖·osint
m0_694845573 小时前
WePY是什么?小程序组件化开发框架实战教程
服务器·docker·小程序·开源·github