前言:每个开发者都踩过的「环境地狱」
相信每个开发者都踩过这种坑:公司压箱底的 Vue2 老项目交到你手上,文档明明白白写着要求 Node 16 + npm 8,可你电脑早就更新到 Node 22 了。npm install 一路红错,降版本怕影响新项目,装版本管理工具又一堆配置,折腾一下午还没跑起来。
Docker 的出现,就是为了彻底终结这种玄学问题。
我发现一个非常贴切的类比:
现在大家常说的 Agent = LLM + Harness 能力套件(工具 / MCP/RAG/Skill...) 而 Docker = 应用代码 + 完整运行环境
本质上都是把「核心能力 + 所有依赖」打包成一个独立、可复用的单元,走到哪都能开箱即用,完全不用操心外部环境。
一、Docker 的核心价值:环境隔离与一致性部署
Docker 的核心逻辑非常朴素:它把你的应用代码、依赖库、运行时、环境变量、配置文件 ------ 所有跑起来需要的东西,全部打包成一个镜像。 这个镜像可以在任何安装了 Docker 的机器上运行,无论你的电脑是 Windows、Mac 还是 Linux,无论你本地装的是什么版本的 Node/Java/Python,容器里的环境永远是一致的。
回到前面老项目的例子:
- 你不需要在本地装 Node 16
- 只需要把项目打包成一个内置 Node 16 环境的 Docker 镜像
- 一条命令就能跑起来,和你本地的 Node 22 完全隔离,互不影响
这也是为什么现在所有公司的部署流程都离不开 Docker------ 从开发、测试到生产,环境完全一致,再也不会出现「我本地能跑啊」的经典扯皮。
二、Nginx 在架构里到底扮演什么角色?
聊 Docker 部署,几乎绕不开 Nginx。作为高性能 Web 服务器,Nginx 最核心的两个能力就是高并发处理 和反向代理。
很多新手一直有个疑问:为什么我们访问网站的时候,几乎从来不用加端口号? 答案很简单:
- HTTP 协议默认端口是
80,HTTPS 默认是443,浏览器会自动帮你补上 - 但真正的业务服务(前端项目、Node 接口、Java 后端)往往跑在 3000、8080、1314 这些自定义端口上
这时候 Nginx 就充当了「统一入口」的角色:
- Nginx 自己占用服务器的
80端口,接收所有外部进来的请求 - Nginx 根据请求的域名、路径等规则,新建一个内部请求,转发给对应端口的后端服务
- 后端处理完再原路返回给 Nginx,Nginx 再返回给用户
对外只暴露 80/443 端口,既整洁又安全,用户根本不知道背后的服务跑在哪个端口。
三、运维面试必考点:正向代理 vs 反向代理
代理是运维和后端面试的高频题,很多人容易搞混正向和反向,其实核心区别只有一个:代理的对象是谁。
1. 正向代理:代理「客户端」
正向代理架在客户端一侧,代替客户端去发送请求。
- 典型场景:浏览器代理、VPN、内网访问外网
- 特点:服务端不知道真正的客户端是谁,只能看到代理的请求
- 通俗理解:你找代购帮你买东西,卖家只知道卖给了代购,不知道你是谁
对应到网络请求里就是:用户 -> 浏览器/代理客户端 -> 目标服务器,代理替用户发请求、收响应。
2. 反向代理:代理「服务端」
反向代理架在服务端一侧,代替服务端去接收请求。
- 典型场景:Nginx、CDN、负载均衡
- 特点:客户端不知道真正的服务地址和端口,只能看到代理服务器
- 通俗理解:你去奶茶店点单,前台接待你,然后后厨做餐,你不知道后厨在哪、是谁做的,前台就是反向代理
对应到 Nginx 就是:用户 -> Nginx(80端口) -> 后端服务(1314端口),Nginx 对外统一暴露 80 端口,内部转发到各个业务端口。
核心区别对比
表格
| 对比维度 | 正向代理 | 反向代理 |
|---|---|---|
| 代理对象 | 客户端 | 服务端 |
| 部署位置 | 客户端一侧 | 服务端一侧 |
| 隐藏对象 | 真实客户端身份 | 真实服务地址 / 端口 |
| 典型应用 | VPN、浏览器代理 | Nginx、负载均衡、CDN |
| 核心目的 | 突破访问限制、保护客户端 | 统一入口、负载均衡、保护服务端 |
四、Docker 启动 Nginx 实操详解
我们用一条最基础的命令,拆解 Docker 启动 Nginx 的所有核心参数:
css
docker run \
--name my-nginx-demo \
-p 80:80 \
-d \
nginx
逐个参数解释:
-
docker run:核心命令,作用是从一个镜像启动一个可运行的容器 -
--name my-nginx-demo:给启动的容器起一个名字,方便后续停止、删除、查看日志等管理操作 -
-p 80:80:端口映射,也是新手最容易搞反的参数- 左边是宿主机(你的电脑 / 服务器)的端口
- 右边是容器内部的端口
- 这里的意思是:把宿主机的 80 端口,映射到容器内部的 80 端口(Nginx 默认监听 80)
- 访问宿主机的 80 端口,就等于访问容器里 Nginx 的 80 端口
-
-d:后台守护进程模式运行,启动后不会占用当前终端窗口
配置反向代理
如果我们想让 Nginx 把请求转发到内部的 1314 端口服务,就需要挂载自定义的 nginx.conf 配置文件,用到 -v 挂载参数:
-v 宿主机配置文件路径:容器内配置文件路径
简单的反向代理配置示例:
ini
server {
listen 80;
server_name localhost;
location / {
# 把所有请求转发到内部 1314 端口的服务
proxy_pass http://127.0.0.1:1314;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
带配置启动的完整命令:
javascript
docker run \
--name my-nginx-demo \
-p 80:80 \
-v ./nginx.conf:/etc/nginx/conf.d/default.conf \
-d \
nginx
总结
最后提炼几个核心考点,不管是面试还是实际运维都用得上:
- Docker 的本质是应用 + 运行环境打包,解决环境不一致问题,实现容器级隔离
- Nginx 的核心作用是反向代理,作为统一入口接收请求,转发给后端服务
- 正向代理代理客户端,反向代理代理服务端,这是两者最本质的区别
- Docker 端口映射遵循
主机端口:容器端口的顺序,不要搞反