Docker 設定避開衝突網段 ( 172.17.0.0/16 )

Docker 的好,用過的人就知道,
然而 Docker 在特定的網段裡面(例如: 172.17.x.x),會造成衝突。

嚴重造成 host 整台主機連不進來,無法連線。

這個時候要修改你的 Docker 預設網段,讓他跳過跟外界相符合的網段。

註:如果 你的開發機 (client) 與 你的伺服器 (server),兩個端點都有裝 Docker,
那兩個端點都要調整,跳開其網段。

註:預設 Docker 使用 172.17.0.0/16 網段。

修改 Docker 預設網段

Linux 系統的話,建立(或修改)daemon.json 這個檔案
(這個檔案預設是沒建立的,請自行建立。)

$ sudo vi /etc/docker/daemon.json

以下是範例格式,為 JSON 格式:

{
  "log-driver": "journald",
  "log-opts": {
    "tag": "{{.Name}}"
  },
  "bip": "172.7.0.1/16"
}

修改 bip 的欄位,輸入一個新的不衝突的網段即可。(範例是改成 172.7.0.1/16

然後重新啟動 Docker 服務

$ sudo systemctl restart docker

這樣你的主機就會連線正常了。

自訂你自己服務的網段

在某些用途下你會需要一個特定幾個 container 能相互溝通的網路環境
你需要修改你的 docker network create 指令

例如:

$ sudo docker network create mynetwork --subnet=172.6.0.0/16

加上 --subnet= 參數,手動指定網段給他。

使用 docker-compose ?

如果是使用 docker-compose 的話,你可以這樣調整 networks 段落,

docker-compose.yml

version: '3.5'

services:
  web:
    image: crccheck/hello-world
    ports:
      - '80:8000'
    networks:
      - mynetwork
networks:
  mynetwork:
    ipam:
      config:
        - subnet: '172.6.0.0/16'

如果你要寫完整一點,這樣也是可以的。

networks:
  mynetwork:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: '172.6.0.0/16'
          gateway: '172.6.0.1'

ipamconfig 段落設定 subnetgateway 即可。

怎麼驗證?

你可以用 netstat 指令查詢

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
172.6.0.0       0.0.0.0         255.255.0.0     U         0 0          0 br-c3ff076483d3
172.7.0.0       0.0.0.0         255.255.0.0     U         0 0          0 docker0

docker network ls 指令

$ docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
da8e2609c93e   bridge        bridge    local
0eef0fedfb81   host          host      local
79cd2edd8448   none          null      local
c3ff076483d3   mynetwork     bridge    local

其中你可以看到範例 c3ff076483d3 對應 mynetwork 網段為 172.6.0.0

參考資料