【linux】【docker】Docker預設網段配置導致無法訪問

minsin發表於2024-09-20

背景

集團有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(無正在執行的容器

  1. 編輯配置檔案 vi /etc/docker/daemon.json,新增一條配置
   "bip":"192.22.0.1/24"
  1. 重啟docker和載入檔案
sudo systemctl daemon-reload && systemctl restart docker
  1. 然後使用 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. 停止容器
  2. 按照場景1修改預設子網
  3. 刪除已有容器的network
  4. 手動關聯容器的網路
  5. 再啟動容器

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

擴充知識

  1. 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

相關文章