查看网卡信息
查看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、端口范围等,容器之间除了网络方面共享,其余都是隔离的