Docker中的網路
透過 Network Namespace 的方式,為容器建立獨立的網路與宿主機完全隔離
Network Namespace 可虛擬出應用程式所需的環境,如 IP Stack、路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、通訊埠等
Docker 會在 host 中創建名為 docker0 的虛擬網路,以連接 host 和容器
連網流程(Bridge Network)
1.Docker 啟動時,創建 docker0
2.啟動容器時,Network Namespace 在容器內虛擬出獨立的網路
3.容器內網路藉由 Veth Pair 與 docker0 相互連接
4.Host 藉由虛擬網卡連接到 docker0上
5.Host 與容器之間即可透過docker0 開始相互傳遞訊息
* Veth Pair:一種專門應用於虛擬網卡之間的通道
存取外網資料
Port Forwarding
docker0 已經預設處理好與外網連接的相關設定
容器中程式的網路請求可透過 docker0轉發到外網網卡中
外部網路若想連接容器,則需 docker0 閘道進行Port Forwarding
想讓外部網路存取的容器,可向docker0提供開放的連接埠,用以連接host的埠口
操作指令
* docker run -d -P nginx
// 大寫參數P,採隨機連接,docker會在host中隨機找開放的open port綁定至容器
* docker run -d -p 80 : 80 -p 443 : 443 nginx
// 參數小寫p ,可指令host中與容器連接的port
//格式: -p <host port>:<container port>
* docker run -d -p 116.200.5.142 : 80 : 80 -p 116.200.5.142 : 443 : 443 nginx
// 可限制可存取的外部主機
//格式:-p <ip>:<hport>:<cport>
* docker run -d -p 80 -p 443 : 443 nginx
// 也可隨機分配空閒host port,連接至容器80 port
* docker run -d -p 116.200.5.142 : : 80 -p 443 nginx
// 隨意外部主機分配外部主機port連接至容器80 port
下一篇會對 Docker Network做更深入的筆記 ~
參考資料
[1]https://godleon.github.io/blog/Docker/docker-network-overview/
[2]https://medium.com/@jamesemyn/basic-docker-networking-9130ab889359