Network 手動配置

Docker Network 可以調整非常多設定,而在使用 Network 連結 container 使用的是預設的 bridge 模式,這個模式符合大多數開發階段的情境,所以通常不會調整它。但如果想要將 Docker 活用在更多地方的話,那就勢必要了解 Docker Network 是如何配置的。

對網路架構不熟,因此單純就從 docker 指令來了解架構。

docker0

安裝好 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。

bridge

使用 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

它能滿足大多數的情境,所以才會做為預設設定。

host

當使用 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 資源,反之亦然,這樣隔離性就會降低。

container

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 一樣,某些情境非常好用,但隔離性就會變差。

none

顧名思義,它就是沒有設定網路,必須要手動為它配置網卡才能正常運作。

今日自我回顧

清楚知道 Network,才能順利在許多 host 的環境下串接 container。它甚至就像一個迷你的 VPC 一樣,可以建構出簡單網路架構的私有雲。

對開發階段來說,善用 Network 也有辦法模擬出一般線上實際環境,對於除錯會非常有幫助。

參考資料