Docker Network 可以調整非常多設定,而在使用 Network 連結 container 使用的是預設的 bridge 模式,這個模式符合大多數開發階段的情境,所以通常不會調整它。但如果想要將 Docker 活用在更多地方的話,那就勢必要了解 Docker Network 是如何配置的。
筆者對網路架構不熟,因此單純就從 docker 指令來了解架構。
安裝好 Docker 後,可以使用 docker network ls 指令來查看目前的網路設定配置:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
2017cca0027d bridge bridge local
1b1c05935480 host host local
8b9319cd142e none null local
預設的 bridge 網路配置,即很多文章會提到的 docker0。
使用 docker network create,預設會是 bridge 模式:
$ docker network create my-net
78ad7c4ad6a0f9a42dcd7c08c874fd532140ea0a7c07bca2c28889b97fe49c47
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
2017cca0027d bridge bridge local
1b1c05935480 host host local
78ad7c4ad6a0 my-net bridge local
8b9319cd142e none null local
它能滿足大多數的情境,所以才會做為預設設定。
當使用 container 設定成 host 時,Docker 會與 host 共享網路資源,但檔案系統依然是分開獨立的。
注意:下面這個範例需要在 Linux 上才能 work。
# 啟動 Nginx 並開啟 80 port,注意這裡沒有 -p 參數
docker run -d -it --net=host nginx:alpine
# 確認 localhost 80 port 正常
curl http://localhost
# 啟動新的 Nginx 但這次就無法啟動,因為 80 port 被佔走了
docker run --rm -it --net=host nginx:alpine
因不需要做 port forwarding,其實蠻方便的。但缺點就是 container 開了任何 port,都會佔用到 host 資源,反之亦然,這樣隔離性就會降低。
與 host 類似,不同點在於網路配置會與指定的 container 共享。
# 啟動 web server
docker run -d -it --name web nginx:alpine
# 啟動 BusyBox 並把它網路設定成 web
docker run --rm -it --net=container:web busybox
# 這裡的回傳的結果即 Nginx container 回應
wget -q -O - http://localhost
特色也跟 host 一樣,某些情境非常好用,但隔離性就會變差。
顧名思義,它就是沒有設定網路,必須要手動為它配置網卡才能正常運作。
清楚知道 Network,才能順利在許多 host 的環境下串接 container。它甚至就像一個迷你的 VPC 一樣,可以建構出簡單網路架構的私有雲。
對開發階段來說,善用 Network 也有辦法模擬出一般線上實際環境,對於除錯會非常有幫助。
筆者今天身體不適,內容不精實請見諒。