“docker compose”这个名词,但凡你接触过Docker,多少都见过几次。它比docker run更好用、更清晰,尤其适合在一台服务器上跑多个容器、或者想把一套服务的启动方式固化下来的场景。这篇文章我会从Compose的核心概念讲起,再手把手带你在Linux服务器上用Docker Compose把Nginx搭起来,覆盖配置挂载、反向代理、负载均衡和生产环境的常见坑,全部是我实际跑过、踩过、验证过的经验。
如果你正准备用Nginx做静态站点、反向代理或者负载均衡入口,又不想每次部署都靠记忆敲一长串docker run,这篇文章就是给你准备的。哪怕你是第一次听说Compose,按下面的步骤走完,也能独立搭出一套像样的Nginx服务。
1. 先搞懂Docker Compose解决的是什么问题
1.1 为什么docker run不够用
先说一个最常见的场景。你有一个Spring Boot后端、一个MySQL、一个Redis,加一个前端Nginx,四个人要服务配合起来才能跑通一套业务。用docker run一个个拉起来不是不行,但问题很现实:
- 每次启动都要敲一长串参数,映射端口、挂载目录、指定网络,漏掉一个参数服务行为就不一样。
- 容器之间的通信依赖网络配置,单独跑的时候你得手动
docker network create,然后再把每个容器都--network指过去。 - 配置没法版本化,哪天服务器重装,你只能凭记忆或者翻历史命令把服务一个个恢复起来。
- 同时操作多个容器时,启停顺序、依赖关系全是靠人肉控制。
Docker Compose就是为解决这些问题出现的。它用一个compose.yaml文件,把你要启动的所有服务、网络、卷、端口映射、依赖关系都声明清楚。之后一条docker compose up -d,整套服务一次性拉起;一条docker compose down,整套服务干干净净停掉。配置进Git,换机器直接拉代码启动,这比任何脚本都靠谱。
有人会说“我写个shell脚本不也一样吗”。脚本的问题是它描述的是“怎么做”,而不是“要什么”。比如脚本里写了先启动MySQL、再启动后端,但换个环境端口冲突了、目录不存在了,你需要在脚本里加各种判断逻辑。Compose的模型是声明式的,你告诉它最终要什么样,它自己处理顺序和依赖,这才是容器编排该有的思路。
1.2 Compose的三板斧:service、network、volume
compose.yaml核心就三类对象:服务(services)、网络(networks)、卷(volumes)。搞清楚这三者的关系,Compose基本就懂了一半。
**服务(services)**是核心,每个服务对应一个镜像和一组运行配置。比如Nginx服务、MySQL服务、后端Java服务,每个服务都类似一次docker run,但写法更结构化。你可以指定镜像、容器名、端口映射、环境变量、挂载卷、健康检查、重启策略等。
**网络(networks)**解决服务间的通信问题。Compose默认会为项目创建一个网络,同一个compose.yaml里的服务天然在同一个网络里,可以直接用服务名互相访问。比如Nginx要代理后端接口,配置里直接写proxy_pass http://backend:8080,这里的backend就是后端服务的服务名,Docker内建的DNS会自动解析成对应的容器IP,而这个IP是动态的,重新启动就可能变,所以必须用服务名而不是IP。
**卷(volumes)**解决数据持久化和配置注入问题。容器是临时的,删掉重建数据就没了,所以需要把宿主机目录挂载进容器,或者用命名卷让Docker帮你管理存储。Nginx这种无状态服务,主要挂载的是配置文件、静态文件和日志目录,后面我会专门讲。
1.3 为什么我用Compose而不用docker-compose
这里必须提一个很多新人困惑的点:docker-compose和docker compose到底什么关系。
早期Docker Compose是独立于Docker Engine的Python工具,用docker-compose命令调用。后来Docker官方把Compose以插件形式集成进了Docker Engine,成为V2版本,命令也变成中间不带横杠的docker compose。现在你安装新版Docker Engine的时候,Compose V2插件是默认自带的一部分,不需要单独安装。
所以下文里我统一使用docker compose(V2)的命令格式。如果你用的还是老版本环境,只有docker-compose,逻辑上完全一样,只是命令里多个横杠的区别。配置文件名方面,V2默认识别compose.yaml,也兼容老的docker-compose.yaml,我推荐统一用compose.yaml,干净而且符合新规范。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:把Docker和Compose插件装利索
2.1 Linux服务器上安装Docker Engine
现在大多数云服务器都是CentOS 7/8、Ubuntu 20.04/22.04这类系统,安装Docker Engine的方式官方文档写得很详细,我只把最核心的步骤和容易出错的地方说一下。
Ubuntu 22.04上用官方仓库安装,按顺序执行:
bash复制sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo a
