Docker可以在容器內(nèi)部創(chuàng)建應(yīng)用程序和服務(wù),并使其可以與外部的網(wǎng)絡(luò)進(jìn)行交互。在Docker中,每個(gè)容器都擁有自己的IP地址。然而,Docker容器內(nèi)部的應(yīng)用程序和服務(wù)無(wú)法直接通過(guò)IP地址進(jìn)行訪問(wèn),需要通過(guò)端口來(lái)實(shí)現(xiàn)。
雖然Docker可以在容器內(nèi)部創(chuàng)建任意數(shù)量的端口,但是由于網(wǎng)絡(luò)安全部分的限制,Docker容器無(wú)法監(jiān)聽(tīng)較低的端口。例如,端口號(hào)小于1024的端口均為系統(tǒng)保留端口,只有root用戶(hù)才有權(quán)限開(kāi)啟監(jiān)聽(tīng)。而在Docker容器內(nèi)部,root用戶(hù)并不具備真正的root權(quán)限,因此無(wú)法創(chuàng)建監(jiān)聽(tīng)系統(tǒng)保留端口的應(yīng)用程序。
因此,在Docker中,只有端口號(hào)大于等于1024的端口才能被容器內(nèi)部的應(yīng)用程序和服務(wù)監(jiān)聽(tīng)。這種限制確保了Docker容器內(nèi)部的應(yīng)用程序和服務(wù)只能運(yùn)行在安全的端口上。
FROM nginx
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
在Dockerfile中,我們可以使用EXPOSE命令將容器內(nèi)部的端口向外部暴露出來(lái)。在上面的例子中,容器會(huì)暴露出8080端口。但是,這并不意味著容器內(nèi)部的應(yīng)用程序和服務(wù)一定要使用該端口號(hào)。在容器內(nèi)部,應(yīng)用程序和服務(wù)可以使用任意可用的端口號(hào)。
在使用Docker時(shí),需要注意的是,如果想要將容器內(nèi)部的應(yīng)用程序和服務(wù)連接到外部網(wǎng)絡(luò),需要將容器內(nèi)部的端口映射到外部端口。這可以通過(guò)使用Docker CLI的-p選項(xiàng)實(shí)現(xiàn)。
docker run -p 8080:80 nginx
上面的命令將容器內(nèi)部的80端口映射到主機(jī)的8080端口。這樣,我們就可以通過(guò)訪問(wèn)主機(jī)的8080端口來(lái)訪問(wèn)容器內(nèi)部的應(yīng)用程序和服務(wù)。