Bootstrap

Dockerfile精编细作(六)四种网络模式bridge、host、container、none

查看网卡信息

查看ip信息:centos7:ip add或ip addr
在这里插入图片描述

  • lo:localhost网卡
  • ens33:对外网卡以太网,本机ip
  • docker0:docker容器和宿主机通信的网卡,Docker容器网桥
    • Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
    • Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

四种网络模式

docker run 创建docker容器时,可以使用-net指定容器网络模式如下

docker run –net=bridge …等等

  • bridge模式:是docker的默认网络模式 ,不写–net参数,就是bridge模式。
  • host模式:容器和宿主机共享Network namespace
  • container模式:容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
  • none模式:容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。

bridge模式

bridge模式是docker默认的网络设置,此模式会为每一个容器分配Network namespace、设置ip等

进入一个bridge模式的容器查看网卡信息如下图
在这里插入图片描述

  • lo:localhost网卡,与宿主机网卡一致
  • eth0:容器的网卡,ip等信息

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

容器ip地址不会暴露到外部,外部无法通过ip寻址

host模式

和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

如图容器并没有分配PORTS信息
在这里插入图片描述
可以访问(如果不能访问请查看防火墙是否关闭或者是否开放此端口)
在这里插入图片描述

在这里插入图片描述

使用host模式需要考虑安全性,使用host模式启动容器,可以在容器中查看到宿主机中的网络信息。如果隔离性良好的环境(租户的虚拟机中)使用问题不大

none模式

docker容器拥有自己的Network Namespace 但是不为docker容器进行任何网络配置,这个docker 容器没有网卡、ip、路由等信息,需要自己为docker容器添加网卡、ip、路由等信息
在这里插入图片描述

container模式

创建的容器和已经存在的容器共享一个Netword Namepace,而不是与宿主机共享,新建的容器不会创建网卡、ip,而是与指定的容器共享IP、端口范围等,容器之间除了网络方面共享,其余都是隔离的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

;