Docker 与 Nginx 网站部署笔记
1. Compose.yaml 与端口映射
compose.yaml 是容器编排配置文件,用来描述需要启动哪些服务以及运行参数。每个 Docker 容器都有独立的 "虚拟网卡" 和端口表,相当于一台隔离的小机器。
本机默认看不见容器里开了什么端口,除非用 compose.yaml 里的ports:做"端口映射",把宿主机的某个端口和容器端口接通:
ports:
- "5432:5432"
左边是宿主机端口,右边是容器端口。PostgreSQL 默认监听容器内的 5432 端口,因此常见写法是 5432:5432。
Docker的端口映射
以 PostgreSQL 为例,docker 的数据库容器端口映射配置为 5432:5432(全称:0.0.0.0:5432:5432),左边是本机端口可以随意指定,右边是容器内 PostgreSQL 默认的监听端口不可修改。
当做了端口映射,本机程序或外部程序访问本机的 5432 端口时, docker 会把流量转发到容器里 PostgreSQL 监听的 5432 端口。
Docker的网络防护
docker 做端口映射(5432:5432)时,它会自动在系统防火墙(iptables)里加一条规则,把这个端口放行。
如果云服务器安全组中开放了 5432 端口,端口会通过公网 IP 会给全世界访问,互联网上跑着大量自动化扫描器,如果 docker 中数据库配置写成 5432:5432 ,就可能被别人使用弱密码字典爆破(admin/123456/postgres等),导致泄露数据。
因此服务器运行的docker容器端口映射只能使用只绑定本机回环地址:
ports:
- "127.0.0.1:5432:5432"
本地开发为了方便调试可以使用 5432:5432,家用宽带有网络地址转换,不会被扫到。
Compose.yaml 服务之间通信
同一个 compose.yaml 项目中的服务会自动加入同一个网络,并且可以通过服务名互相访问,不需要为内部通信配置端口映射。例如 Spring Boot 连接名为 postgres 的数据库服务:
jdbc:postgresql://postgres:5432/srams
这里的 postgres 是服务名,Docker 内置 DNS 会把它解析到对应容器的 IP。容器 IP 可能变化,因此不要把它写死。
2. 端口、防火墙与安全组
端口:操作系统内核里的一张数字表,用于区分网络服务,范围通常是 0–65535。
防火墙:服务器操作系统里的过滤机制,网络数据包已经到了服务器,内核再过一遍。
安全组:云厂商机房的网络层过滤机制,网络数据包还没到服务器就被拦。
服务器部署时应尽量减少公网暴露的端口,只开放确实需要提供给用户访问的端口,并为数据库、管理后台等服务增加访问控制。
3. 正向代理 VPN 与反向代理 Nginx
正向代理:开VPN访问百度,百度看见的是VPN的IP,VPN代理代表客户端。
反向代理:用户访问网站,Nginx转发用户的请求到不同后端服务,Nginx代理代表后端服务。
Nginx 的妙用:
统一入口:所有用户请求只走 Nginx 的 80 端口,后端服务根本不直接对外暴露;
路由分发:/ → 给前端静态文件;/api/xxx → 转发给 Spring Boot;
静态文件托管:Vue build 出来的 HTML/JS/CSS 直接由 Nginx 读磁盘返回,不用经过后端;
HTTPS:SSL 证书配在 Nginx 这里,后端可以通过内网连接;
负载均衡:以后后端跑多个实例,Nginx 把请求平均分;
4. location 与 proxy_pass
location :告诉Nginx接下来要定义一个路径匹配规则:
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
此时请求 /api/login 会转发为 http://127.0.0.1:8080/api/login,后端接收/api/login。
如果 proxy_pass 末尾带斜杠意味着路径重写:
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
/api/login 会去掉匹配到的 /api/,转发为http://127.0.0.1:8080/login,后端接收/login。。
location / 和 location /api/ 的区别:网络请求 /api/login 匹配时优先匹配最合适的前缀( /api/ > / )
location / 是 "兜底" 规则,只有没被更精确 location 接住的请求才落到它这里
5. 常见 HTTP 状态码
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 301 | 永久重定向(旧地址永久搬到新地址) |
| 302 | 临时重定向 |
| 304 Not Modified | 缓存还没过期,用本地的就行 |
| 400 Bad Request | 请求格式不对后端校验参数失败 |
| 401 Unauthorized | 没登录或登录过期,没带 token 就访问 |
| 403 Forbidden | 已认证但没有权限访问这个接口 |
| 404 Not Found | 找不到页面或接口 |
| 500 Internal Server Error | 后端程序发生错误 |
| 502 Bad Gateway | Nginx 反代不到后端,后端容器挂了,Nginx 收到请求但转不过去 |
| 504 Gateway Timeout | 后端响应太慢后端处理超时 |