文章目录
  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • Python系列文章目录
  • Go语言系列文章目录
  • Docker系列文章目录
  • 摘要
  • 一、为什么需要 Docker Compose?
    • 1.1 单容器应用的局限性
    • 1.2 手动管理的噩梦
    • 1.3 Docker Compose 的诞生:化繁为简
  • 二、Docker Compose 核心概念与安装
    • 2.1 核心概念解析
    • 2.2 安装 Docker Compose
  • 三、`docker-compose.yml` 文件详解
    • 3.1 文件结构概览
    • 3.2 `services` 配置项剖析
    • 3.3 一个简单的示例
  • 四、Docker Compose 常用命令
    • 4.1 启动与构建
    • 4.2 查看与管理
    • 4.3 停止与清理
    • 4.4 命令总结表格
  • 五、实战演练:编排一个简单的 Web 应用
    • 5.1 场景描述
    • 5.2 项目结构
    • 5.3 编写应用代码
        • (1) `requirements.txt`
        • (2) `app.py`
        • (3) `Dockerfile` (用于构建 `web` 服务)
    • 5.4 编写 `docker-compose.yml`
    • 5.5 一键启动与验证
  • 六、总结

摘要

在现代软件开发中,一个应用通常由多个相互协作的服务构成,例如 Web 服务器、数据库、缓存和消息队列。手动管理这些分散的容器不仅繁琐、易错,而且难以复现和共享。本文是 Docker 入门系列的第 14 篇,将深入探讨 Docker 生态中的编排神器——Docker Compose。我们将从“为什么需要 Docker Compose”出发,系统解析其核心概念、docker-compose.yml 文件的编写范式,并通过一个完整的实战案例,手把手教你如何使用 Docker Compose 定义和运行一个多容器应用,真正实现“一键启动,一键销毁”的高效开发与部署流程。


一、为什么需要 Docker Compose?

在我们掌握了如何运行单个 Docker 容器后,很快就会遇到一个现实问题:绝大多数真实世界的应用程序都不是孤立存在的。一个典型的 Web 应用可能包含前端服务、后端 API、数据库和缓存服务。如果这些服务都分别容器化,我们该如何管理它们呢?

1.1 单容器应用的局限性

想象一下,我们正在开发一个 WordPress 网站。它至少需要两个核心组件:

  • WordPress 服务:运行 PHP 代码的 Web 服务器。
  • MySQL 服务:用于存储文章、用户等数据的数据库。

这两个服务必须在同一个网络中,以便 WordPress 能够连接到 MySQL。如果只使用 docker run,我们将面临一系列挑战。

1.2 手动管理的噩梦

