重启docker服务之后,发现并没有创建默认的docker0网桥,所以导致端口无法映射,容器内IP为127.0.0.1。重启服务后,仍然没有docker0网桥的出现。
docker0网桥是docker默认创建的虚拟网桥。但是有时候会发现,docker0并没有被创建出来。如果我们使用默认的桥接网络来创建容器,此时就没有网桥可用。
如果容器没有连接到网桥上,那就无法与宿主机通信,容器就沦为单机模式了。在单机模式下,容器就只有本地回环地址。
默认情况下,安装了docker服务的环境里,使用下面命令可以查看docker的网络列表:
docker network ls
查看结果:
从上到下分别是默认的桥接网络、宿主机模式网络和无。如果没有网桥,我们创建的容器的网络就是none,也就只有127.0.0.1的IP。
一般正常安装docker服务且没有手动做过处理的,不会出现不自动创建docker0网桥的情况。docker0网桥是docker服务启动时自动创建的。
但是可能出现环境里被人动过docker配置文件,或者安装包有问题,导致在某些环境里无法自动创建网桥。那这样就会导致容器的网络创建是个问题。
我们使用自定义网络可以解决没有网桥可用的问题。
下面是创建自定义网络的命令:
docker network create mynetwork
我们在使用自定义网络创建容器:
docker run -itd --net=mynetwork --restart=always --name=mydemo centos7.6 /bin/bash
这样可以解决没有默认docker0网桥的问题。
然而,自定义创建的网桥,是我们自己用命令创建的。当重新系统或者其他情况,可能导致自定义网络丢失了,重启容器就出现这样的报错:
Error response from daemon: network 2ec4cb5d7b07dd3af1405b0b66630ab7089b78ca2230ac9d50cf2de8e79c5101 not found
Error: failed to start containers: mycontainer111
如果此时你再创建一下自定义网络,指定名称mynetwork,也无法启动容器了。因为新创建的网络的ID和原先的不一样呀。
通过命令查看容器的网络ID:
docker inspect {容器名或容器ID} | grep NetworkID
可以看到容器绑定的网络ID和刚创建的不一样,所以容器还是无法启动。此时只能修改容器的配置文件,手动将绑定的网络ID改为新创建的网络ID,再启动容器即可。具体的操作请参考:《Docker 动态修改容器端口映射的方法》。
所以最好的办法就是使用默认的docker0,这样就不绑定特定的网络。默认的docker0只要创建了,就可以自动绑定。
下面来说说如果docker0默认网桥没有创建的处理办法。
docker服务的配置文件为/etc/docker/daemon.json,是一个json字符串。在这个文件中,我们加入:
{"bip": "172.17.0.1/16"}
再重启docker服务即可生效。这样docker就自动创建了docker0网卡。这样也再也不用担心自定义网桥丢失的问题。
一般情况下,docker服务会自动创建docker0网桥,这样我们创建的容器默认就是桥接网络,用的就是docker0网桥。但是一些环境里可能出现docker服务异常或者配置不对,导致docker0网桥不能自动创建。这就需要我们手动修改配置来让docker自动创建docker0网桥了。