docker - 无法连接到在 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 bash
bash 进入容器时,当我curl localhost:4200
.
我的环境:
- 操作系统:Windows 10 专业版 10.0.16299 Build 16299
- 码头工人:18.03.1-ce-win65(17513)
我认为这可能是防火墙问题。所以为了调试,我关闭了防火墙应用程序(我正在使用卡巴斯基安全软件),但没有成功。
为什么我无法从暴露的端口访问容器?
编辑:
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
解决方案
您不能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
然后,当您的端口映射正常工作时,您应该将您的站点从主机获取到所需的端口。
推荐阅读
- json - 如何让 Json.stringify 忽略某些班级成员?
- kubernetes - How to make k8s microservice hostname generic with respect to namespace
- javascript - 编写一个函数,该函数将返回两个数字数组组合,其总和为 5。我无法获得所有机会
- javascript - How to animate a glb with GTLF loader in THREE.js
- android - 为什么不能在android中更新我的应用程序
- laravel - PhpStorm 在索引 Laravel 时崩溃
- php - 计算从 mysql 查询返回的具有不同值的行
- ruby-on-rails - 在 upsert 上以不同方式处理某些行 -> 存在?
- maven - Github Maven Packages can't be found in ORG
- gcc - 在 c 中调用 x86 asm 函数时编译错误,但在 x64 中没有