问题背景

这几天为了测试一个Djangowebservice,想在云主机上用docker-compose部署一个本地版本进行测试,但docker-compose up的过程中,build镜像时无法拉取镜像;排查后发现使用自定义网桥(docker中的bridge网桥)network时都无法连接外网,而且容器内无法ping到网关,但宿主机内可以ping到容器的网关,docker network inspect查看自定义的网络,ip分配以及网关设置正常

使用docker默认的bridge网络创建容器,发现也无法访问外网,情况一模一样

解决过程

仔细排查后怀疑是docker network本身的问题,随后使用bridge-utils创建网桥:

  • 暂停docker服务:

    1
    service docker stop
  • 添加网桥:

    1
    brctl addbr br0
  • 设置网段:

    1
    ip addr add 192.168.12.0/24 dev br0
  • 启用网桥br0

    1
    ip link set dev br0 up
  • 修改docker默认网桥:

    1
    vim /etc/docker/daemon.json
  • 添加bridge字段:

    1
    "bridge":"br0"
  • 重启docker

    1
    service docker start

之后使用docker默认bridge网络运行测试容器,成功连接外网,确认是docker network的问题

随后又根据这个线索谷歌了一番,发现根因是docker 加载内核的bridge.ko驱动异常,导致docker0网卡无法转发数据包,也就是系统内核的网桥模块bridge.ko加载失败导致的

解决方案

升级centos内核,重装docker后解决

体会与收获

docker网络一步一步摸到centos内核问题,有些坑真是深不见底啊