Docker Compose 使用入门教程:从安装到多容器部署全指南

快小二编导 技术教程

如果你经常使用 Docker,一定遇到过这样的场景:为了运行一个 Web 应用,需要手动启动数据库容器、Redis 缓存容器、应用本身容器,还要分别配置端口映射、环境变量、网络连接——步骤繁琐且容易出错。Docker Compose 正是为解决这个问题而生:它允许你用一个 YAML 文件定义多容器应用的所有配置,通过一条命令完成启动、停止、重启等操作,让多容器管理变得简单高效。

一、Docker Compose 是什么?

Docker Compose 是 Docker 官方推出的多容器编排工具,核心功能是通过 docker-compose.yml 文件定义应用的所有服务(容器)、网络、存储卷等依赖关系,然后通过 docker-compose 命令一键管理整个应用生命周期。

它的核心优势在于:

  • 简化配置:用 YAML 替代复杂的 docker run 命令,配置可版本化(存入 Git);
  • 一键操作:一条命令启动所有服务,无需逐个容器操作;
  • 环境一致性:开发、测试、生产环境使用相同的 Compose 配置,避免「开发环境能跑,生产环境报错」的问题;
  • 依赖管理:自动处理容器间的依赖关系(如先启动数据库,再启动应用)。

二、安装 Docker Compose

在使用 Docker Compose 前,需确保已安装 Docker Engine(Compose 依赖 Docker 运行)。以下是不同系统的安装方法:

1. Linux 系统(以 Ubuntu 为例)

步骤 1:安装 Docker Engine

如果未安装 Docker,先执行以下命令:

# 更新软件包列表
sudo apt update
# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 验证安装
docker --version

步骤 2:安装 Docker Compose

# 下载最新稳定版(可替换为官网最新版本号,如 v2.23.3)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version

2. Windows/macOS 系统

Windows 和 macOS 用户安装 Docker Desktop 即可自动包含 Docker Compose,无需单独安装:

三、Docker Compose 核心概念

在编写 docker-compose.yml 前,需理解三个核心概念:

1. 服务(Services)

一个「服务」对应一个容器(或一组相同的容器,用于负载均衡),是 Compose 配置的核心。例如:

  • 一个 web 服务:运行 Node.js 应用的容器;
  • 一个 db 服务:运行 MySQL 数据库的容器;
  • 一个 redis 服务:运行 Redis 缓存的容器。

每个服务可配置镜像、端口、环境变量、依赖关系等。

2. 网络(Networks)

默认情况下,Compose 会为应用创建一个默认网络,所有服务容器都会加入这个网络,容器间可通过「服务名」互相访问(无需用 IP 地址)。例如:web 服务可以通过 db:3306 访问 db 服务的 MySQL。

随机图片

3. 存储卷(Volumes)

用于持久化数据(避免容器删除后数据丢失)或共享数据(多个容器共享文件)。例如:MySQL 的数据目录可以挂载到主机的卷,确保容器重启后数据不丢失。

四、编写第一个 docker-compose.yml

我们以一个「Node.js + MySQL」的 Web 应用为例,编写 Compose 配置文件。

场景说明

  • 前端:Node.js 应用(镜像用 node:16-alpine);
  • 后端数据库:MySQL 5.7(镜像用 mysql:5.7);
  • 需求:Node.js 应用需连接 MySQL,且 MySQL 数据持久化。

步骤 1:创建项目目录

mkdir docker-compose-demo && cd docker-compose-demo

步骤 2:编写 docker-compose.yml

在项目目录下创建 docker-compose.yml 文件,内容如下:

# 版本号(需与 Docker Compose 版本兼容,v2 或 v3 是主流)
version: '3.8'

# 定义所有服务
services:
  # 1. Web 服务(Node.js 应用)
  web:
    # 使用的镜像(若本地没有,Compose 会自动拉取)
    image: node:16-alpine
    # 容器名称(可选,默认是「项目名_服务名_序号」)
    container_name: node-web
    # 工作目录(容器内的目录)
    working_dir: /app
    # 端口映射:主机端口:容器端口
    ports:
      - "3000:3000"
    # 挂载目录:主机目录:容器目录(将本地代码同步到容器,方便开发)
    volumes:
      - ./app:/app
    # 启动命令(容器启动后执行的命令)
    command: sh -c "npm install && node app.js"
    # 依赖关系:先启动 db 服务,再启动 web
    depends_on:
      - db
    # 环境变量(传递给容器)
    environment:
      - DB_HOST=db  # 数据库地址(用服务名访问)
      - DB_USER=root
      - DB_PASSWORD=123456
      - DB_NAME=mydb
    # 加入默认网络(可选,默认已加入)
    networks:
      - app-network

  # 2. MySQL 服务
  db:
    image: mysql:5.7
    container_name: mysql-db
    # 端口映射(主机 3306 映射到容器 3306)
    ports:
      - "3306:3306"
    # 环境变量(MySQL 初始化配置)
    environment:
      - MYSQL_ROOT_PASSWORD=123456  #  root 密码
      - MYSQL_DATABASE=mydb         # 自动创建的数据库名
    # 存储卷:持久化 MySQL 数据(避免容器删除后数据丢失)
    volumes:
      - mysql-data:/var/lib/mysql  # 挂载到命名卷 mysql-data
    networks:
      - app-network

