Dockerfile文件EXPOSE 指令是聲明運行時容器提供服務埠,這只是一個聲明,在運行時並不會因為這個聲明應用就會開啟這個埠的服務。
語法格式
EXPOSE 埠1 [埠2...]
在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護埠,以方便配置映射;另一個用處則是在運行時使用隨機埠映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的埠。
以前所有容器都運行於默認橋接網絡中,因此所有容器互相之間都可以直接訪問,這樣存在一定的安全性問題。於是有了一個 Docker 引擎參數 --icc=false,當指定該參數後,容器間將默認無法互訪,除非互相間使用了 --links 參數的容器才可以互通,並且只有鏡像中 EXPOSE 所聲明的埠才可以被訪問。這個 --icc=false 的用法,在引入了 docker network 後已經基本不用了,通過自定義網絡可以很輕鬆的實現容器間的互聯與隔離。
要將 EXPOSE 和在運行時使用 -p <宿主埠>:<容器埠> 區分開來。-p,是映射宿主埠和容器埠,換句話說,就是將容器的對應埠服務公開給外界訪問,而 EXPOSE 僅僅是聲明容器打算使用什麼埠而已,並不會自動在宿主進行埠映射。
基於 EXPOSE 指令的上述限制,Dockerfile 的作者一般在包含 EXPOSE 規則時都只將其作為哪個埠提供哪個服務的提示。使用時,還要依賴於容器的操作人員進一步指定網絡規則,需要配合 docker run -p PORT:EXPORT 使用,這樣 EXPOSE 設置的埠號會被指定需要映射到宿主機器的埠,這時要確保宿主機器上的埠號沒有被使用。如果直接指定 docker run-p EXPORT,這樣 EXPOSE 設置的埠號會被隨機映射成宿主機器中的一個埠號。不過通過 EXPOSE 命令文檔化埠的方式十分有用。