首页 > 解决方案 > 无法连接到在 Windows 上使用 docker-compose 启动的容器的公开端口

问题描述

我无法访问应通过 docker-compose 向主机公开端口的应用程序。这是一个可重现的示例:

我使用 Angular CLI 创建了一个新的 Angular 应用程序:

ng new angular-docker

然后我在该目录中创建一个包含以下内容的 Dockerfile:

FROM node:8

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

RUN npm install

EXPOSE 4200

CMD ["npm", "start"]

接下来我在同一目录中创建一个 docker-compose.yaml 文件:

version: '3'

services:
  angular:
    build: .
    container_name: angular-docker
    volumes:
      - ./src:/usr/src/app/src
    ports:
      - "4200:4200"

然后我运行:

docker-compose up

我等到在 docker-compose 输出中得到以下行

angular-docker | ** Angular Live Development Server is listening on localhost: 4200, open your browser on http://localhost:4200/ **

docker inspect angular-docker我看,端口转发规则已经到位:

...
"Ports": {
            "4200/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "4200"
                }
            ]
        },
...

现在,当我尝试在 Chrome 中访问http://localhost:4200时,我得到 ERR_EMPTY_RESPONSE。

但是,当我使用docker exec -it angular-docker bashbash 进入容器时,当我curl localhost:4200.

我的环境:

我认为这可能是防火墙问题。所以为了调试,我关闭了防火墙应用程序(我正在使用卡巴斯基安全软件),但没有成功。

为什么我无法从暴露的端口访问容器?

编辑:

netstat -an | findstr ":4200"返回以下内容:

Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:4200           0.0.0.0:0              LISTENING
TCP    [::1]:4200             [::]:0                 LISTENING

标签: dockerdocker-compose

解决方案


您不能npm start在 docker 容器中使用开箱即用的默认值。

一种替代方法是更新您的命令package.json以像这样运行ng serve -H 0.0.0.0

"start": "ng serve -H 0.0.0.0"

这个额外-H 0.0.0.0是监听容器中的所有接口。

localhost:4200然后,当您的端口映射正常工作时,您应该将您的站点从主机获取到所需的端口。


推荐阅读