docker 查看虚拟网卡_Docker动手教程5.1:容器单机网络1

内容摘要

none网络

host网络

bridge网络


初步观察容器网络

安装网桥管理工具

为了便于观察容器网络,在容器测试环境中安装 brctl 命令,命令为:

yum install bridge-utils

查询所有网桥信息:

brctl show
80efe968fe594766bc5b014f21c76fb7

在容器环境中容器的网桥为docker0。

查询容器网络

使用命令:

docker network ls
3930ce3be3e94c268094f68ab637fe2c

可以看到有3种容器网络: bridge,host,none。

使用 ifconfig 查询容器环境网络设备:

1ab958ecf92240bbb39fdadfb39368c5

说明:

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
f7a31464c2e14cfcbd40518f8b12a728

容器运行时使用 --network=none 参数。

在容器种使用 ip -a 查询网络设备,可以看到只有回环设备。

退出容器,使用 docker inspect 命令查看容器网络配置:

28b3c2dd5ac04f0cb1f2fdacee2345b8

可以看到 IPAddress 和 Gateway 没有值。

使用 brctl show 查看容器网桥:

2fbadd02985b47868e4a0ddd74c9ac08

可以看到 interfaces 列没有信息。

从上面可以看出 none 网络的容器,主机是没有办法访问的,容器完全封闭。


host网络

运行 busybox 容器,使用 host 网络,命令为:

docker run -it --network=host --name busybox2 busybox
03a3c84183ee41cc87f8d89b8810ef61

在容器种查询网络,之后再主机种查询,可以看到容器网络和主机网络居然一模一样。

而且,容器的 hostname 竟然也是 ~,即root。

使用 docker inspect 观察容器:

177879bd70bb4923bfb86fbb19bd384a

可以看到 Gateway和IPAddress 两个参数值为空。

查看 容器网桥 docker0:

accf629bea91426c9a0a5f5be252448c

可以看到:interfaces 列没有任何数据。


bridge网络

在实验前,请使用快照恢复容器环境到最初。

先使用 brctl show 命令查询网桥信息:

0c0da42b816b4b24ab6d5a32b8edd8fe

使用 bridge 网络部署容器 tomcat:jdk8,命令为:

docker run -d -p 8080 --name=tomcat8 --network=bridge tomcat:jdk8
c831144a77984a7ebaec373a73af7f32

使用bridge网络运行tomcat容器后,进入容器,使用 ip a 命令查询网络设备,可以发现除了回环设备lo外,还有一块虚拟网卡:eth0@if25,IP地址为172.17.0.2/16。


在主机中查询网桥信息,看发生了什么变化:

98617046d7a94015889029bfb78309a8

可以看到多了veth设备,网络对。


使用 docker inspect 查看容器网络配置信息:

ec3cf1a344544fa8a54b4d6444f53d12

可以看到Gateway是 172.17.0.1,这个IP地址刚好是docker0 的IP地址。


在主机中查看网络设备:

8218864547a241eebba7656e0651f657

可以看到主机中 docker0的IP地址的确是172.17.0.1,它是tomcat容器的网关。

最下面是新建的veth,veth设备相当于一根网线,将容器的虚拟网卡和主机的docker0链接起来,从而使得容器可以被主机访问。


下面分别在主机和容器中相互ping一下,看网络能否联通:

cad4214cc10b4b7b98adbbee908a3ff4

可以发现,网络是互通的。


问题:容器的IP为172.17.0.2,为什么是这个网段?

使用 docker network inspect 命令查看 bridge网络的配置:

f3fbdd9cfd7a43e2bbb31d2a8beecf7a

可以看到Subnet为:172.17.0.0/16,容器IP刚好在该网段中。


自定义bridge网络

docker在安装成功后,自动创建3种类型网络。我们也可以自己定义网络,下面演示下如何自定义bridge网络。

创建名为hello_net的网络,命令为:

 docker network create --driver bridge hello_net
a044133e11ef4b4489ec219f5f337c59

查询网桥:

48c5b08d7bd341238db4609e49bdf08d

可以看到多个一个网桥设备:br-6a4613082c78

查询自定义网络详细信息:

b83c6753670e4387b2e95b0ee2d7031d

可以看到新建网络的Subnet和网关分别为: 172.19.0.0./16,172.19.0.1。


下面使用自定义网络运行上面的tomcat:jdk8容器,命令为:

docker run -d -p 8080 --name=tomcat8 --network=hello_net tomcat:jdk8
5da359b4bd6246cd96d8fe1bcae3e015

运行成功后,进入容器,可以看到新建的网卡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
301c9dea7743440d8afdcb9d631d0e6a

可以发现,网段和网关就是我们定义的方式。


下面使用该网络运行tomcat:jdk8容器,同时,我们可以自己指定IP地址:172.20.0.2,命令为:

docker run -d -p 8080 --name=tomcat8 --network=hello_net2 --ip 172.20.0.2 tomcat:jdk8
52de37f426ae409599694c1d7e65ed7b

可以看到日期的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值