Docker 端口映射在 Windows 10 上不起作用

Jie*_*Sun 8 docker docker-for-windows

我是码头工人的新手。我正在尝试在 docker 上运行一个简单的节点应用程序。但是,我面临着 docker 端口发布的问题。

Docker 版本- 18.03.0-ce,构建 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}`);
Run Code Online (Sandbox Code Playgroud)

我的码头文件:

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

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

我本地的 curl 命令的输出- 无法连接到本地主机端口 8080:连接被拒绝。

San*_*dev 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
Run Code Online (Sandbox Code Playgroud)

请注意上面命令输出URL中的 IP -- 当您在计算机上运行命令时,它将是不同的 IP。然后用它来做卷曲:

curl -i 192.168.99.100:8080
Run Code Online (Sandbox Code Playgroud)

  • docker-machine ls 不工作 (9认同)

Gha*_*san 10

现在是 2020 年,docker 对这些命令的处理方式不同:

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

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

希望这有助于某人(或我,下次我与 docker xD 一起工作时)

  • 我相信对于第二种格式,docker正在做的是将参数“-p 3000:80”作为额外参数传递到容器的入口点。这就是为什么它会默默地失败 - 该命令在语法上是有效的。请参阅 https://docs.docker.com/engine/reference/builder/#entrypoint (3认同)