从Docker到Docker Compose:完整实战教程
- 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.shsudo sh get-docker.sh
# 启动Docker服务sudo systemctl start dockersudo 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 mysql3.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-nginxdocker rm -f my-nginx3.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即可快速启动整个应用,效率大幅提升。
参考
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!


