Docker修改默认分配网桥子网

docker修改默认分配网桥子网

  在安装完docker,启动容器时,docker会为容器默认分配一个容器子网,一般为172.17.0.0/24,当该虚机运行其他容器需要创建额外的网桥,可能会造成与现有虚机或物理网络重复的情况,这样容器网络通信的时候就会出问题。

  为了避免此问题,我们可在安装docker时,指定一个默认的网桥子网(综合公司现有的网络,挑选一个未使用到的),让后续启动的容器都在这个子网里创建网桥或者容器ip。

一、现有docker配置文件

[root@]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/data/docker"
}

二、查询路由及网桥

路由:

[devops@ ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.0.1      0.0.0.0         UG    100    0        0 eth0
10.168.0.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
10.168.1.0      0.0.0.0         255.255.255.0   U     0      0        0 br-42e15d40f8c0
172.16.0.0      0.0.0.0         255.255.0.0     U     100    0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-923ad69f1d3a
172.20.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-7bc6e6211d81
172.27.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-06cde0ff36a6
172.29.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-b756cddb71d9

网桥:

[root@03-centos7-redis devops]# docker network ls
NETWORK ID          NAME                              DRIVER              SCOPE
50495afe3b3e        bridge                            bridge              local
b756cddb71d9        dingtalk_default                  bridge              local
923ad69f1d3a        elastalert-docker-error_default   bridge              local
06cde0ff36a6        elastalert-docker_default         bridge              local
7bc6e6211d81        elastalert_default                bridge              local
0a2bdd5dca5f        host                              host                local
6a8d68b1a026        none                              null                local
42e15d40f8c0        skywalking_default                bridge              local
[root@03-centos7-redis devops]# 

  由上可发现,每个容器启动都会创建一个网桥,并分配一个子网,该容器在此子网内分配ip。若分配的子网与主机网络有冲突,势必会造成主机网络通信故障的问题。此时为避免,我们可以来修改docker默认分配的子网地址。

  当然我们也可以在创建新的容器时,指定新运行容器使用已有的网桥,来分配ip,然后接入到这个虚拟网卡上。

二、指定docker默认分配的子网

  可在docker配置文件中添加以下配置,重启docker即可。

{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "default-address-pools":[
        {
            "base":"10.168.0.0/16",
            "size":24
        }
   ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/data/docker"
}

三、重启docker

[root@]# systemctl restart docker

  注:已创建的容器会继续使用已绑定的网桥进行通信,不清除的话,默认还会存在。所以需要将容器down掉,重新创建一个网桥并使用新的网桥来分配ip。

四、将现有容器停掉,重启启动

  1、如果是docker-compose启动的容器,只需要docker-compose down -v即可,默认会remove掉当前使用的网桥,在docker-compose up -d时,会根据docker默认配置来新建一个网桥,而这个网桥便会使用我们前面指定的默认子网的ip。

  2、如果是单纯的docker启动的容器,在我们修改完docker默认配置后,该默认网桥的子网就会更新为我们指定的子网,可通过查询来验证:

[root@]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
0406a0ffc50e   bridge    bridge    local
eb3642010b55   host      host      local
07824f95dc1c   none      null      local

  而docker的四种网络模式里,默认使用bridge的方式来创建容器,及上面的ID为0406a0ffc50e的网桥,此时我们可以通过docker inspect来查看网桥子网是否更新:

[root@aicc-prod-0005 skywalking]# docker inspect 040
[
    {
        "Name": "bridge",
        "Id": "0406a0ffc50ea4f6513610fd6b4422368e33f99b6266ca2a035ee8e37873d785",
        "Created": "2022-12-23T13:54:07.173725469+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.168.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

  根据以上输出结果,我们可以得出结论,该默认网桥的子网与我们预期设置的一致,后续在启动容器会在10.168.0.0/24这个子网中分配容器ip,不会在出现容器网络与虚机网络重复的状况。

五、docker-compose运行的容器

  若使用docker-compose来运行容器,则会在我们docker配置文件中指定的子网("base":"10.168.0.0/16",)中随机分配一个,

[root@]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
0406a0ffc50e   bridge               bridge    local
eb3642010b55   host                 host      local
07824f95dc1c   none                 null      local
e898ed909bb2   skywalking_default   bridge    local

  查看skywalking_default网桥的属性

[root@]# docker inspect e89
[
    {
        "Name": "skywalking_default",
        "Id": "e898ed909bb2d86a72df9dc78ca2eb80262436ab8e2a55101550e7b4fd8b6c9f",
        "Created": "2022-12-23T14:44:35.387692498+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.168.9.0/24",
                    "Gateway": "10.168.9.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ab21f08a854f6694d89c8670715fe3fb0404cef85f668c36389dd55df18427c1": {
                "Name": "skywalking-oap",
                "EndpointID": "3f6c42cd02c6be20f7bc1fe6a571dc0296757d46602e4bb9363cd59eeb3e40e1",
                "MacAddress": "02:42:0a:a8:09:02",
                "IPv4Address": "10.168.9.2/24",
                "IPv6Address": ""
            },
            "f1986ce4136a9b775ea909287cb88d3ac6d67a8b517a2d86b1007033ce989fa9": {
                "Name": "skywalking-ui",
                "EndpointID": "29f64dc883863ee3447dc01e7482550e1b0d19e77d0a0d2f84db1d0f52c4e83a",
                "MacAddress": "02:42:0a:a8:09:03",
                "IPv4Address": "10.168.9.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "skywalking",
            "com.docker.compose.version": "2.14.0"
        }
    }
]

  以上可发现,skywalking_default网桥分配的子网为"Subnet": "10.168.9.0/24",符合我们的预期需求。

  

 

posted @ 2022-12-23 14:05  wushaoyu  阅读(2643)  评论(0编辑  收藏  举报