docker run 命令中添加 --add-host 参数

问题出在你的 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

  1. 打开文件:vim /etc/nginx/conf.d/default.conf
  2. 找到第 19 行,将 proxy_pass http://host.docker.internal:端口号; 中的 host.docker.internal 替换为 宿主机的真实局域网 IP (例如 192.168.x.x)或者 Docker 网关 IP (通常是 172.17.0.1)。
  3. 保存后重启容器:docker restart nginx

为什么会出现这个问题?

  • Windows/Mac 用户: Docker Desktop 会自动配置 host.docker.internal,所以很多教程里都这么写。
  • Linux 服务器用户: 原生的 Docker Engine 不会自动配置这个 DNS 记录。Nginx 在启动阶段会严格检查所有 upstream 域名的有效性,一旦解析失败就会拒绝启动(这就是你看到的 [emerg] 错误)。

验证是否成功

执行完上述操作后,运行 docker ps。如果看到 nginx 容器的状态是 Up ... 而不是 Exited,就说明启动成功了。此时你可以访问服务器 IP 测试前端页面和接口代理是否正常。

相关推荐
李白的天不白2 小时前
一个服务器可以搭建多个网站
java·tomcat
就叫_这个吧3 小时前
tomcat在idea控制台乱码问题解决
java·tomcat·intellij-idea
2601_961845425 小时前
2026四级作文预测26年|英语四级写作范文+模板PDF
java·数据库·spring·eclipse·pdf·tomcat·hibernate
sinat_2554878118 小时前
第七部分。介绍MVC(模型-视图-控制器)模式
java·ide·http·tomcat·intellij-idea
就叫_这个吧1 天前
servlet整合tomcat项目启动报错解决,org.apache.tomcat.util.descriptor.web.WebXml.setVersion
java·servlet·tomcat·apache
摇滚侠2 天前
JavaWeb 全套教程 Listener 112-113
java·开发语言·servlet·tomcat·intellij-idea
C+-C资深大佬3 天前
全景声制作自由,Cubase Pro15 专业混音利器
tomcat
摇滚侠3 天前
JavaWeb 全套教程 Servlet 66-74
java·servlet·tomcat·intellij-idea·jar
Eason_LYC3 天前
【GetShell 实战】CVE-2026-34486 Tomcat 加密拦截器绕过:从漏洞验证到反弹 Shell 全流程
java·渗透测试·tomcat·java反序列化·rce·远程代码执行漏洞·cve-2026-34486