从Docker到Docker Compose:完整实战教程

2651 字
13 分钟
从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及以上版本推荐使用官方脚本自动安装,步骤如下:

Terminal window
# 下载并执行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 公共镜像源下载。

Terminal window
# 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 容器操作#

Terminal window
# 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 数据卷操作(持久化数据)#

容器删除后数据会丢失,通过数据卷挂载宿主机目录或匿名卷实现数据持久化:

Terminal window
# 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 应用的工具,核心流程分三步:

  1. 用 Dockerfile 定义应用环境;
  2. docker-compose.yml定义所有服务配置;
  3. 执行docker-compose up一键启动整个应用。

安装步骤(Linux)#

从 Github 下载二进制包安装,最新版本可查看Compose 官方 Releases

Terminal window
# 下载指定版本(替换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. 第 1 级:versionservices为顶层参数。version仅标识配置版本,不参与运行;services定义所有需启动的服务。
  2. 第 2 级:服务名称(如appdb),可自定义但不可重复,作为容器在局域网内的通信标识。
  3. 第 3 级:容器核心参数,包括镜像(image)、重启策略(restart)、端口映射(ports)、目录映射(volumes)等。
  4. 第 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

实例参数详解#

  1. 顶层配置
    • version: '3.0':标识 Compose 配置版本,需与 Docker Engine 版本兼容。
    • services:定义所有服务的集合,包含db(数据库)、app(WordPress 应用)、redis(缓存)三个服务。
    • networks:定义网络配置,此处创建名为wordpress的自定义网络,所有服务加入该网络实现隔离通信。
  2. 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网络)。
  3. 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:定义启动顺序,确保redisdb启动后再启动app,避免依赖服务未就绪导致的错误。
  4. redis 服务(缓存)
    • image: redis:alpine:使用轻量的 Alpine 版本 Redis 镜像,减少资源占用。
    • volumes: - ./redis-data:/data:挂载 Redis 数据目录,持久化缓存数据。

4.4 Compose 核心命令#

Terminal window
# 启动服务(前台运行,日志实时输出)
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即可快速启动整个应用,效率大幅提升。

参考#

  1. Docker 教程 | 菜鸟教程
  2. Docker Compose | Docker Docs

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
从Docker到Docker Compose:完整实战教程
https://blog.leihub.cn/archives/84/
作者
阿雷
发布于
2021-07-07
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
搭建网盘聚合应用Alist
Docker 容器折腾Alist Alist是一个简单而实用的应用程序,旨在帮助用户集中管理和浏览多个网络存储服务。通过使用Alist,你可以方便地整合各种网盘服务,如Google Drive、Dropbox、OneDrive等,并在一个统一的界面中进行文件管理
2
DDNS+IPV6实现外网访问
内网穿透 & 组网DDNS+IPV6实现外网访问 上网配置 之前一直是通过搭建在腾讯云上的FPR实现内网穿透,访问家里的设备,但这样也不是持久的办法。毕竟云服务器一年的费用让我非常肉痛,4核4g的云服务器我一次性购买了4年,花了四百多,然后一看续费,一年14
3
群晖照片异地备份到 Unraid + Immich 相册搭建详细教程:rsync 同步与踩坑全记录
NAS & 云服务搭建我家里同时有白群晖和 unRAID 两台 NAS ,准备把群晖里攒了几年的照片进行异地备份,单盘 NAS 一旦坏了,照片可就全没了。 我自己折腾了两天,踩了一堆坑,终于跑通了一套「unRAID 定时拉取群晖 + Immich 相册」的方案。
4
西上东下:梵净山雾中徒步记
城市短途漫游朋友嚷嚷了一年的梵净山,最近终于找到了爬山窗口,做足了攻略的我们,直接选择来一波特种兵爬梵净山。 一、周五晚上10点,株洲站出发 我们几个都是从株洲出发的,火车是晚上的卧铺车,10 点出发,第二天凌晨 5:40 到铜仁。一张硬卧 138 块
5
NotionNext 个人博客搭建教程:腾讯云 EdgeOne 部署
博客搭建 & 运维前言 目前主流的博客搭建方案可大致分为两类,且各有局限:一类是以 WordPress 为代表的动态博客系统,依赖独立服务器运行,运维与硬件成本较高;另一类是以 Hexo 为代表的静态博客框架,采用本地 Markdown 编写,无实时预览能力
随机文章随机推荐

评论区

Profile Image of the Author
阿雷
一个小趴菜
公告
本站已从 WordPress 迁移到 Astro,访问更快、更清爽。文章链接保持原样(/archives/文章ID/),评论数据正在陆续恢复中。
分类
标签
最新动态
站点统计
文章
76
分类
15
标签
99
总字数
318,421
运行时长
0
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录