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

相关推荐
Java面试题总结3 天前
mybatis插件
java·tomcat·mybatis
左左右右左右摇晃3 天前
手写Tomcat原理整理
java·开发语言·笔记·tomcat
智码看视界6 天前
Tomcat架构深度拆解:Connector和Container到底怎么配合的?
java·servlet·架构·tomcat·web服务器
Full Stack Developme6 天前
MyBatis-Plus(MP)AST 抽象语法树 设计原理
java·tomcat·mybatis
川石课堂软件测试8 天前
安全测试|SQLMap渗透扫描工具
python·功能测试·测试工具·mysql·单元测试·tomcat·apache
han_hanker8 天前
mybatis-plus 常用方法
java·tomcat·mybatis
zhangjin112011 天前
Tomcat下载安装配置-eclipse版
eclipse·tomcat·firefox
weixin_BYSJ198712 天前
springboot美食食谱小程序---附源码24044
java·spring boot·python·spring cloud·django·tomcat·php
风若飞13 天前
Tomcat 9.0.118 分布式 Redis Session 配置指南
redis·分布式·tomcat