Docker动手教程5.1:容器单机网络1

内容摘要

none网络

host网络

bridge网络

初步观察容器网络

安装网桥管理工具

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

yum install bridge-utils

查询所有网桥信息:

brctl show
Docker动手教程5.1:容器单机网络1

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

查询容器网络

使用命令:

docker network ls
Docker动手教程5.1:容器单机网络1

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

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

Docker动手教程5.1:容器单机网络1

说明:

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
Docker动手教程5.1:容器单机网络1

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

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

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

Docker动手教程5.1:容器单机网络1

可以看到 IPAddress 和 Gateway 没有值。

使用 brctl show 查看容器网桥:

Docker动手教程5.1:容器单机网络1

可以看到 interfaces 列没有信息。

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

host网络

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

docker run -it --network=host --name busybox2 busybox
Docker动手教程5.1:容器单机网络1

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

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

使用 docker inspect 观察容器:

Docker动手教程5.1:容器单机网络1

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

查看 容器网桥 docker0:

Docker动手教程5.1:容器单机网络1

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

bridge网络

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

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

Docker动手教程5.1:容器单机网络1

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

docker run -d -p 8080 --name=tomcat8 --network=bridge tomcat:jdk8
 
Docker动手教程5.1:容器单机网络1

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

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

Docker动手教程5.1:容器单机网络1

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

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

Docker动手教程5.1:容器单机网络1

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

在主机中查看网络设备:

Docker动手教程5.1:容器单机网络1

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

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

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

Docker动手教程5.1:容器单机网络1

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

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

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

Docker动手教程5.1:容器单机网络1

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

自定义bridge网络

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

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

 docker network create --driver bridge hello_net
Docker动手教程5.1:容器单机网络1

查询网桥:

Docker动手教程5.1:容器单机网络1

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

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

Docker动手教程5.1:容器单机网络1

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

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

docker run -d -p 8080 --name=tomcat8 --network=hello_net tomcat:jdk8
Docker动手教程5.1:容器单机网络1

运行成功后,进入容器,可以看到新建的网卡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
Docker动手教程5.1:容器单机网络1

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

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

docker run -d -p 8080 --name=tomcat8 --network=hello_net2 --ip 172.20.0.2 tomcat:jdk8
Docker动手教程5.1:容器单机网络1

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


分享到:


相關文章: