无法连接到Windows上以docker-compose开头的容器的暴露端口

Nim*_*ima 1 docker docker-compose

我在访问应通过docker-compose将端口公开给主机的应用程序时遇到问题。这是一个可重现的示例:

我使用角度CLI创建一个新的角度应用程序:

ng new angular-docker
Run Code Online (Sandbox Code Playgroud)

然后,我在该目录中创建一个包含以下内容的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"]
Run Code Online (Sandbox Code Playgroud)

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

version: '3'

services:
  angular:
    build: .
    container_name: angular-docker
    volumes:
      - ./src:/usr/src/app/src
    ports:
      - "4200:4200"
Run Code Online (Sandbox Code Playgroud)

然后我运行:

docker-compose up
Run Code Online (Sandbox Code Playgroud)

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

angular-docker | ** Angular Live Development Server is listening on localhost: 4200, open your browser on http://localhost:4200/ **
Run Code Online (Sandbox Code Playgroud)

docker inspect angular-docker我看到的端口转发规则到位:

...
"Ports": {
            "4200/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "4200"
                }
            ]
        },
...
Run Code Online (Sandbox Code Playgroud)

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

但是,当我docker exec -it angular-docker bash习惯于扑向容器中时,我会得到响应curl localhost:4200

我的环境:

  • 操作系统:Windows 10 Pro Version 10.0.16299 Build 16299
  • 码头工人:18.03.1-ce-win65(17513)

我认为这可能是防火墙问题。因此,为了进行调试,我关闭了防火墙应用程序(我正在使用Kaspersky Internet Security),但没有运气。

为什么我不能从裸露的端口访问容器?

编辑:

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
Run Code Online (Sandbox Code Playgroud)

Jua*_*uan 6

您不能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从主机将站点放在所需的端口上。

  • 谢谢@胡安,就是这样。对于将来的读者:在Angular CLI版本6.x中,省略了缩写-H,因此您必须使用--host。 (2认同)