EXPOSE:功能為暴漏容器運行時的監聽端口給外部,但是EXPOSE並不會使容器訪問主機的端口,如果想使得容器與主機的端口有映射關系,必須在容器啟動的時候加上 -P參數。
-P:大寫P為自動映射,會將EXPOSE暴露出來的端口隨機映射到宿主機的端口上,如果沒有暴露端口,就不會有映射。
-p:小寫p為手動映射,需要自己指定宿主機的端口和容器的端口,形式為:
-p 宿主機端口:容器端口
總結:
(1)無論有沒有暴露端口、自動映射或者手動映射,宿主機都可以通過容器ip+80(隨nginx監聽端口改變而改變)端口訪問服務;
(2)要通過宿主機ip+端口的方式訪問服務,宿主機的端口必須與容器端口有映射關系;
(3)如果沒有暴露端口,-P自動映射不會映射任何端口,-p可以指定宿主機端口和容器端口形成映射。
過程如下:
環境:使用dockerfile制作nginx鏡像進行試驗
情況一:暴露端口80,不使用映射
分別使用宿主機ip地址+80端口、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+80端口無法訪問
容器ip地址+80端口可以訪問
情況二:暴露端口80,使用自動映射-P
分別使用宿主機ip地址+自動映射的32778端口、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+自動映射的32778端口可以訪問
容器ip地址+80端口可以訪問
情況三:暴露端口80,使用手動映射-p
分別使用宿主機ip地址+手動映射的8081端口、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+手動映射的8081端口可以訪問
容器ip地址+80端口可以訪問
情況四:不暴露端口,不使用映射
分別使用宿主機ip地址+80端口、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+80端口無法訪問
容器ip地址+80端口可以訪問
情況五:不暴露端口,使用自動映射-P
分別使用宿主機ip地址+80端口(無自動映射端口,因此用80)、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+80端口無法訪問
容器ip地址+80端口可以訪問
情況六:不暴露端口,使用手動映射-p
分別使用宿主機ip地址+手動映射的8082端口、容器ip地址+80端口嘗試訪問nginx,結果如下:
宿主機ip地址+手動映射的8082端口可以訪問
容器ip地址+80端口可以訪問