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

  1. 用 Dockerfile 定义应用环境;
  2. docker-compose.yml定义所有服务配置;
  3. 执行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. 第 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 核心命令

# 启动服务(前台运行,日志实时输出)
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
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