如果坚持使用基础的 docker 命令来管理这个 WordPress 应用,我们的操作流程可能会是这样的:

  1. 创建网络:首先,需要手动创建一个 Docker 网络,以确保两个容器可以互相通信。```
    docker network create wordpress-net

    
    
  2. 启动 MySQL 容器:编写一条长长的 docker run 命令来启动数据库,需要指定网络、挂载数据卷以持久化数据、设置环境变量等。```
    docker run -d --name mysql-db
    –network wordpress-net
    -v db_data:/var/lib/mysql
    -e MYSQL_ROOT_PASSWORD=my-secret-pw
    -e MYSQL_DATABASE=wordpress
    mysql:5.7

    
    
  3. 启动 WordPress 容器:再编写另一条复杂的命令来启动 WordPress,需要链接到同一个网络、映射端口到主机、并配置环境变量指向刚刚创建的数据库。```
    docker run -d --name wordpress-app
    –network wordpress-net
    -p 8080:80
    -e WORDPRESS_DB_HOST=mysql-db
    -e WORDPRESS_DB_PASSWORD=my-secret-pw
    -e WORDPRESS_DB_NAME=wordpress
    wordpress

    
    
    

这个过程存在显而易见的痛点:

  • 命令冗长且易错:每条命令都包含大量参数,容易输错,且难以记忆。
  • 管理困难:启动、停止、重启或删除整个应用需要对多个容器分别执行命令。
  • 依赖关系不明确:WordPress 依赖于 MySQL,必须先启动数据库。这种启动顺序需要手动保证。
  • 环境难以复制:如果新同事想在自己机器上搭建同样的环境,他必须重复以上所有步骤,并确保所有参数完全一致,效率极低。

1.3 Docker Compose 的诞生:化繁为简

为了解决上述问题,Docker Compose 应运而生。它是一个用于定义和运行多容器 Docker 应用程序的工具。

核心思想:使用一个 YAML 文件(docker-compose.yml)来配置应用的所有服务,然后使用一条命令,就可以根据配置创建并启动所有服务。

这就像从手写乐谱的每个音符(单个 docker run),升级为拥有一份完整的交响乐总谱(docker-compose.yml 文件),而你,作为指挥家,只需一个手势(docker compose up),就能让整个乐队(所有容器)和谐地演奏起来。

二、Docker Compose 核心概念与安装

在深入学习如何编写 YAML 文件之前,我们先来了解 Docker Compose 的几个基本概念和安装方法。

2.1 核心概念解析

  • 服务 (Service):一个服务代表一个应用容器的配置。它定义了该容器应使用哪个镜像、如何构建、需要映射哪些端口、依赖哪些其他服务等。在 docker-compose.yml 文件中,我们定义的每一个顶级键就是一个服务。例如,web 服务和 db 服务。
  • 项目 (Project):一个项目是由一个 docker-compose.yml 文件定义的整个应用,它包含了多个服务。Docker Compose 会为每个项目创建一个独立的环境,包括默认的网络。项目名称通常是其所在目录的名称。
  • 网络 (Network):Docker Compose 会为每个项目自动创建一个默认的 bridge 网络。该项目下的所有服务都会连接到这个网络中。最妙的是,在这个网络内部,每个服务都可以通过其服务名作为主机名直接访问其他服务。例如,web 服务可以直接通过 ping db 来连接到数据库服务,而无需关心其容器 IP 地址。

2.2 安装 Docker Compose

Docker Compose 的安装非常简单,因为它现在已经作为 Docker 的一个插件集成到了 Docker Engine 中。

  • 对于 Windows 和 macOS 用户
    如果你安装了 Docker Desktop,那么 Docker Compose 已经内置好了,无需额外安装。

  • 对于 Linux 用户
    Docker Compose 现在以 docker-compose-plugin 的形式提供。你可以使用系统的包管理器进行安装。例如,在 Ubuntu/Debian 上:```
    sudo apt-get update
    sudo apt-get install docker-compose-plugin

    在 CentOS/Fedora 上,通常通过设置 Docker 的官方仓库后使用 `dnf` 或 `yum` 安装。
    
    

安装完成后,可以通过以下命令验证:

docker compose version

注意:你可能在旧的教程或项目中看到 docker-compose(带连字符)的命令。这是 V1 版本的独立二进制文件。现在官方推荐使用 docker compose(无连字符)命令,它是 V2 版本,作为 Docker CLI 的一个插件,提供了更好的集成和性能。

三、docker-compose.yml 文件详解

docker-compose.yml 是 Docker Compose 的灵魂,它使用 YAML 语法来描述一个多容器应用的完整架构。

3.1 文件结构概览

一个典型的 docker-compose.yml 文件结构如下:

# 顶层键定义了Compose文件的版本规范,现在已是可选的
# version: "3.8" 

# 定义所有的服务
services:
  # 服务1:例如一个web服务器
  web:
    # ... 服务的具体配置 ...

  # 服务2:例如一个数据库
  database:
    # ... 服务的具体配置 ...

# (可选)定义自定义网络
networks:
  # ... 网络配置 ...

# (可选)定义数据卷
volumes:
  # ... 数据卷配置 ...

最核心的部分是 services,它包含了应用的所有组件。

3.2 services 配置项剖析

services 键下,我们可以为每个服务定义一系列配置。以下是一些最常用的指令:

