我是 docker 新手,正在撰寫一個簡單的節點應用程式。我對指定埠的各個位置感到困惑:
- 節點應用程式監聽某個埠
- dockerfile 定義了一個埠來“公開”應用程式
- docker run 命令指定一個本地機器埠和一個容器埠
我的問題是:哪個位置指定了什么?它們都需要相同嗎?
相關檔案:
index.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
謝謝您的幫助
uj5u.com熱心網友回復:
根據您的問題,我不確定埠的概念是否適合您。
我的老師使用將 IP 地址和埠簡化為:IP 地址是建筑物,埠是您正在尋找的建筑物中的公寓。
在index.js
您的快速應用程式中,正在監聽3000
它正在運行的建筑物的平面。
因為您在 Docker 中運行您的應用程式,所以構建是 Docker。所以EXPOSE 3000
inDockerfile
告訴 Docker 應該公開這個埠(基本上不會自動關閉)。
然后在您的命令中,docker run -p 3000:3000
您告訴您的主機(您的計算機)將他的埠 3000 鏈接到 Docker 的埠 3000。
您也可以將其視為延長電纜:您將第一根電纜(您的計算機)連接到第二根電纜(docker),然后將第二根電纜連接到第三根電纜(快速應用程式)。
uj5u.com熱心網友回復:
節點應用程式監聽某個埠
這個埠號非常重要。容器之間的連接僅使用此埠號并忽略任何其他設定。您無法使用純 Docker 設定更改此埠號;應用程式可能支持通過命令列引數或環境變數進行更改,但這將是特定于應用程式的。
docker run 命令指定一個本地機器埠和一個容器埠
容器埠必須與應用程式埠匹配。本地機器埠可以是您想要的任何東西,只要它不被主機上的任何其他東西使用。這些不需要匹配。
dockerfile 定義了一個埠來“公開”應用程式
這應該與應用程式埠相同,但它幾乎什么都不做,而且出錯或完全忽略它也不會造成任何后果。
由于“暴露”不做任何事情,這使得機制非常簡單。 docker run -p 12345:3000
從主機的 12345 埠轉發到容器的 3000 埠。這需要與應用程式實際監聽的位置相匹配(它還需要監聽特殊的 0.0.0.0“所有介面”地址,而不是 127.0.0.1“僅接受從同一容器內發起的連接”)。DockerfileEXPOSE
幾乎只是檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/468839.html