背景
集團有N個基地,所有基地的網路使用的是172.x.x.x網段,這本身沒有什麼問題!但Docker預設的橋接網段也是172.17.x.x的,如果不修改docker的預設配置會導致個別基地無法訪問!列舉幾個基地使用的網段
基地 | 網段 |
---|---|
A基地 | 172.30.x.x |
B基地 | 172.28.x.x |
C基地 | 172.18.x.x |
如果不修改docker預設配置,隨著容器建立得越多,最終總會和某個基地衝突。
參考擴充知識:docker預設子網建立規則
一、檢查伺服器中的Docker網路情況
檢查docker的子網配置
使用 ifconfig docker
檢視docker預設分配的子網
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:f6ff:fee8:ad97 prefixlen 64 scopeid 0x20<link>
ether 02:42:f6:e8:ad:97 txqueuelen 0 (Ethernet)
RX packets 42355 bytes 67869451 (64.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 55344 bytes 9332802 (8.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
說明:如果此處顯示的172.x.x.x則代表是隱患網段,需要更改。
檢查docker容器已分配的子網
使用docker network inspect $(docker network ls -q) | grep Subnet
檢視Docker是否已經建立網路
[root@yw_did_test ~]# docker network inspect $(docker network ls -q) | grep Subnet
"Subnet": "172.17.0.0/16",
"Subnet": "172.23.0.0/16",
"Subnet": "172.20.0.0/16",
如果命令執行後有資料返回並且是172.x.x.x的網段,則代表已經建立network,並分配了存在隱患的網段,需要更改。
參考擴充知識:docker預設子網建立規則
二、修改預設子網
場景1:新裝Docker(無正在執行的容器
- 編輯配置檔案
vi /etc/docker/daemon.json
,新增一條配置
"bip":"192.22.0.1/24"
- 重啟docker和載入檔案
sudo systemctl daemon-reload && systemctl restart docker
- 然後使用
ifconfig docker
命令檢視是否生效,效果如下:
[root@op-manager-center-prod ~]# ifconfig docker
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.22.0.1 netmask 255.255.255.0 broadcast 192.22.0.255
ether 02:42:9d:8d:d8:92 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
場景2:修改原有Docker(有正在執行的容器)
注意:docker run 時如果沒有手動指定子網,會自動按照預設規則建立子網,即使按照場景1進行更改也無法生效。 參考擴充知識:docker預設子網建立規則
解決思路和步驟:
- 停止容器
- 按照場景1修改預設子網
- 刪除已有容器的network
- 手動關聯容器的網路
- 再啟動容器
Docker-Compose 自動建立的網橋與區域網衝突解決方案 - 知乎 (zhihu.com)
三、docker-compose修改方式
注意:docker-compose的執行方式與預設的docker網路模式不同,也就是說就算修改了預設子網,docker-compose up -d也是預設使用172.x.x.x,如果是docker-compose可以不修改上面的網路
解決方案:指定網路
#se版本,向下相容,我選的最高版本
version: "3.3"
# 定義服務
services:
#省略
network:
- default-network
networks:
default-network:
driver: bridge
ipam:
config:
- subnet: 192.22.1.0/24
擴充知識
- docker預設子網建立規則
當您使用預設的橋接網路模式(bridge)時,Docker 會為每個容器建立一個獨立的子網,併為每個子網分配一個 CIDR 地址範圍。在預設情況下,Docker 使用 172.17.0.0/16 CIDR 地址範圍來建立這些子網。
每次建立容器時,Docker 會從該 CIDR 地址範圍中選擇一個未被使用的子網,並將容器分配到該子網中的一個 IP 地址。
假設您已經執行了 10 個容器,並且每個容器都位於獨立的子網中。每個子網的 IP 範圍都是 /16,這意味著每個子網有約 65534 個可用 IP 地址(除去網路地址和廣播地址)。
Docker 在預設情況下會按順序分配子網的 IP 地址,每個子網的 IP 範圍如下所示:
子網1:172.17.0.1 - 172.17.255.254
子網2:172.18.0.1 - 172.18.255.254
子網3:172.19.0.1 - 172.19.255.254
子網4:172.20.0.1 - 172.20.255.254
子網5:172.21.0.1 - 172.21.255.254
子網6:172.22.0.1 - 172.22.255.254
子網7:172.23.0.1 - 172.23.255.254
子網8:172.24.0.1 - 172.24.255.254
子網9:172.25.0.1 - 172.25.255.254
子網10:172.26.0.1 - 172.26.255.254