问题出在你的 Nginx 配置文件(/etc/nginx/conf.d/default.conf)第 19 行。你使用了 host.docker.internal 这个域名来指向后端服务,但在 Linux 服务器的原生 Docker 环境中,这个域名默认是不存在的,导致 Nginx 启动时无法解析地址而直接崩溃。
解决方案
你有两种方法可以修复这个问题,推荐使用方法一:
方法一:修改启动命令(最简单)
在 docker run 命令中添加 --add-host 参数,手动告诉容器 host.docker.internal 对应的 IP 是宿主机网关。
请执行以下命令重启容器:
# 1. 先删除报错的旧容器
docker rm -f nginx
# 2. 使用新命令启动(注意增加了 --add-host 参数)
docker run -d --name nginx -p 80:80 \
--add-host=host.docker.internal:host-gateway \
-v /etc/nginx/dist:/usr/share/nginx/html \
-v /etc/nginx/conf.d:/etc/nginx/conf.d \
nginx
- 原理:
host-gateway会自动解析为宿主机的内部 IP(通常是172.17.0.1),这样容器就能通过这个域名找到宿主机上的 Java 后端了。
方法二:修改 Nginx 配置文件
如果你不想改启动命令,可以直接修改服务器上的配置文件 /etc/nginx/conf.d/default.conf。
- 打开文件:
vim /etc/nginx/conf.d/default.conf - 找到第 19 行,将
proxy_pass http://host.docker.internal:端口号;中的host.docker.internal替换为 宿主机的真实局域网 IP (例如192.168.x.x)或者 Docker 网关 IP (通常是172.17.0.1)。 - 保存后重启容器:
docker restart nginx
为什么会出现这个问题?
- Windows/Mac 用户: Docker Desktop 会自动配置
host.docker.internal,所以很多教程里都这么写。 - Linux 服务器用户: 原生的 Docker Engine 不会自动配置这个 DNS 记录。Nginx 在启动阶段会严格检查所有
upstream域名的有效性,一旦解析失败就会拒绝启动(这就是你看到的[emerg]错误)。
验证是否成功
执行完上述操作后,运行 docker ps。如果看到 nginx 容器的状态是 Up ... 而不是 Exited,就说明启动成功了。此时你可以访问服务器 IP 测试前端页面和接口代理是否正常。