解决docker服务默认网卡和宿主机网卡内网段冲突

场景说明介绍:

docker网络模式认使用的bridge模式,当我们创建容器时,每个容器会有它自己的虚拟网络接口连接到桥接网络docker0,并获取一个ip。可以通过ifconfig docker0查看docker0的信息,使用route -n命令可以看到。
docker会认占用三个网段,172.17.0.0,172.18.0.0,172.19.0.0
在实际使用环境中,有可能咱们局域网内已经将这些网段分配到了其他的工作区域中,如果在这些工作区域中去访问此环境下的docker服务,是无法正常访问的。
那么这时候就只有两种解决办法,将已分配的工作区域的网段换成其他网段,或者将docker占用的网段指定成其他网段,显然前者相对来说成本要稍高些。
所以今天咱们就来看看如何将docker network占用的网段指定成其他的网段以避免ip冲突。

解决过程如下:

第一步停止docke服务,删除认的桥接docker0网卡:

sudo service docker stop
sudo ip link set dev docker0 down
sudo brctl delbr docker0

提示下面问题,解决办法: yum install bridge-utils
root@localhost ~]# brctl
-bash: brctl: command not found

第二步 手动创建一个新的网桥名称为 bridge0:

sudo brctl addbr bridge0
sudo ip addr add 192.188.0.0/16 dev bridge0 
sudo ip link set dev bridge0  up

第三步 创建daenon.json文件:

vim /etc/docker/daemon.json
{
"bridge": "bridge0"
}

提示本以为此步骤完成后 重启docker服务就会把docker0认的网卡删掉。但是事实不是这样的

第四步 解决重启docker服务,新绑定的bridge0失效,docker0网卡又自动恢复原样的问题:

CentOS7修改Docker认启动参数:


[root@data-db01 ~]# cat /etc/default/docker
#选择网桥
DOCKER_OPTS="-b=bridge0"
#指定DNS
#DOCKER_OPTS="--dns 114.114.114.114 --dns 8.8.8.8"

下面的docker服务启动脚本添加了2行的配置文件说明:

[root@data-db01 ~]# cat  /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=all
KillMode=process
EnvironmentFile=-/etc/default/docker  ###加载的配置文件
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
          $DOCKER_OPTS ###需要引用的参数,也是网卡设定参数
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
MountFlags=slave

[Install]
WantedBy=multi-user.target

添加的2行说明:

  1. 加载的配置文件
    EnvironmentFile=-/etc/default/docker
  2. 然后在ExecStart这个配置中,添加引用的参数,另外此前一行结尾要加 \
    $DOCKER_OPTS

启动脚本修改参考文档:
https://blog.51cto.com/smilepad/2324171

#重载
systemctl daemon-reload

#重启docker服务
systemctl restart docker

#查看 docker 启动状态
systemctl status docker

第五、如果重启docker服务,发现认的docker0网卡还在,那就继续执行下面的命令

sudo service docker stop
sudo ip link set dev docker0 down
sudo brctl delbr docker0

启动docker服务,直到生效为止
sudo service docker restart

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...