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}}"
},
"default-address-pools": [
{
"base": "172.6.0.0/16",
"size": 24
}
],
"bip": "172.7.0.1/16"
}
修改 bip
與 default-address-pools
的欄位,輸入一個新的不衝突的網段即可。
(範例是改成 172.7.0.1/16
與 172.6.0.0/16
)
bip
欄位是 docker 預設會開啟的網段。default-address-pools
欄位是 docker-compose 如果有設定 network 區段的話,預設會配給的網段區域。
然後重新啟動 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'
在 ipam
的 config
段落設定 subnet
與 gateway
即可。
爾或者,修改 /etc/docker/daemon.json
中的 default-address-pools
的欄位,前面已經說過就不贅述了。
怎麼驗證?
你可以用 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
。