Docker Compose 详解与实战:从入门到精通的容器编排技术

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 docker-compose.yml 文件,开发者可以轻松地配置、启动和管理多个容器服务,从而简化复杂的容器化部署流程。本篇文章将详细介绍 Docker Compose 的核心概念、常用命令、配置方法以及一个完整的应用场景。

一、Docker Compose 简介

1.1 什么是 Docker Compose?

Docker Compose 是 Docker 官方提供的一个工具,允许用户通过一个 YAML 文件来定义一组服务、网络、卷以及其他 Docker 对象。使用 Docker Compose,可以一键启动、停止、重建和管理整个应用的容器化服务。

1.2 Docker Compose 的作用

  • 简化多容器应用的部署
  • 提供服务依赖管理
  • 支持环境变量、网络、卷等高级配置
  • 支持多环境(如开发、测试、生产)配置管理

1.3 安装 Docker Compose

在大多数系统上,Docker Compose 已经包含在 Docker Desktop 中。对于 Linux 用户,可以使用以下命令安装:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证安装:

docker-compose --version

二、Docker Compose 核心概念

2.1 docker-compose.yml 文件结构

Docker Compose 的核心是 docker-compose.yml 文件,它定义了服务、网络、卷等资源。以下是一个典型的结构:

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

2.2 服务(Service)

服务是 Docker Compose 的基本单位,代表一个容器实例。每个服务可以指定镜像、端口、环境变量等。

2.3 镜像(Image)

服务可以从指定的镜像启动容器,也可以使用 build 指令从 Dockerfile 构建。

2.4 网络(Network)

Docker Compose 支持自定义网络,服务之间可以通过服务名称进行通信。

2.5 卷(Volume)

卷用于持久化数据或共享数据,可以在多个服务之间共享。

2.6 环境变量(Environment)

环境变量用于配置服务的运行参数,可以通过 .env 文件统一管理。

三、Docker Compose 常用命令

3.1 启动服务

docker-compose up

3.2 启动后台运行

docker-compose up -d

3.3 查看服务状态

docker-compose ps

3.4 停止服务

docker-compose stop

3.5 删除服务

docker-compose down

3.6 重建服务

docker-compose build

3.7 查看日志

docker-compose logs

四、Docker Compose 配置详解

4.1 版本(version)

指定 Docker Compose 文件的版本,不同版本支持的功能略有不同。

4.2 端口映射(ports)

将宿主机的端口映射到容器的端口。

4.3 环境变量(environment)

设置容器内的环境变量。

4.4 健康检查(healthcheck)

定义容器的健康检查策略。

4.5 重启策略(restart)

定义容器的重启策略,如 alwayson-failure 等。

4.6 依赖关系(depends_on)

定义服务之间的依赖关系。

4.7 卷(volumes)

定义服务使用的卷。

4.8 网络(networks)

定义服务使用的自定义网络。

五、Docker Compose 实战应用

5.1 场景描述:部署一个 Node.js + MySQL 的 Web 应用

我们以一个简单的 Node.js Web 应用连接 MySQL 数据库为例,展示如何使用 Docker Compose 进行多容器部署。

5.1.1 项目结构
my-app/
├── docker-compose.yml
├── web/
│   ├── Dockerfile
│   ├── package.json
│   └── app.js
└── db_data/
5.1.2 编写 Dockerfile(web/Dockerfile)
FROM node:18
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
5.1.3 编写 app.js(web/app.js)
const express = require('express');
const mysql = require('mysql');

const app = express();
const port = 3000;

const connection = mysql.createConnection({
  host: 'db',
  user: 'root',
  password: 'example',
  database: 'test_db'
});

connection.connect();

app.get('/', (req, res) => {
  connection.query('SELECT "Hello from MySQL" AS message', (error, results) => {
    if (error) throw error;
    res.send(results[0].message);
  });
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});
5.1.4 编写 docker-compose.yml
version: '3'
services:
  web:
    build: ./web
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: test_db
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
5.1.5 启动服务
docker-compose up -d
5.1.6 访问应用

打开浏览器,访问 http://localhost:3000,你应该会看到页面输出 Hello from MySQL

5.2 高级应用:多环境配置

Docker Compose 支持多环境配置,例如 docker-compose.dev.ymldocker-compose.prod.yml,可以通过 -f 指定不同的配置文件。

5.2.1 开发环境配置(docker-compose.dev.yml)
version: '3'
services:
  web:
    environment:
      NODE_ENV: development
    ports:
      - "3001:3000"
5.2.2 生产环境配置(docker-compose.prod.yml)
version: '3'
services:
  web:
    environment:
      NODE_ENV: production
    ports:
      - "80:3000"
    restart: always
5.2.3 启动不同环境
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

六、总结

Docker Compose 是一个强大的工具,能够极大地简化多容器应用的部署和管理。通过一个 docker-compose.yml 文件,开发者可以轻松地定义、启动和管理整个应用的容器化服务。在本文中,我们详细讲解了 Docker Compose 的核心概念、常用命令、配置方法,并通过一个完整的 Node.js + MySQL 应用部署案例,展示了其在实际项目中的应用。

如果你是初学者,建议从简单的 docker-compose.yml 文件开始,逐步掌握服务定义、依赖管理、卷和网络配置等技能。对于进阶用户,可以尝试使用多环境配置、自定义网络和健康检查等高级功能,以提高部署的灵活性和可靠性。

Docker Compose 是现代 DevOps 流程中不可或缺的一部分,掌握它将极大地提升你的容器化应用开发效率。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