繁体   English   中英

哪些端口在我的 docker 应用程序中意味着什么?

[英]Which ports mean what in my docker application?

我是 docker 的新手,正在编写一个简单的节点应用程序。 我对指定端口的各个位置感到困惑:

  • 节点应用监听某个端口
  • dockerfile 定义了一个端口来“公开”应用程序
  • docker run命令指定本地机器端口,和容器端口

我的问题是:哪个位置指定了什么? 他们都需要相同吗?

相关文件:

索引.js

const express = require('express');

const app = express();


app.get('/', (req,res)=>{
    res.send("g'day mate");
})

app.listen(3000, ()=>{
    console.log("listening")
})

Dockerfile

FROM node:16

# Create app directory
WORKDIR /

#Copy app sourcecode
COPY . . 

# install dependencies
RUN npm install

#Expose on port 3000
EXPOSE 3000

# This is the command to run the app
CMD [ "node", "index.js"]

docker运行命令

docker run -dp 3000:3000 test-app

谢谢您的帮助

根据您的问题,我不确定端口的概念是否适合您。

我的老师将IP地址和端口简化为:IP地址是大楼,端口是你要找的大楼里的公寓。

index.js中,您的 express 应用程序正在监听它正在运行的建筑物的 flat 3000

因为你在 Docker 运行你的应用程序,那么建筑物是 Docker。所以Dockerfile中的EXPOSE 3000告诉 Docker 这个端口应该暴露(基本上不会自动关闭)。

然后在你的命令docker run -p 3000:3000你告诉你的主机(你的计算机)将他的端口 3000 链接到 Docker 的端口 3000。

您也可以将其视为延长线:您正在将第一根电缆(您的计算机)连接到第二根电缆(docker),然后将第二根电缆连接到第三根电缆(express app)。

节点应用监听某个端口

这个端口号非常重要。 容器之间的连接仅使用此端口号并忽略任何其他设置。 您不能使用纯 Docker 设置更改此端口号; 应用程序可能支持通过命令行参数或环境变量更改它,但这将是特定于应用程序的。

docker run命令指定本地机器端口,和容器端口

容器端口必须与应用程序端口匹配。 本地机器端口可以是任何你想要的,只要它没有被主机上的任何其他东西使用。 这些不需要匹配。

dockerfile 定义了一个端口来“公开”应用程序

这应该与应用程序端口相同,但它几乎什么都不做,弄错或完全省略也不会产生任何后果。

由于“暴露”不做任何事情,这使得机制非常简单。 docker run -p 12345:3000从主机上的12345端口转发到容器中的3000端口。 这需要匹配应用程序实际监听的位置(它还需要监听特殊的 0.0.0.0“所有接口”地址,而不是 127.0.0.1“只接受从同一容器内发起的连接”)。 EXPOSE几乎只是文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM