[英]Which ports mean what in my docker application?
我是 docker 的新手,正在编写一个简单的节点应用程序。 我对指定端口的各个位置感到困惑:
我的问题是:哪个位置指定了什么? 他们都需要相同吗?
相关文件:
索引.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.