内容摘要
none网络
host网络
bridge网络
初步观察容器网络
安装网桥管理工具
为了便于观察容器网络,在容器测试环境中安装 brctl 命令,命令为:
yum install bridge-utils
查询所有网桥信息:
brctl show
在容器环境中容器的网桥为docker0。
查询容器网络
使用命令:
docker network ls
可以看到有3种容器网络: bridge,host,none。
使用 ifconfig 查询容器环境网络设备:
说明:
1、eth0 表示第一块网卡, eth0是以太网设备编号0(0就是第一块,linux是从0开始编号的)
2、lo 是表示主机的回环地址127.0.0.1,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。
3、mtu 1500 网卡的最大传输单元 (bytes)为1500。
4、docker0 是容器的虚拟网桥。
容器在安装时,自动创建了3种网络:none,host,bridge,下面分别予以介绍。
none网络
运行 busybox 容器,使用none网络,命令为:
docker run -it --network=none --name busybox1 busybox
容器运行时使用 --network=none 参数。
在容器种使用 ip -a 查询网络设备,可以看到只有回环设备。
退出容器,使用 docker inspect 命令查看容器网络配置:
可以看到 IPAddress 和 Gateway 没有值。
使用 brctl show 查看容器网桥:
可以看到 interfaces 列没有信息。
从上面可以看出 none 网络的容器,主机是没有办法访问的,容器完全封闭。
host网络
运行 busybox 容器,使用 host 网络,命令为:
docker run -it --network=host --name busybox2 busybox
在容器种查询网络,之后再主机种查询,可以看到容器网络和主机网络居然一模一样。
而且,容器的 hostname 竟然也是 ~,即root。
使用 docker inspect 观察容器:
可以看到 Gateway和IPAddress 两个参数值为空。
查看 容器网桥 docker0:
可以看到:interfaces 列没有任何数据。
bridge网络
在实验前,请使用快照恢复容器环境到最初。
先使用 brctl show 命令查询网桥信息:
使用 bridge 网络部署容器 tomcat:jdk8,命令为:
docker run -d -p 8080 --name=tomcat8 --network=bridge tomcat:jdk8
使用bridge网络运行tomcat容器后,进入容器,使用 ip a 命令查询网络设备,可以发现除了回环设备lo外,还有一块虚拟网卡:eth0@if25,IP地址为172.17.0.2/16。
在主机中查询网桥信息,看发生了什么变化:
可以看到多了veth设备,网络对。
使用 docker inspect 查看容器网络配置信息:
可以看到Gateway是 172.17.0.1,这个IP地址刚好是docker0 的IP地址。
在主机中查看网络设备:
可以看到主机中 docker0的IP地址的确是172.17.0.1,它是tomcat容器的网关。
最下面是新建的veth,veth设备相当于一根网线,将容器的虚拟网卡和主机的docker0链接起来,从而使得容器可以被主机访问。
下面分别在主机和容器中相互ping一下,看网络能否联通:
可以发现,网络是互通的。
问题:容器的IP为172.17.0.2,为什么是这个网段?
使用 docker network inspect 命令查看 bridge网络的配置:
可以看到Subnet为:172.17.0.0/16,容器IP刚好在该网段中。
自定义bridge网络
docker在安装成功后,自动创建3种类型网络。我们也可以自己定义网络,下面演示下如何自定义bridge网络。
创建名为hello_net的网络,命令为:
docker network create --driver bridge hello_net
查询网桥:
可以看到多个一个网桥设备:br-6a4613082c78
查询自定义网络详细信息:
可以看到新建网络的Subnet和网关分别为: 172.19.0.0./16,172.19.0.1。
下面使用自定义网络运行上面的tomcat:jdk8容器,命令为:
docker run -d -p 8080 --name=tomcat8 --network=hello_net tomcat:jdk8
运行成功后,进入容器,可以看到新建的网卡IP为172.19.0.2,该IP地址处于hello_net网络的网段中;
查询网桥可以看到interfaces多了一个veth设备。
上面自定义网络的网段和网关是docker自动生成的,实际上可以自己指定网段和网关:
使用如下命令创建网络:
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 hello_net2
可以发现,网段和网关就是我们定义的方式。
下面使用该网络运行tomcat:jdk8容器,同时,我们可以自己指定IP地址:172.20.0.2,命令为:
docker run -d -p 8080 --name=tomcat8 --network=hello_net2 --ip 172.20.0.2 tomcat:jdk8
可以看到日期的IP地址和指定的一样。
至此,容器主机网络就讲完了,请大家在自己的容器环境中实验。
实验
创建容器,使用none网络
创建容器,使用host网络
创建容器,使用bridge网络
常用命令
sudo docker rm -f $(sudo docker ps -a | awk 'NR == 1 {next} {print $1}')
sudo docker rmi -f $(sudo docker images | awk 'NR == 1 {next} {print $3}')
docker rmi httpd