指令 描述 示例
image 指定服务使用的镜像。如果本地没有,Compose 会尝试从 Docker Hub 拉取。 image: "nginx:latest"
build 指定用于构建镜像的 Dockerfile 路径。 build: .build: ./webapp
container_name 指定一个自定义的容器名称,而不是由 Compose 自动生成。 container_name: my-web-server
ports 映射端口。格式为 "主机端口:容器端口" ports: - "8080:80"
volumes 挂载数据卷或绑定挂载。 volumes: - db-data:/var/lib/mysql
environment 设置环境变量。可以是键值对或数组。 environment: - MYSQL_ROOT_PASSWORD=secret
depends_on 定义服务间的启动依赖关系。 depends_on: - database
networks 将服务连接到指定的网络。 networks: - my-app-net
command 覆盖容器启动时执行的默认命令。 command: ["redis-server", "--appendonly", "yes"]
restart 定义容器的重启策略,如 no, always, on-failure restart: always

3.3 一个简单的示例

让我们来看一个只包含 Redis 服务的简单 docker-compose.yml 文件,以熟悉其语法:

docker-compose.yml

services:
  # 定义一个名为 "cache" 的服务
  cache:
    # 使用官方的 redis:alpine 镜像
    image: "redis:alpine"
    # 给容器取一个固定的名字
    container_name: my-redis-cache
    # 将主机的 6379 端口映射到容器的 6379 端口
    ports:
      - "6379:6379"
    # 挂载一个名为 "redis-data" 的数据卷到容器的 /data 目录
    volumes:
      - redis-data:/data
    # 设置重启策略为总是重启
    restart: always

# 在文件末尾定义顶层 volumes,让 Compose 管理这个数据卷
volumes:
  redis-data:

有了这个文件,我们不再需要记住任何 docker run 参数。

四、Docker Compose 常用命令

掌握了 YAML 文件的编写,接下来就是学习如何使用 docker compose 命令来“指挥”我们的应用。所有命令都需要在包含 docker-compose.yml 文件的目录中执行。

4.1 启动与构建

  • docker compose up
    这是最核心的命令,它会一次性创建并启动所有服务。

    # 在前台启动,日志会直接输出到终端
    docker compose up
    
    # 使用 -d (detached) 参数在后台启动
    docker compose up -d
    
    
  • docker compose up --build
    如果你的服务配置中使用了 build 指令(即通过 Dockerfile 构建),此命令会在启动容器前强制重新构建镜像。

    docker compose up -d --build
    
    

