【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默认分配的子网

ruby 复制代码
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是否已经创建网络

perl 复制代码
[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,新增一条配置
json 复制代码
   "bip":"192.22.0.1/24"
  1. 重启docker和加载文件

    sudo systemctl daemon-reload && systemctl restart docker

  2. 然后使用 ifconfig docker 命令查看是否生效,效果如下:

ini 复制代码
[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)

拓展知识

  1. docker默认子网创建规则
objectivec 复制代码
当您使用默认的桥接网络模式(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
相关推荐
WX-bisheyuange3 小时前
基于Spring Boot的教师个人成果管理系统的设计与实现
java·spring boot·后端
chxii3 小时前
spring boot 获取HTTP 请求参数
spring boot·后端·http
桦说编程5 小时前
Guava 迭代器增强类介绍
java·后端·设计模式
235166 小时前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
courtfu6 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
上进小菜猪7 小时前
测试自动化Replay:让数据库迁移测试回归真实场景的一把“利器”
后端
Python私教7 小时前
FastAPI × SQLAlchemy 2.0 Async:从“能跑”到“可压测”的完整工程实践
后端
Python私教7 小时前
FastAPI × Loguru:从“能跑”到“可运维”的日志实战
后端
Craaaayon7 小时前
如何选择两种缓存更新策略(写缓存+异步写库;写数据库+异步更新缓存)
java·数据库·redis·后端·缓存·mybatis
唐僧洗头爱飘柔95278 小时前
【GORM(3)】Go的跨时代ORM框架!—— 数据库连接、配置参数;本文从0开始教会如何配置GORM的数据库
开发语言·数据库·后端·golang·gorm·orm框架·dsn