在Docker中,使用主機網絡模式(host network mode)時,容器將共享主機的網絡命名空間,這意味著容器將直接使用主機的網絡接口和端口。因此,當你嘗試通過Docker的發布端口功能(publish a port)將容器的端口映射到主機時,實際上不會發生任何映射,因為容器已經直接使用主機的網絡,所以不需要進行端口映射。
解決方法:
如果你需要將容器端口映射到主機端口,你應該使用橋接模式(bridge mode)而不是主機網絡模式。橋接模式是Docker的默認網絡模式,在這種模式下,Docker會為容器配置獨立的網絡命名空間,并通過Docker網絡接口將容器端口映射到主機端口。
-
移除容器時使用橋接模式啟動它,不要使用--net=host參數。
-
如果需要訪問主機的網絡接口或服務,可以通過主機模式(host mode)來綁定特定的主機資源(如/etc/hosts或者特定的主機網絡接口)到容器中,而不是使用主機網絡模式。
例如,啟動一個使用橋接模式的容器,而不是主機網絡模式:
docker run -d -p 8080:80 myimage
這里-d表示后臺運行,-p 8080:80表示將容器內的80端口映射到主機的8080端口
但是一般不建議這么干,因為這樣docker和宿主共享網絡不是很安全,一般都建議在docker中建立連接通過別名構建docker之間通信
docker network create testnet
?然后容器中構建服務的時候加上 --network?
docker run -d -p 4000:4000 --network testnet --network-alias yourservice --name yourservice yourservice
這樣docker之間就可以通過別名來訪問,宿主機和docker有效隔離