Docker容器虚拟主机配置问题:ERR_NAME_NOT_RESOLVED错误排查
嘿,我来帮你拆解下这个问题——你能通过localhost:8000正常访问,但敲http://borgesmelo.local/就提示域名解析失败,本质是两个关键配置没到位,咱们一步步来:
1. 本地系统的hosts文件缺失域名映射
ERR_NAME_NOT_RESOLVED说白了就是浏览器找不到这个域名对应的IP地址,所以得手动告诉本地系统:borgesmelo.local指向你的宿主机IP(一般是127.0.0.1)。
Windows系统:找到
C:\Windows\System32\drivers\etc\hosts文件,用管理员权限打开,添加一行:127.0.0.1 borgesmelo.local保存后执行
ipconfig /flushdns刷新DNS缓存。Linux/macOS系统:打开终端,编辑
/etc/hosts文件:sudo nano /etc/hosts同样添加
127.0.0.1 borgesmelo.local,保存后执行sudo dscacheutil -flushcache(macOS)或者sudo systemctl restart nscd(Linux)刷新缓存。
2. Docker缺少反向代理服务配置
看你的docker-compose.yml,目前只有数据库服务,没有负责处理HTTP请求的反向代理(比如Nginx)。localhost:8000能访问应该是你直接把某个web容器的8000端口映射到了宿主机,但域名访问需要反向代理来把borgesmelo.local的请求转发到对应的web容器。
给你补一个完整的示例配置,在原来的compose文件里加个Nginx服务:
version: '3.3' services: borgesmelo_db: image: mariadb:latest container_name: borgesmelo_db restart: always volumes: - ./mariadb/:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: My@159#Sql # 新增反向代理服务 borgesmelo_proxy: image: nginx:latest container_name: borgesmelo_proxy restart: always ports: - "80:80" # 把宿主机80端口映射到容器80,域名默认走80端口 volumes: - ./nginx/conf.d/:/etc/nginx/conf.d/ # 挂载自定义Nginx配置目录 depends_on: - borgesmelo_db # 如果你的web服务依赖数据库,这里也可以加web服务的名称 # 假设你的web服务是这样的(根据实际情况调整) borgesmelo_web: image: your-web-image:latest # 替换成你实际的web镜像 container_name: borgesmelo_web restart: always volumes: - ./web/:/var/www/html/ # 挂载代码目录 depends_on: - borgesmelo_db
然后在宿主机上创建./nginx/conf.d/目录,新建borgesmelo.conf配置文件,内容如下:
server { listen 80; server_name borgesmelo.local; location / { # 这里替换成你的web服务容器名称和内部端口,比如上面的borgesmelo_web和它的内部端口(一般是80) proxy_pass http://borgesmelo_web:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
这样配置后,当你访问http://borgesmelo.local/时,请求会先到宿主机80端口,被Nginx容器接收,然后转发到你的web容器,就能正常访问了。
3. 额外注意点
- 确保所有相关容器(web、代理、数据库)都在同一个Docker网络里——默认情况下,docker-compose会自动创建一个共享网络,只要它们在同一个compose文件里就没问题。
- 不要直接把web容器的端口映射到宿主机(除非测试用),通过反向代理转发更安全也更符合域名访问的逻辑。
内容的提问来源于stack exchange,提问作者Roberto Godoy

