如何创建默认的docker0网桥

发布于:2024-04-25 ⋅ 阅读:(22) ⋅ 点赞:(0)

背景

重启docker服务之后,发现并没有创建默认的docker0网桥,所以导致端口无法映射,容器内IP为127.0.0.1。重启服务后,仍然没有docker0网桥的出现。

 

分析

docker0网桥是docker默认创建的虚拟网桥。但是有时候会发现,docker0并没有被创建出来。如果我们使用默认的桥接网络来创建容器,此时就没有网桥可用。

 

如果容器没有连接到网桥上,那就无法与宿主机通信,容器就沦为单机模式了。在单机模式下,容器就只有本地回环地址。

 

默认情况下,安装了docker服务的环境里,使用下面命令可以查看docker的网络列表:

docker network ls

查看结果:

a419b3ade28447269765572fdce28494.png

 

从上到下分别是默认的桥接网络、宿主机模式网络和无。如果没有网桥,我们创建的容器的网络就是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网桥了。

 


原文地址: http://www.yu7s.com/article/20240422182118064.html


网站公告

今日签到

点亮在社区的每一天
去签到