Docker 容器技术入门与实践 (五):Docker Compose

Docker Compose 技术入门与实践

一、Docker Compose 核心概念解析

Docker Compose 是 Docker 官方提供的用于定义和运行多容器应用的工具。它允许开发者使用一个 YAML 格式的配置文件(docker-compose.yml)来描述一组相互关联的容器及其配置(如网络、存储卷、环境变量等),并通过一条命令完成所有容器的启动、停止和管理。

核心价值:

  • 服务编排:简化多容器应用的部署流程。
  • 环境一致性:确保开发、测试、生产环境的一致性。
  • 依赖管理:自动处理容器间的网络连接与启动顺序。

二、OpenEuler 系统环境准备

OpenEuler 是华为推出的开源 Linux 发行版,专注于高性能与安全性。以下是部署前的必要准备:

  1. 安装 Docker 引擎

    bash 复制代码
    # 更新系统
    sudo dnf update
    
    # 安装 Docker
    sudo dnf install docker
    
    # 启动服务并设置开机自启
    sudo systemctl start docker
    sudo systemctl enable docker
    
    # 验证安装
    docker --version
  2. 安装 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. 验证部署
  1. 访问 http://<OpenEuler-IP>:8080,进入 WordPress 安装界面。
  2. 完成语言、数据库信息(与 docker-compose.yml 一致)等配置。
  3. 登录后台 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 :8080kill <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

八、生产环境最佳实践
  1. 使用命名卷:避免主机路径依赖,便于迁移。

  2. 设置重启策略 :容器崩溃时自动恢复:

    yaml 复制代码
    services:
      wordpress:
        restart: unless-stopped
  3. 分离敏感数据 :将密码放入 .env 文件:

    bash 复制代码
    # .env 文件
    MYSQL_PASSWORD=secret
    yaml 复制代码
    environment:
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  4. 网络隔离 :为不同应用创建独立网络:

    yaml 复制代码
    networks:
      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

通过持续实践,您将能驾驭更复杂的微服务架构,实现高效、可靠的容器化应用生命周期管理。

相关推荐
深藏功yu名4 小时前
Docker+FastAPI+千问API,复刻豆包式流式聊天界面
docker·容器·fastapi
小王要努力上岸4 小时前
K8S高可用集群安装 (基于Kubeadm+Docker)
docker·容器·kubernetes
Wy_编程4 小时前
docker仓库
docker·容器·eureka
亚空间仓鼠4 小时前
Docker 容器技术入门与实践 (三):Docker私有仓库
docker·容器·eureka
小陈99cyh4 小时前
安装NVIDIA Container Toolkit,让gpu容器环境跑通
运维·pytorch·docker·nvidia
雨奔5 小时前
Kubernetes Master-Node 通信全解析:路径、安全与配置
安全·容器·kubernetes
Y学院5 小时前
企业级Dify私有化部署全攻略(Docker Compose生产环境实战)
人工智能·docker·语言模型
草木红5 小时前
Python 中使用 Docker Compose
开发语言·python·docker·flask
雨奔5 小时前
Kubernetes Volume 完全指南:数据持久化与容器共享方案
云原生·容器·kubernetes