Docker实战(1):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官方安装脚本 |
三、Docker基础使用命令
3.1 镜像操作
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
# 1. 从仓库拉取镜像(格式:docker pull 镜像名:标签,标签默认latest) |
3.2 容器操作
# 1. 创建并启动容器(格式:docker run [选项] 镜像名 [命令]) |
3.3 数据卷操作(持久化数据)
容器删除后数据会丢失,通过数据卷挂载宿主机目录或匿名卷实现数据持久化:
# 1. 挂载宿主机目录到容器(格式:-v 宿主机路径:容器路径) |
四、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为最新版本) |
提示: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' |
实例参数详解
- 顶层配置
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 解决了 “环境一致性” 问题,而 Docker Compose 则解决了 “多容器管理复杂性” 问题。它将繁琐的docker run命令整合为结构化的 YAML 文件,不仅层级清晰、易于维护,还支持服务依赖、自定义网络等复杂场景。
对我而言,Compose 早已取代了docker run和后台 GUI 工具 —— 配置文件可备份、可复用,迁移时只需执行docker-compose up -d即可快速启动整个应用,效率大幅提升。
