从 Docker 到 Docker Compose:手把手带你搞定多容器部署

IT 文章1天前更新 小编
0 0 0

如果你曾经为“在我机器上能跑,上线就崩”这种问题头疼过,那 你绝对该掌握Docker。而当你开始搭建包含 Web、数据库、缓存等多个组件的应用时,Docker Compose 就成了不可或缺的帮手。这篇文章不讲虚的,直接上干货,从基础概念到 WordPress 实战部署,一步步带你玩转容器编排。

一、Docker 是啥?为什么值得学?

简单来说,Docker 是一个能把应用和它依赖的环境打包成“集装箱”的工具。这个“集装箱”叫容器(Container),无论你把它搬到哪台 Linux 机器上,只要装了 Docker,就能原样运行——彻底告别“环境不一致”的噩梦。

和传统虚拟机不同,Docker 不需要模拟整个操作系统,而是直接复用宿主机的内核,因此启动快、资源省、体积小。开发、测试、生产环境用同一套镜像,部署效率直线拉满。

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

核心概念三件套

  • 镜像(Image):相当于容器的“模板”,只读,包含代码、依赖、配置等一切运行所需。
  • 容器(Container):镜像跑起来的实例,可读写,相互隔离。
  • 仓库(Repository):存放镜像的地方,比如官方的 Docker Hub

底层干活的是 Docker Engine,负责管理镜像和容器的生命周期。

二、快速安装 Docker(Ubuntu 用户看这里)

推荐用官方一键脚本安装,省心又靠谱:

# 下载并执行安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

装完后可以用 docker --version 验证是否成功。

三、Docker 基础操作速查

1. 镜像管理

# 拉取镜像(默认 latest 标签)
docker pull nginx:1.23
docker pull redis

# 查看本地已有镜像
docker images

# 删除镜像(先删容器!)
docker rmi nginx:1.23
docker rmi -f <镜像ID>  # 强制删除

💡 提示:如果本地没有指定镜像,docker run 会自动从 Docker Hub 下载。

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

2. 容器操作

# 后台运行一个 Nginx 容器,映射 80 端口,命名为 my-nginx
docker run -d -p 80:80 --name my-nginx nginx:1.23

# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a

# 启停重启
docker start my-nginx
docker stop my-nginx
docker restart my-nginx

# 进入容器调试(交互式 Bash)
docker exec -it my-nginx /bin/bash

# 实时查看日志
docker logs -f my-nginx

# 删除容器
docker rm my-nginx        # 先 stop
docker rm -f my-nginx     # 强制删

3. 数据持久化:别让数据随容器消失!

容器一删,里面的数据就没了。解决办法是挂载数据卷

# 方式1:绑定宿主机目录
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

手动敲一堆 docker run 命令来启动 Web + DB + Redis?太原始了。Docker Compose 就是为多服务协同而生的

它用一个 docker-compose.yml 文件定义所有服务,一条命令就能全拉起来,还能自动处理网络、依赖顺序等问题。

1. 安装 Compose(Linux

# 从 GitHub 下载二进制(记得替换为最新版)
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 系统需额外安装 Python 和编译依赖。

2. YAML 配置文件怎么写?

docker-compose.yml 是核心,格式必须严格(缩进用空格,别混 Tab)。结构大致如下:

ad

免费在线工具导航

优网导航旗下整合全网优质免费、免注册的在线工具导航大全

  • 第一层:version(配置版本)、services(服务列表)
  • 第二层:服务名(如 app, db
  • 第三层:具体配置(镜像、端口、卷、环境变量等)

命名建议

  • 主应用 → app
  • 数据库db
  • 缓存 → rediscache

名字起得清楚,后期维护少踩坑。

镜像标签别乱用 latest

虽然 wordpress:latest 很方便,但生产环境强烈建议指定具体版本(如 mysql:5.7),否则不同时间部署可能因镜像更新导致行为不一致。可以在 Docker Hub 查版本,或者用 RSS 订阅更新提醒。


五、实战:用 Compose 一键部署 WordPress

下面这个例子包含三个服务:MySQL、WordPress、Redis,展示了 Compose 如何协调多容器协作。

version: '3.0'
services:
  # MySQL 数据库
  db:
    image: mysql:5.7
    container_name: wordpress-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: yourpassword
    volumes:
      - './db:/var/lib/mysql'  # 持久化数据库文件
    networks:
      - default

  # WordPress 应用
  app:
    image: wordpress:latest
    container_name: wordpress-app
    restart: unless-stopped
    ports:
      - "18080:80"  # 访问 http://你的IP:18080
    environment:
      WORDPRESS_DB_HOST: db        # 直接用服务名通信!
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: yourpassword
    volumes:
      - './app:/var/www/html'  # 保存主题和插件
    depends_on:
      - db
      - redis
    networks:
      - default

  # Redis 缓存(加速访问)
  redis:
    image: redis:alpine
    container_name: wordpress-redis
    restart: unless-stopped
    volumes:
      - './redis-data:/data'
    networks:
      - default

# 自定义网络,让服务能通过名字互相访问
networks:
  default:
    name: wordpress

关键点解析

  • 服务间通信WORDPRESS_DB_HOST: db 中的 db 就是上面定义的服务名,Compose 会自动解析为对应容器的 IP。
  • 启动顺序depends_on 确保数据库和 Redis 先跑起来,再启动 WordPress。
  • 数据持久化:所有重要数据都挂载到当前目录下的子文件夹,迁移或重建容器都不怕丢数据。
  • 端口映射:宿主机 18080 → 容器 80,记得开放防火墙。

📌 ARM 设备(如 M1/M2 Mac)用户注意:mysql:5.7 可能不兼容,可改用 mysql:oracle


六、常用 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

七、总结:为什么我离不开 Compose?

Docker 解决了“环境一致性”,而 Docker Compose 解决了“多服务协同部署”的痛点。相比手动敲命令,YAML 配置文件清晰、可版本控制、易复用。换服务器?拷贝目录,docker-compose up -d,搞定。

现在我的所有项目都用 Compose 管理,连 NAS 上的小工具也不例外。它不只是个工具,更是现代 DevOps 的基本功。

© 版权声明

相关文章

暂无评论

暂无评论...