Docker Compose 技术入门与实践
一、Docker Compose 核心概念解析
Docker Compose 是 Docker 官方提供的用于定义和运行多容器应用的工具。它允许开发者使用一个 YAML 格式的配置文件(docker-compose.yml)来描述一组相互关联的容器及其配置(如网络、存储卷、环境变量等),并通过一条命令完成所有容器的启动、停止和管理。
核心价值:
- 服务编排:简化多容器应用的部署流程。
- 环境一致性:确保开发、测试、生产环境的一致性。
- 依赖管理:自动处理容器间的网络连接与启动顺序。
二、OpenEuler 系统环境准备
OpenEuler 是华为推出的开源 Linux 发行版,专注于高性能与安全性。以下是部署前的必要准备:
-
安装 Docker 引擎
bash# 更新系统 sudo dnf update # 安装 Docker sudo dnf install docker # 启动服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version -
安装 Docker Compose
bash# 下载最新版 Compose (以 v2.21.0 为例) sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version
三、Docker Compose 配置文件精解 (docker-compose.yml)
配置文件是 Compose 的核心,采用 YAML 语法。以下是一个典型结构:
yaml
version: '3.8' # 指定 Compose 文件版本
services: # 定义服务(容器)
web: # 服务名称
image: nginx:alpine # 使用的镜像
ports:
- "80:80" # 端口映射(主机:容器)
volumes:
- ./html:/usr/share/nginx/html # 数据卷挂载
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example # 环境变量
关键字段解析:
| 配置项 | 描述 |
|---|---|
| services | 定义每个容器的配置,包括镜像、端口映射等细节。 |
| image | 指定基础镜像,用于构建或运行容器。 |
| ports | 映射端口,格式为 HOST:CONTAINER(例如 8080:80)。 |
| volumes | 持久化数据,支持主机路径(如 ./data)或命名卷(如 db_data)。 |
| environment | 设置容器环境变量,用于配置容器运行时的参数。 |
| networks | 自定义网络,用于隔离容器组,提高安全性和通信效率。 |
| depends_on | 控制服务启动顺序,指定依赖关系以确保服务按顺序启动。 |
四、实战:使用 Compose 部署 WordPress
WordPress 是一个典型的 LAMP(Linux + Apache + MySQL + PHP)应用。我们将通过两个容器实现:
- WordPress 容器:运行 PHP 应用。
- MySQL 容器:提供数据库服务。
1. 编写 docker-compose.yml
yaml
version: '3.8'
services:
wordpress:
image: wordpress:6.2-php8.1-apache
ports:
- "8080:80" # 主机 8080 映射到容器 80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html # 持久化网站数据
depends_on:
- db # 确保先启动数据库
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
MYSQL_RANDOM_ROOT_PASSWORD: "1" # 随机生成 root 密码
volumes:
- db_data:/var/lib/mysql # 持久化数据库
volumes:
wordpress_data: # 声明命名卷
db_data:
2. 启动应用
bash
# 进入项目目录
mkdir wordpress && cd wordpress
vim docker-compose.yml # 粘贴上述配置
# 启动服务(后台运行)
docker-compose up -d
输出示例:
Creating network "wordpress_default" with the default driver
Creating volume "wordpress_db_data" with default driver
Creating volume "wordpress_wordpress_data" with default driver
Creating wordpress_db_1 ... done
Creating wordpress_wordpress_1 ... done
3. 验证部署
- 访问
http://<OpenEuler-IP>:8080,进入 WordPress 安装界面。 - 完成语言、数据库信息(与
docker-compose.yml一致)等配置。 - 登录后台
http://<OpenEuler-IP>:8080/wp-admin。
五、Docker Compose 日常操作指南
1. 常用命令
| 命令 | 作用 |
|---|---|
docker-compose up -d |
启动服务(后台模式) |
docker-compose down |
停止并删除容器、网络 |
docker-compose ps |
查看运行中的服务 |
docker-compose logs -f |
实时查看日志 |
docker-compose exec service_name sh |
进入容器 Shell |
docker-compose build |
重新构建服务(需 Dockerfile) |
2. 数据卷管理
- 查看所有卷 :
docker volume ls - 删除未使用的卷 :
docker volume prune
3. 更新服务
修改 docker-compose.yml 后,重启服务:
bash
docker-compose down && docker-compose up -d
六、高级配置与优化
1. 资源限制
限制容器 CPU 和内存,避免资源争抢:
yaml
services:
wordpress:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
2. 健康检查
确保服务完全就绪后再接收流量:
yaml
services:
db:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
3. 多环境配置
使用 docker-compose.override.yml 为开发环境添加调试工具:
yaml
# docker-compose.override.yml
services:
wordpress:
ports:
- "8080:80"
- "9000:9000" # Xdebug 端口
启动时自动合并配置:
bash
docker-compose -f docker-compose.yml -f docker-compose.override.yml up
七、典型问题排查
1. 端口冲突
现象 :Bind for 0.0.0.0:8080 failed: port is already allocated
解决:
- 更改
ports配置(如"9090:80")。 - 停止占用端口的进程:
sudo lsof -i :8080→kill <PID>。
2. 数据库连接失败
现象 :Error establishing a database connection
排查:
bash
# 查看数据库日志
docker-compose logs db
# 进入数据库容器检查服务状态
docker-compose exec db mysql -u wpuser -pwppassword
常见原因:
- 环境变量拼写错误。
- 数据库未完全启动(添加
healthcheck解决)。
3. 文件权限问题
现象 :WordPress 无法上传文件
解决:
bash
# 修改挂载目录权限
sudo chown -R 33:33 ./wordpress_data # 33 是容器内 www-data 用户 UID
八、生产环境最佳实践
-
使用命名卷:避免主机路径依赖,便于迁移。
-
设置重启策略 :容器崩溃时自动恢复:
yamlservices: wordpress: restart: unless-stopped -
分离敏感数据 :将密码放入
.env文件:bash# .env 文件 MYSQL_PASSWORD=secretyamlenvironment: MYSQL_PASSWORD: ${MYSQL_PASSWORD} -
网络隔离 :为不同应用创建独立网络:
yamlnetworks: frontend: backend:
九、扩展场景:添加 Redis 缓存
优化 WordPress 性能,添加 Redis 容器:
yaml
services:
cache:
image: redis:6
networks:
- backend
wordpress:
environment:
WORDPRESS_REDIS_HOST: cache
networks:
- frontend
- backend
networks:
frontend:
backend:
在 WordPress 中安装 Redis 插件(如 "Redis Object Cache")并配置即可。
十、总结
Docker Compose 将复杂的多容器部署简化为声明式配置,显著提升开发与运维效率。通过本文,您已掌握:
- 在 OpenEuler 上搭建 Compose 环境
- 编写多服务 YAML 配置文件
- 部署高可用 WordPress 站点
- 日常管理、问题排查与生产优化
核心价值再强调:
"一键启停,复杂归简;一配定义,环境无忧。"
附录:命令速查表
| 场景 | 命令 |
|---|---|
| 启停服务 | docker-compose up -d / down |
| 查看状态 | docker-compose ps |
| 日志跟踪 | docker-compose logs -f service_name |
| 配置更新 | docker-compose down && docker-compose up -d |
| 数据卷清理 | docker volume prune |
通过持续实践,您将能驾驭更复杂的微服务架构,实现高效、可靠的容器化应用生命周期管理。