You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器无法访问指定端口的本地Web服务问题求助

解决Docker容器访问本地带端口Web服务的问题

别担心,这种容器访问宿主本地服务的问题很常见,我帮你一步步排查解决:

第一步:确认本地Vue服务的绑定地址

Vue-cli的serve命令默认会把服务绑定在127.0.0.1(仅本地回环地址),这就导致只有你自己的电脑能访问,Docker容器(属于局域网其他"设备")根本连不上。

验证方法
在终端执行命令:

netstat -ano | findstr :8081

如果输出里的监听地址是127.0.0.1:8081,那就是这个问题。

解决办法
修改Vue服务的启动命令,强制绑定到所有网卡(0.0.0.0):

vue-cli-service serve --host 0.0.0.0 --port 8081

之后再用你的本地IP(比如192.168.1.100:8081)访问,能打开就说明绑定成功了。

第二步:检查Windows防火墙是否拦截8081端口

容器访问本地IP的8081端口时,Windows防火墙可能会默认拦截这个外部请求。

解决办法

  1. 打开「Windows Defender防火墙」→「高级设置」
  2. 新建「入站规则」,选择「端口」→ 下一步
  3. 填写8081,选择「TCP」→ 下一步
  4. 选择「允许连接」→ 下一步,按提示完成配置

第三步:优化Docker的域名映射配置

你当前用硬编码本地IP的方式虽然可行,但不够灵活。Windows下的Docker Desktop提供了一个特殊域名host.docker.internal,可以直接指向宿主机器,不用手动填IP。

修改你的docker-compose.yml

version: '3.2'
services:
  cypress:
    build: .
    working_dir: /e2e
    extra_hosts:
      localnewapp.company.com: host.docker.internal
      localapp.company.com: host.docker.internal
    entrypoint: cypress run --headless --browser chrome --config-file ./cypress.json --record --key {KEY} --parallel --ci-build-id ${GITHUB_RUN_ID}
    volumes:
      - ./:/e2e

这样不管你本地IP怎么变,容器都能正确解析到宿主。

备选方案:使用Host网络模式

如果上面的方法都不管用,可以试试让容器直接使用宿主的网络栈,这样容器里的localhost就等于宿主的localhost

修改docker-compose.yml添加network_mode: host

version: '3.2'
services:
  cypress:
    build: .
    working_dir: /e2e
    network_mode: host # 新增这一行
    entrypoint: cypress run --headless --browser chrome --config-file ./cypress.json --record --key {KEY} --parallel --ci-build-id ${GITHUB_RUN_ID}
    volumes:
      - ./:/e2e

这种情况下不需要配置extra_hosts,直接在Cypress里访问localnewapp.company.com:8081就行。

验证步骤

  1. 先在本地用http://{你的本地IP}:8081确认服务能正常访问
  2. 进入Docker容器执行curl http://host.docker.internal:8081,看是否能拿到响应
  3. 再测试curl localnewapp.company.com:8081,确认域名映射生效

内容的提问来源于stack exchange,提问作者D Sayer

火山引擎 最新活动