【linux】【docker】Docker默认网段配置导致无法访问

背景

集团有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"
    
  2. 重启docker和加载文件

    sudo systemctl daemon-reload && systemctl restart docker

  3. 然后使用 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

相关推荐
会飞的土拨鼠呀2 分钟前
docker-ce-stable‘ 下载元数据失败 : Cannot download repomd.xml: Cannot download
xml·docker·容器
RationalDysaniaer3 小时前
Docker基础(一)
docker
mit6.8243 小时前
[Docker#3] LXC | 详解安装docker | docker的架构与生态
linux·运维·后端·docker·容器
Lyqfor5 小时前
985研一学习日记 - 2024.11.9
java·数据结构·学习·docker·云原生·容器
曦云沐5 小时前
Windows10 上安装 Docker 失败
docker·容器
Ada大侦探5 小时前
学习docker第五弹-----高级篇start-Dockerfile
学习·docker·容器
爱穿衬衫的张某某5 小时前
docker镜像文件导出导入
docker
MetaverseMan5 小时前
停止的 Docker 容器占用的内存和其他资源
java·docker·eureka
我的运维人生5 小时前
Docker实践与应用举例:从入门到进阶
运维·docker·容器·运维开发·技术共享
汪小敏同学7 小时前
docker进行SRS直播服务器搭建
docker·srs