# 定义存储卷(命名卷,由 Docker 管理存储位置)
volumes:
  mysql-data:

# 定义网络(可选,默认会创建一个名为「项目名_default」的网络)
networks:
  app-network:
    driver: bridge  # 桥接网络(默认类型)

步骤 3:编写 Node.js 测试代码

在项目目录下创建 app 文件夹,然后在 app 内创建 app.jspackage.json

package.json(依赖配置)

{
  "dependencies": {
    "express": "^4.18.2",
    "mysql2": "^3.6.2"
  }
}

app.js(简单的 Web 服务,连接 MySQL)

const express = require('express');
const mysql = require('mysql2/promise');
const app = express();
const port = 3000;

// 数据库配置(从环境变量读取)
const dbConfig = {
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
};

// 测试数据库连接
async function testDbConnection() {
  try {
    const connection = await mysql.createConnection(dbConfig);
    console.log('MySQL 连接成功!');
    await connection.end();
  } catch (err) {
    console.error('MySQL 连接失败:', err);
  }
}

// 定义接口
app.get('/', (req, res) => {
  res.send('Docker Compose 入门教程:Node.js + MySQL 应用运行中!');
});

// 启动服务
app.listen(port, async () => {
  console.log(`Web 服务运行在 http://localhost:${port}`);
  await testDbConnection();
});

五、Docker Compose 常用命令

编写完配置文件后,通过以下命令管理应用:

1. 启动应用(后台运行)

docker-compose up -d
  • -d:后台运行容器(不加则前台运行,可看到日志输出);
  • 第一次运行时,Compose 会自动拉取镜像、创建网络和卷、启动容器。

2. 查看容器状态

docker-compose ps

输出示例:

      Name                    Command               State                 Ports
-------------------------------------------------------------------------------------
mysql-db          docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
node-web          sh -c npm install && node app.js Up      0.0.0.0:3000->3000/tcp

3. 查看服务日志

# 查看所有服务日志
docker-compose logs

# 查看指定服务(如 web)的日志(-f 实时跟踪)
docker-compose logs -f web

4. 进入容器内部

# 进入 web 服务的容器
docker-compose exec web sh

5. 停止应用(保留容器)

docker-compose stop

6. 重启应用

docker-compose restart

7. 停止并删除容器、网络(保留卷)

docker-compose down
  • 若要同时删除卷,需加 -v 参数:docker-compose down -v

8. 构建自定义镜像(若服务需从 Dockerfile 构建)

如果你的应用需要自定义镜像(而非直接使用官方镜像),可在 services 中配置 build 字段:

services:
  web:
    build: ./app  # 指定 Dockerfile 所在目录
    # 其他配置...

然后执行构建并启动:

docker-compose up -d --build

六、常见问题与注意事项

1. 依赖关系(depends_on)的局限性

depends_on 仅保证容器启动顺序(先启动 db 再启动 web),但不保证 db 服务完全就绪(如 MySQL 可能还在初始化)。解决方法:

  • 在应用代码中添加重试逻辑(如 Node.js 连接 MySQL 时多次尝试);
  • 使用第三方工具(如 wait-for-it)等待服务就绪。

2. 存储卷的类型

Compose 支持两种卷:

  • 命名卷:由 Docker 管理,存储位置在 /var/lib/docker/volumes/(Linux),适合持久化数据;
  • 绑定挂载:将主机目录直接挂载到容器,适合开发时同步代码(如示例中的 ./app:/app)。

3. 环境变量的优先级

Compose 读取环境变量的顺序(从高到低):

  1. 命令行参数(如 docker-compose run -e KEY=VALUE web);
  2. docker-compose.yml 中的 environment 字段;
  3. 环境变量文件(如 .env 文件,需在 docker-compose.yml 中通过 env_file 引用)。

4. 网络访问

  • 容器间通过服务名访问(如 web 服务访问 db:3306);
  • 主机访问容器需通过端口映射(如 localhost:3000 访问 web 服务)。

七、总结

Docker Compose 是多容器应用的「瑞士军刀」,通过简单的 YAML 配置和命令,就能快速管理复杂的应用架构。本文从安装、核心概念到实战案例,覆盖了入门所需的全部内容——你可以在此基础上扩展更多服务(如 Redis、Nginx),或优化配置(如健康检查、资源限制)。

下一步建议:尝试将自己的项目用 Compose 管理,或学习 Compose 的高级特性(如多环境配置、容器缩放),让容器化部署更高效!

如果在使用中遇到问题,可参考 Docker Compose 官方文档 或留言交流~

0 11496

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码