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 测试前端页面和接口代理是否正常。

相关推荐
步行cgn1 天前
MyBatis 动态 SQL 完全指南
sql·tomcat·mybatis
SemiTris2 天前
从Controller到Tomcat底层请求链路全解析
java·tomcat
程序员良辰3 天前
【TongWeb8】使用 Crontab 定时重启和检测 TongWeb 服务
java·中间件·tomcat
上海云盾商务经理杨杨3 天前
Tomcat 弱配置漏洞渗透实战!批量 getshell 高频漏洞
java·web安全·tomcat
小张同学a.7 天前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
xxwl58513 天前
数据库后端接口测试报告
spring boot·mysql·tomcat
次次皮15 天前
Linux 下通过 XShell 手动更新 Tomcat 应用并重启
前端·tomcat·jar
Listen·Rain16 天前
用AI开发出一个AI
java·人工智能·spring boot·tomcat·intellij-idea·mybatis·visual studio
Full Stack Developme17 天前
SpringBoot 内嵌 Tomcat 的启动流程
spring boot·后端·tomcat
Full Stack Developme17 天前
Tomcat 如何处理HTTP请求
java·http·tomcat