场景

CentOS7中Docker的安装与配置:

CentOS7中Docker的安装与配置_centos docker sock

在上面安装好Docker之后。

关于对Docker中默认docker0以及自定义网络的使用进行学习。

注:

博客:
霸道流氓气质

实现

理解docker0

docker 是如果处理容器网络访问的?

为了测试,运行一个tomcat

docker run -d --name tomcat01 tomcat
  • 1.

我们从宿主机ping容器的ip

Docker中Docker网络-理解Docker0与自定义网络的使用示例_容器

此时网络是通的。

Docker如何获取某个容器的ip等信息

docker inspect 3aaf
  • 1.

后面跟的是容器id或容器名称

此时查看宿主机网络

ip addr
  • 1.

发现每启动一个docker容器,docker就会给docker容器分配一个ip,

我们只要安装了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术。

此时我们再启动一个容器测试

docker run -d --name tomcat02 tomcat
  • 1.

发现又多了一对网络

Docker中Docker网络-理解Docker0与自定义网络的使用示例_容器_02

我们发现这个容器带来网卡,都是一对对的veth-pair 就是一对的虚拟设备接口,

他们都是成对出现的,一端连着协议,一端彼此相连。

正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的OpenStac,

Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。

来测试下tomcat01和tomcat02容器内是否互通

Docker中Docker网络-理解Docker0与自定义网络的使用示例_tomcat_03

发现这两个容器是可以互通的。

如果发现Docker容器内在Ping时提示找不到ping命令

Docker容器内ping时提示:

bash: ping: command not found

执行如下两条命令

apt update

apt install iputils-ping
  • 1.
  • 2.
  • 3.
那么在ping时如何知道某个Docker容器的ip?
docker inspect 3aaf
  • 1.

后面跟的是docker容器的id

结论:

tomcat01和tomcat02公用一个路由器,docker0。

所有的容器不指定网络的情况下,都是docker0路由的,

docker会给我们的容器分配一个默认的可用ip。

图示:

Docker中Docker网络-理解Docker0与自定义网络的使用示例_tomcat_04

只要容器删除,对应的网桥一对就没了!

Docker中自定义网络,自定义网络添加容器

思考一个问题,某些场景下比如微服务环境下需要使用容器名称/服务名称进行访问,或者ip需要更换迁移的情况下。

那么上面默认的docker0网络可以使用容器名进行访问吗?

可以测试下

Docker中Docker网络-理解Docker0与自定义网络的使用示例_网络_05

发现使用容器名是ping不通的。

查看所有的docker网络
docker network ls
  • 1.

Docker中Docker网络-理解Docker0与自定义网络的使用示例_网络_06

docker的网络模式:

bridge :桥接 docker(默认,自己创建也是用bridge模式)

none :不配置网络,一般不用

host :和所主机共享网络

container :容器网络连通(用得少!局限很大)

其中

我们直接启动的命令 --net bridge,而这个就是我们得docker0

bridge就是docker0

docker run -d -P --name tomcat01 tomcat

等价于 =>

docker run -d -P --name tomcat01 --net bridge tomcat

docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!且不建议使用--link的方式。

所以我们自定义网络

Docker中自定义网络的语法
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  • 1.

这个例子中,我们创建了一个名为mynet的自定义网络,使用了 bridge 驱动,并指定了一个子网和网关。

这样配置后,连接到这个网络的容器将会在这个指定的子网内,并且默认情况下可以通过指定的网关进行通信。

此时再查看网络列表

Docker中Docker网络-理解Docker0与自定义网络的使用示例_tomcat_07

还可以查看该自定义网络的详情

docker network inspect mynet
  • 1.

后面跟的是自定义网络的名称

Docker中Docker网络-理解Docker0与自定义网络的使用示例_网络_08

此时启动容器时就可以指定网络

启动如下两个容器

docker run -d -P --name tomcat-mynet-01 --net mynet tomcat
  • 1.
docker run -d -P --name tomcat-mynet-02 --net mynet tomcat
  • 1.

此时这两个容器通过ip和名称都可以互通

Docker自定义网络如何添加已经运行的容器

上面使用默认docker0的容器如果想使其与自定义网络的容器互通,可以通过如下将其加入进来

docker network connect mynet tomcat01
  • 1.

Docker中Docker网络-理解Docker0与自定义网络的使用示例_tomcat_09

此时就可以网络互通了。