4.2 查看与管理

  • docker compose ps
    列出当前项目中所有容器的状态。```
    docker compose ps

    
    
  • docker compose logs
    查看服务的日志输出。```

    查看所有服务的日志

    docker compose logs

    持续跟踪日志 (-f, follow)

    docker compose logs -f

    只看特定服务的日志

    docker compose logs -f web

    
    
  • docker compose exec
    在一个正在运行的服务(容器)中执行命令,非常适合用于调试。```

    在名为 web 的服务中启动一个交互式 shell

    docker compose exec web sh

    
    
    

4.3 停止与清理

  • docker compose stop
    停止正在运行的服务,但不会删除它们。可以通过 docker compose start 重新启动。

  • docker compose down
    这是 up 的逆操作。它会停止并移除项目中的所有容器和网络。```
    docker compose down

    如果还想删除在 `volumes` 中定义的数据卷,需要加上 `-v` 参数。```
    # 彻底清理,包括数据卷
    docker compose down -v
    
    

4.4 命令总结表格

命令 主要作用
docker compose up [-d] 创建并启动所有服务(-d 后台运行)
docker compose down [-v] 停止并移除容器、网络(-v 移除数据卷)
docker compose ps 查看项目中所有容器的状态
docker compose logs [-f] [service] 查看服务日志(-f 持续跟踪)
docker compose exec <service> <command> 在指定服务中执行命令
docker compose build [service] 构建或重新构建服务的镜像
docker compose pull [service] 拉取服务所需的镜像
docker compose start/stop/restart [service] 启动/停止/重启服务

五、实战演练:编排一个简单的 Web 应用

理论结合实践是最好的学习方式。让我们来构建一个简单的 Web 应用,它包含一个 Python Flask 后端和一个 Redis 数据库,用于计算网页的访问次数。

5.1 场景描述

  • web 服务:一个用 Flask 编写的简单网页,每次刷新都会连接 Redis,使一个计数器加一,并显示当前计数值。
  • redis 服务:一个 Redis 数据库,用于存储访问次数。

这个例子能清晰地展示服务间如何通过服务名进行通信。

5.2 项目结构

首先,创建如下的目录和文件结构:

/my-visit-counter
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml

5.3 编写应用代码

(1) requirements.txt
flask
redis

(2) app.py
from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
# 注意:这里的主机名 'redis' 正是 docker-compose.yml 中定义的服务名!
# Docker Compose 会自动处理 DNS 解析,将 'redis' 指向 Redis 容器的 IP。
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return f'Hello from Docker! I have been seen {count} times.\n'

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

(3) Dockerfile (用于构建 web 服务)
# 使用官方 Python 镜像作为基础
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 容器启动时执行的命令
CMD ["python", "app.py"]

5.4 编写 docker-compose.yml

这是整个编排的核心。

services:
  # 定义 Web 服务
  web:
    # 使用当前目录下的 Dockerfile 进行构建
    build: .
    # 将主机的 8000 端口映射到容器的 5000 端口
    ports:
      - "8000:5000"
    # 显式声明 web 服务依赖于 redis 服务
    # 这能保证 redis 会在 web 之前启动
    depends_on:
      - redis

  # 定义 Redis 服务
  redis:
    # 直接使用官方 Redis 镜像
    image: "redis:alpine"

这个配置文件的精髓在于:

  1. 服务发现web 服务通过主机名 redis 就能找到 redis 服务。
  2. 依赖管理depends_on 确保了启动顺序的正确性。

5.5 一键启动与验证

现在,所有准备工作都已完成。在 my-visit-counter 目录下,执行:

docker compose up -d

Compose 会自动:

  1. 读取 docker-compose.yml 文件。
  2. web 服务构建 Docker 镜像。
  3. 拉取 redis 镜像。
  4. 创建一个名为 my-visit-counter_default 的网络。
  5. 启动 redis 容器并加入网络。
  6. 启动 web 容器并加入网络。

你可以用 docker compose ps 查看状态:

NAME                COMMAND                  SERVICE             STATUS              PORTS
my-visit-counter-redis-1   "docker-entrypoint.s…"   redis               running             6379/tcp
my-visit-counter-web-1     "python app.py"          web                 running             0.0.0.0:8000->5000/tcp

现在,打开浏览器访问 http://localhost:8000。你应该能看到 “Hello from Docker! I have been seen 1 times.”。每次刷新页面,计数器都会增加。

最后,当你完成实验后,只需一条命令即可清理所有资源:

docker compose down

六、总结

通过本文的学习,我们完成了从手动管理单个容器到使用 Docker Compose 优雅编排多容器应用的跨越。现在,让我们对核心知识点进行回顾:

  1. 核心价值:Docker Compose 旨在解决多容器应用管理的复杂性,通过一个 docker-compose.yml 配置文件,实现了对整个应用栈的声明式定义一键式管理,极大地提升了开发、测试和部署的效率与一致性。
  2. 核心组件:Compose 的世界由服务 (Service)项目 (Project)网络 (Network) 构成。每个服务是一个容器配置,所有服务共同组成一个项目,并默认共享一个隔离的网络环境。
  3. YAML 文件是蓝图docker-compose.yml 文件是应用架构的“总设计图”。我们通过 image, build, ports, volumes, environment, depends_on 等指令精确描述每个服务的行为和它们之间的关系。
  4. 服务发现是关键:Compose 最强大的特性之一是其内置的服务发现机制。在同一个 Compose 项目中,任何服务都可以通过其服务名作为主机名直接访问到另一个服务,这大大简化了容器间的通信配置。
  5. 命令集是工具箱:以 docker compose updocker compose down 为核心的命令集,为我们提供了完整的应用生命周期管理能力,包括启动、停止、查看日志、执行命令和彻底清理,让复杂操作变得简单直观。

零基础如何高效学习大模型?

你是否懂 AI,是否具备利用大模型去开发应用能力,是否能够对大模型进行调优,将会是决定自己职业前景的重要参数。

为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和鲁为民博士系统梳理大模型学习脉络,这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码免费领取🆓**⬇️⬇️⬇️

在这里插入图片描述

【大模型全套视频教程】

教程从当下的市场现状和趋势出发,分析各个岗位人才需求,带你充分了解自身情况,get 到适合自己的 AI 大模型入门学习路线。

从基础的 prompt 工程入手,逐步深入到 Agents,其中更是详细介绍了 LLM 最重要的编程框架 LangChain。最后把微调与预训练进行了对比介绍与分析。

同时课程详细介绍了AI大模型技能图谱知识树,规划属于你自己的大模型学习路线,并且专门提前收集了大家对大模型常见的疑问,集中解答所有疑惑!

在这里插入图片描述

深耕 AI 领域技术专家带你快速入门大模型

跟着行业技术专家免费学习的机会非常难得,相信跟着学习下来能够对大模型有更加深刻的认知和理解,也能真正利用起大模型,从而“弯道超车”,实现职业跃迁!

图片

【AI 大模型面试题 】

除了 AI 入门课程,我还给大家准备了非常全面的**「AI 大模型面试题」,**包括字节、腾讯等一线大厂的 AI 岗面经分享、LLMs、Transformer、RAG 面试真题等,帮你在面试大模型工作中更快一步。

【大厂 AI 岗位面经分享(92份)】

图片

【AI 大模型面试真题(102 道)】

图片

【LLMs 面试真题(97 道)】

图片

【640套 AI 大模型行业研究报告】

在这里插入图片描述

【AI大模型完整版学习路线图(2025版)】

明确学习方向,2025年 AI 要学什么,这一张图就够了!

img

👇👇点击下方卡片链接免费领取全部内容👇👇

在这里插入图片描述

抓住AI浪潮,重塑职业未来!

科技行业正处于深刻变革之中。英特尔等巨头近期进行结构性调整,缩减部分传统岗位,同时AI相关技术岗位(尤其是大模型方向)需求激增,已成为不争的事实。具备相关技能的人才在就业市场上正变得炙手可热。

行业趋势洞察:

  • 转型加速: 传统IT岗位面临转型压力,拥抱AI技术成为关键。
  • 人才争夺战: 拥有3-5年经验、扎实AI技术功底真实项目经验的工程师,在头部大厂及明星AI企业中的薪资竞争力显著提升(部分核心岗位可达较高水平)。
  • 门槛提高: “具备AI项目实操经验”正迅速成为简历筛选的重要标准,预计未来1-2年将成为普遍门槛。

与其观望,不如行动!

面对变革,主动学习、提升技能才是应对之道。掌握AI大模型核心原理、主流应用技术与项目实战经验,是抓住时代机遇、实现职业跃迁的关键一步。

在这里插入图片描述

01 为什么分享这份学习资料?

当前,我国在AI大模型领域的高质量人才供给仍显不足,行业亟需更多有志于此的专业力量加入。

因此,我们决定将这份精心整理的AI大模型学习资料,无偿分享给每一位真心渴望进入这个领域、愿意投入学习的伙伴!

我们希望能为你的学习之路提供一份助力。如果在学习过程中遇到技术问题,也欢迎交流探讨,我们乐于分享所知。

*02 这份资料的价值在哪里?*

专业背书,系统构建:

  • 本资料由我与鲁为民博士共同整理。鲁博士拥有清华大学学士美国加州理工学院博士学位,在人工智能领域造诣深厚:

    • 在IEEE Transactions等顶级学术期刊及国际会议发表论文超过50篇
    • 拥有多项中美发明专利。
    • 荣获吴文俊人工智能科学技术奖(中国人工智能领域重要奖项)。
  • 目前,我有幸与鲁博士共同进行人工智能相关研究。

在这里插入图片描述

内容实用,循序渐进:

  • 资料体系化覆盖了从基础概念入门核心技术进阶的知识点。

  • 包含丰富的视频教程实战项目案例,强调动手实践能力。

  • 无论你是初探AI领域的新手,还是已有一定技术基础希望深入大模型的学习者,这份资料都能为你提供系统性的学习路径和宝贵的实践参考助力你提升技术能力,向大模型相关岗位转型发展

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

抓住机遇,开启你的AI学习之旅!

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