- 2025.11.12 更新docker compose使用案例和教程
一、Docker核心入门
1.1 什么是Docker?
Docker是一款开源的容器化平台,它能将应用程序及其依赖环境打包成一个标准化的“容器”,实现“一次构建,到处运行”的目标。与传统虚拟机相比,Docker容器更轻量、启动更快、资源占用更低——虚拟机需要模拟完整操作系统,而容器则共享宿主机内核,仅封装应用所需的运行时环境。
核心价值:解决开发环境与生产环境“不一致”的痛点,简化服务部署流程,提升运维效率。
1.2 Docker核心概念
- 镜像(Image):容器的“模板”,包含运行应用所需的代码、依赖、环境变量等,可理解为只读的系统快照。
- 容器(Container):镜像的“运行实例”,是动态的、可读写的,容器间相互隔离,拥有独立的文件系统。
- 仓库(Repository):存储镜像的远程服务,类似代码仓库,Docker Hub(https://hub.docker.com/)是官方公共仓库。
- Docker Engine:Docker的核心服务,负责管理镜像和容器的生命周期。
二、Docker安装指南
Ubuntu 18.04及以上版本推荐使用官方脚本自动安装,步骤如下:
# 下载并执行Docker官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
三、Docker基础使用命令
3.1 镜像操作
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
# 1. 从仓库拉取镜像(格式:docker pull 镜像名:标签,标签默认latest)
docker pull nginx:1.23 # 拉取nginx 1.23版本
docker pull redis # 拉取redis最新版本
# 2. 查看本地镜像列表
docker images
# 3. 删除本地镜像(需先删除依赖该镜像的容器)
docker rmi nginx:1.23 # 按镜像名删除
docker rmi -f 镜像ID # 强制删除(-f)
# 4. 搜索远程仓库镜像
docker search mysql
3.2 容器操作
# 1. 创建并启动容器(格式:docker run [选项] 镜像名 [命令])
# -d:后台运行;-p 宿主机端口:容器端口:端口映射;--name:指定容器名
docker run -d -p 80:80 --name my-nginx nginx:1.23
# 2. 查看容器状态
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括停止的)
# 3. 启动/停止/重启容器
docker start my-nginx # 启动容器
docker stop my-nginx # 停止容器
docker restart my-nginx # 重启容器
# 4. 进入运行中的容器(交互模式)
docker exec -it my-nginx /bin/bash # -it:交互终端
# 5. 查看容器日志
docker logs -f my-nginx # -f:实时跟踪日志
# 6. 删除容器(需先停止容器,或用-f强制删除)
docker rm my-nginx
docker rm -f my-nginx
3.3 数据卷操作(持久化数据)
容器删除后数据会丢失,通过数据卷挂载宿主机目录或匿名卷实现数据持久化:
# 1. 挂载宿主机目录到容器(格式:-v 宿主机路径:容器路径)
docker run -d -p 80:80 -v /host/nginx/html:/usr/share/nginx/html --name my-nginx nginx:1.23
# 2. 创建并使用命名数据卷
docker volume create nginx-data # 创建命名卷
docker run -d -p 80:80 -v nginx-data:/usr/share/nginx/html --name my-nginx nginx:1.23
四、Docker Compose进阶
当应用依赖多个服务(如 Web 服务 + 数据库 + 缓存)时,手动管理多个容器效率低下。Docker Compose 通过 YAML 文件定义多容器服务组合,一键启动 / 停止所有服务,是多容器部署的核心工具。
4.1 Compose 简介与安装
Compose 是定义和运行多容器 Docker 应用的工具,核心流程分三步:
- 用 Dockerfile 定义应用环境;
- 用
docker-compose.yml定义所有服务配置; - 执行
docker-compose up一键启动整个应用。
安装步骤(Linux)
从 Github 下载二进制包安装,最新版本可查看Compose 官方 Releases:
# 下载指定版本(替换1.24.1为最新版本)
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软链接(可选,解决命令路径问题)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装成功
docker-compose --version
提示:Alpine 系统需先安装依赖包:py-pip、python-dev、libffi-dev、openssl-dev、gcc、libc-dev、make。
4.2 Compose 配置文件核心逻辑
docker-compose.yml是 Compose 的核心,文件名可自定义(需用-f参数指定,如docker-compose -f my-compose.yml up)。其层级结构严格,后一层级需比前一层级后退 2 个空格或 1 个 Tab,格式错误易导致运行失败。
核心层级关系
- 第 1 级:
version和services为顶层参数。version仅标识配置版本,不参与运行;services定义所有需启动的服务。 - 第 2 级:服务名称(如
app、db),可自定义但不可重复,作为容器在局域网内的通信标识。 - 第 3 级:容器核心参数,包括镜像(
image)、重启策略(restart)、端口映射(ports)、目录映射(volumes)等。 - 第 4 级:参数具体配置,如端口映射格式为 “宿主端口:容器端口”。
服务命名习惯
我个人习惯按功能命名服务:核心应用叫app、数据库叫db、缓存叫redis(或cache),这样仅看名称就能知晓服务角色,方便管理。
镜像标签(tag)使用建议
- 不推荐直接用
:latest(默认标签):不同时间的latest对应不同版本,不利于迁移和镜像复用,多个服务共用同一镜像时可能重复下载。 - 推荐用法:指定具体 tag(如
mysql:5.7),可在 Docker Hub 查询最新版本,也可通过 RSShub 订阅版本更新。 - 特殊场景可使用
:latest:WordPress(支持后台更新)、需频繁更新的镜像。
4.3 实战实例:WordPress 多服务部署
以下是一个完整的 WordPress 部署配置,包含 Web 应用(WordPress)、数据库(MySQL)和缓存(Redis)三个服务,可直观体现 Compose 对多服务依赖的管理能力:
version: '3.0'
services:
# MySQL数据库服务
db:
image: mysql:5.7 # 注意:arm架构机器(如M1/M2 Mac)需改为mysql:oracle
container_name: wordpress-db # 自定义容器名,便于管理
restart: unless-stopped # 重启策略:除非手动停止,否则总是重启
# command: --max-binlog-size=200M --expire-logs-days=2 # MySQL 8.0建议添加,限制日志大小
environment: # 数据库环境变量(核心配置,需妥善保存)
MYSQL_ROOT_PASSWORD: rootpassword # 数据库root密码,建议改为复杂密码
MYSQL_DATABASE: wordpress # 为WordPress创建的数据库名
MYSQL_USER: wordpress # 为WordPress授权的数据库用户
MYSQL_PASSWORD: yourpassword # 数据库用户密码,建议与root密码区分
volumes: # 数据持久化:将主机目录挂载到容器,避免容器删除后数据丢失
- './db:/var/lib/mysql'
networks: # 加入自定义网络,实现服务间隔离通信
- default
# WordPress应用服务
app:
image: wordpress:latest # 官方WordPress最新镜像
container_name: wordpress-app
restart: unless-stopped
ports: # 端口映射:主机18080端口 → 容器80端口(需确保主机防火墙开放18080)
- 18080:80
environment: # 关联数据库配置,与db服务的环境变量对应
WORDPRESS_DB_HOST: db # 数据库服务名(Compose自动解析为容器IP)
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: yourpassword
volumes: # 持久化WordPress代码和主题文件
- './app:/var/www/html'
links: # 显式关联db服务(兼容旧版本Compose,可配合depends_on使用)
- db:db
depends_on: # 依赖关系:确保redis和db启动后再启动app
- redis
- db
networks:
- default
# Redis缓存服务(提升WordPress访问速度)
redis:
image: redis:alpine # alpine版本镜像更小,资源占用低
container_name: wordpress-redis
restart: unless-stopped
volumes: # 持久化Redis缓存数据
- ./redis-data:/data
networks:
- default
# 自定义网络:所有服务加入同一网络,服务名即主机名
networks:
default:
name: wordpress
实例参数详解
- 顶层配置
version: '3.0':标识 Compose 配置版本,需与 Docker Engine 版本兼容。services:定义所有服务的集合,包含db(数据库)、app(WordPress 应用)、redis(缓存)三个服务。networks:定义网络配置,此处创建名为wordpress的自定义网络,所有服务加入该网络实现隔离通信。
- db 服务(MySQL 数据库)
image: mysql:5.7:指定使用 MySQL 5.7 版本镜像(arm 架构需替换为mysql:oracle)。container_name: wordpress-db:自定义容器名称,便于识别和管理。restart: unless-stopped:重启策略,除非手动停止,否则容器退出后自动重启。environment:设置环境变量,包括数据库 root 密码、默认数据库名、用户及密码(需自行修改为复杂密码)。volumes: - './db:/var/lib/mysql':将宿主机当前目录下的db文件夹挂载到容器的/var/lib/mysql(MySQL 数据存储目录),实现数据持久化。networks: - default:加入default网络(即wordpress网络)。
- app 服务(WordPress 应用)
image: wordpress:latest:使用 WordPress 最新镜像(推荐用latest,支持后台直接更新)。ports: - 18080:80:端口映射,宿主机 18080 端口映射到容器 80 端口(需确保宿主机防火墙开放 18080 端口)。environment:配置数据库连接信息,WORDPRESS_DB_HOST: db直接使用db服务名作为地址(Compose 自动解析为容器 IP)。volumes: - './app:/var/www/html':挂载 WordPress 代码目录,确保主题、插件等文件持久化。links: - db:db:显式关联db服务,建立网络通信(兼容旧版本 Compose)。depends_on: - redis - db:定义启动顺序,确保redis和db启动后再启动app,避免依赖服务未就绪导致的错误。
- redis 服务(缓存)
image: redis:alpine:使用轻量的 Alpine 版本 Redis 镜像,减少资源占用。volumes: - ./redis-data:/data:挂载 Redis 数据目录,持久化缓存数据。
4.4 Compose 核心命令
# 启动服务(前台运行,日志实时输出)
docker-compose up
# 后台启动服务(推荐)
docker-compose up -d
# 查看运行中的服务
docker-compose ps
# 停止服务(保留容器和数据)
docker-compose stop
# 停止并删除服务、容器、网络(保留数据卷)
docker-compose down
# 停止并删除所有(包括数据卷)
docker-compose down -v
# 拉取最新镜像(针对:latest标签)
docker-compose pull
# 查看服务日志
docker-compose logs -f
五、总结
Docker 解决了 “环境一致性” 问题,而 Docker Compose 则解决了 “多容器管理复杂性” 问题。它将繁琐的docker run命令整合为结构化的 YAML 文件,不仅层级清晰、易于维护,还支持服务依赖、自定义网络等复杂场景。
对我而言,Compose 早已取代了docker run和后台 GUI 工具 —— 配置文件可备份、可复用,迁移时只需执行docker-compose up -d即可快速启动整个应用,效率大幅提升。