跳转至

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. locationproxy_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 后端响应太慢后端处理超时