Docker端口映射在Windows 10上无法工作。

10

我是docker的新手。我正在尝试在docker上运行一个简单的node应用程序。然而,我在docker端口发布方面遇到了问题。

Docker版本 - 18.03.0-ce, build 0520e24302

我的简单应用代码:

'use strict';

const express = require('express');

// Constants
const PORT = 8081;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello world\n');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

我的 Docker 文件:

FROM node:carbon

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install --only=production

# Bundle app source
COPY . .

EXPOSE 8081

CMD [ "npm", "start" ]

我的docker ps输出 - 0.0.0.0:8080->8081/tcp,爱抱大的

来自本地curl命令的输出 - 无法连接到localhost的8080端口:拒绝连接。

3个回答

18

现在是2023年,Docker对以下命令进行了不同的处理:

docker run -p 3000:80 my_image (正确的格式;端口选项必须在镜像名称之前。)

docker run my_image -p 3000:80 (错误的格式;Docker不会通知您,并将默默地失败端口发布。)

希望这能帮助某人(或我下次使用Docker时)。xD


3
我认为使用第二种格式,Docker 会将参数“-p 3000:80”作为额外参数传递给您容器的入口点。这就是为什么它会无声地失败 - 该命令在语法上是有效的。请参阅https://docs.docker.com/engine/reference/builder/#entrypoint。 - Robert Rendell
@RobertRendell 你可能是对的,谢谢信息 :) - Ghasan غسان
这个节省了我好几天的时间!不知道后面的格式什么时候会有用。 - Drdilyor

10

在Windows上,Linux容器是在运行在Windows主机操作系统上的虚拟机中创建的。这个虚拟机会被分配一个IP地址。在使用curl时,你应该使用这个IP地址而不是localhost。在这里,localhost指的是Windows主机,而不是我们打算在端口8080上访问的虚拟机。

要知道分配给虚拟机的IP地址,运行docker-machine ls命令。你将得到类似以下的输出:

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce

注意上面命令输出中URL下的IP--当你在自己的机器上运行该命令时,它会是一个不同的IP。然后使用它来执行curl命令:

注意上述命令输出中的IP地址,在URL下方——当您在本地运行该命令时,该IP地址将不同。请使用它来进行curl请求:

curl -i 192.168.99.100:8080

8
docker-machine ls无法运行。 - Thirsty Six

-1

您的端口映射是8080-8081,您正在尝试在Windows机器上连接到localhost:8080。

您需要进入Docker容器并使用curl命令连接到localhost:8081,或者从Windows机器使用curl命令连接到您的主机名:8080。

您可以在Windows中运行命令获取您的主机名。

hostname
curl your_hostname:8080

您可以使用 Docker 容器的 ID 或名称(在您的图片中称为 loving_hugle)进入容器,然后通过 curl 访问本地主机。

docker exec -it loving_hugle bash
curl localhost:8081

感谢您的快速回复,我已经能够在Docker容器中使用curl localhost:8081。然而,即使我在我的Windows机器上执行了curl your_hostname:8080,它仍然无法正常工作。 - Jie Sun
所以它在容器内部工作了吗?你确定你用hostname命令获取了你的主机名,并在curl命令中使用了它吗? - namokarm
是的,正确。但是当我尝试在我的Windows机器上(容器外部)使用curl时它不起作用。是的,我使用了从hostname命令获取的主机名。 - Jie Sun
很奇怪,请您阅读我的答案,看看是否有效-https://stackoverflow.com/questions/50812536/how-to-use-docker-to-run-sqli-labsa-web-application-on-windows/50812944#50812944,并告诉我。 - namokarm
我也尝试过了。我也无法连接到80端口。 - Jie Sun
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接