Docker 容器无法使用特定端口访问本地主机

Posted

技术标签:

【中文标题】Docker 容器无法使用特定端口访问本地主机【英文标题】:Docker container unable to access local host with specific port 【发布时间】:2021-11-21 11:26:53 【问题描述】:

在此之前,我的 docker 技能不是很好,如果答案很明显,请道歉。

TLDR:本地运行的网站,我需要指定要访问的端口,如何允许 docker 容器访问该网站?

更多信息:

我有两个在本地运行的网站:

第一个是 localapp.company.com,它是一个 IIS 站点 另一个是localnewapp.company.com,由vue-cli-service serve在本地运行,只能通过指定端口localnewapp.company.com:8081访问

我正在尝试通过 docker 容器并行化我们的 cypress 测试 其中IPv4_ADDRESS = 我的本地 IP 地址,这是我的 docker-compose.yml 文件:

version: '3.2'

services:
  cypress:
    build: .
    working_dir: /e2e
    extra_hosts:
       localnewapp.company.com: IPv4_ADDRESS
       localapp.company.com: IPv4_ADDRESS
    entrypoint: cypress run --headless --browser chrome --config-file ./cypress.json --record --key KEY --parallel --ci-build-id $GITHUB_RUN_ID
    volumes:
      - ./:/e2e

赛普拉斯可以运行针对 localapp 的测试,但针对 localnewapp 失败。

使用 Docker CLI,我尝试运行:

curl localapp.company.com 返回有效响应。 curl localnewapp.company.com:8081 连接失败。

不知道从这里去哪里。任何建议将不胜感激。


编辑: 澄清一下,在本地,node.exe 正在使用端口 8081,它在本地为网站提供服务。

【问题讨论】:

【参考方案1】:

您需要从您的cypress 服务中公开一个端口

ports:
- HOST_PORT:CONTAINER_PORT

喜欢:

version: '3.2' 
  services:
    cypress:
      ..
      volumes:
      - ./:/e2e
      ports:
      - 8081:8080

见documentation

【讨论】:

谢谢@dnltinney,我已经尝试过了,但出现以下错误:Error response from daemon: Ports are not available: listen tcp 0.0.0.0:8081: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 端口8081 很可能正在使用中。您可以通过nc -zv localhost 8081 验证这一点。你试过不同的端口吗? 端口 8081 正在被 localnewapp.company.com 使用,该端口通过命令 vue-cli-service serve 在本地运行,因此它与 node.exe 一起使用

以上是关于Docker 容器无法使用特定端口访问本地主机的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker 容器中访问 MacOSX 主机上的端口

主机无法访问 Docker 端口

Docker端口映射实现

linux下docker启动nginx无法访问80端口

无法通过容器的 ip 和通过 http 暴露的端口访问 Docker 容器中的 Web 应用程序

07-docker端口映射与容器关联