系统学习Docker——Docker网络

1.Docker网络是什么
2.Docker网络能做什么
3.Docker网络基本命令
4.Docker网络的四种模式以及案例说明
5.Docker平台架构图解说明
1.Docker网络是什么
当我们在使用虚拟机的时候,我们都知道有好多种网络模式:
系统学习Docker——Docker网络
文章图片

我们大概介绍一下这几种网络模式:
1.bridged(桥接模式)
在bridged模式下,虚拟机虚拟出来的操作系统就好像局域网中一台独立的主机,可以访问局域网中任何一台机器。但是你需要手工为其配置IP地址,子网掩码,而且还要和宿主机保持在同一网段,这样虚拟机系统才能和宿主机系统进行通信。
2.NAT(网络地址转换模式)
VMnet8 默认 NAT 模式。
虚拟机向外部网络发送请求的时候,会先将数据交给NAT网络适配器,由NAT网络适配器加上“标记”,并以主机的名义转发出去,外部网络返回时的数据,也先由主机接收,然后由NAT网络适配器根据“标识”转发给对应的虚拟机。因此,NAT网络模式下,虚拟机和主机共享一个IP地址,一般情况下,外部网络无法访问到虚拟机。
3.host-only(仅主机模式)
仅主机模式下,虚拟机是一种与世隔绝的状态,不能连接上外网。
虚拟机尚且有这么多网络模式,我们docker也有三种网络模式:
系统学习Docker——Docker网络
文章图片

2.Docker网络能做什么
Docker网络一般有两个作用:
2.1)容器间的互联和通信以及端口映射
我们都知道容器拥有自己独立的IP地址,但是在容器之间如何通信,哪几个容器在同一网段,还是说几个容器共享主机的同一网段,这都需要我们拥有Docker网络的知识。
2.2)容器IP变动时候可以通过服务名直接网络通信而不受到影响
我们的容器重启/扩缩容,是常有的事,不可能我们容器每次重启之后都要手动更改IP,所以容器之间通过Docker网络根据容器名称直连的方式就变得尤为重要。
3.Docker网络基本命令
全部命令:
系统学习Docker——Docker网络
文章图片

查看所有网络:

docker network ls

查看网络源数据:
docker network inspectXXX网络名字

删除网络:
docker network rm XXX网络名字

查看某一容器的网络模式:
docker inspect 容器ID or 容器名字

4.Docker网络的四种模式以及案例说明
总体介绍:
网络模式 简介 使用命令
bridge 为每一个容器分配,设置IP,和VM的bridge模式类似。 --network bridge
host 虚拟机不会虚拟出自己的网卡,和主机公用IP --network host
none 容器有自己独立的网络,但是没有任何设置(不能连接外网,和VM的host类似) --network none
container 新的容器不会创建自己的网卡,而是和一个指定的容器共享IP,端口等等 --network container:NAME或者容器ID指定
容器实例的网络模式查看:
系统学习Docker——Docker网络
文章图片

默认为bridge模式。
4.1)bridge
Docker服务启动的时候,默认会创建一个docker0网桥:
系统学习Docker——Docker网络
文章图片

docker0在内核层连同了物理网络,这就将所有的容器与本地的主机都放在同一个物理网络,Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
执行过程:
4.1.1)
Docker服务在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器的时候,会根据Docker网桥的网段分配给容器一个IP地址,同时Docker网桥就是每个容器的默认网关。因为所有同一宿主机的容器使用了bridge模式后,都接入同一个网桥,这样容器之间就能通过容器的IP进行通信。
4.1.2)
docker 在运行run命令的时候,没有指定netword的话就默认使用的是bridge模式
4.1.3)
每个容器实例有一个网卡,叫eth0.
整个宿主机的网桥模式都是docker0,类似于交换机有一堆接口,每一个接口对应一个Docker容器,让他们彼此联通。
Docker容器通过docker0实现互联,docker0再通过eth33和外网进行互联,因此容器实例之间互联,同时也能访问外网。
系统学习Docker——Docker网络
文章图片

验证:
启动两个容器:
docker run -d -p 8081:8080--name tomcat81 billygoo/tomcat8-jdk8 docker run -d -p 8082:8080--name tomcat82 billygoo/tomcat8-jdk8

宿主机查看:
系统学习Docker——Docker网络
文章图片

tomcat1查看:
系统学习Docker——Docker网络
文章图片

tomcat2查看:
系统学习Docker——Docker网络
文章图片

4.2) host
host直接使用宿主机的IP地址进行外界通信,不需要额外进行NAT转换。
系统学习Docker——Docker网络
文章图片

案例:
警告:
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络
文章图片

如果docker启动的时候,使用--network=host,这个时候还指定了-p映射端口,这个时候就会有警告,且-p参数不会有任何效果,端口号会以主机端口号为主,重复时则递增。
正确方式:不使用任何端口号
docker run -d--network host --name tomcat83 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络
文章图片

此时运行的时候,就可宿主机使用同一IP了。
系统学习Docker——Docker网络
文章图片

4.3) none
表示禁用网络功能,只有lo标识(127.0.0.1本地回环)
案例:
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络
文章图片

4.4) container
新建的容器和一个已经存在的容器共享一个网络ip,端口等等。这两个容器除了网络,其它各方面的系统是隔离的。
系统学习Docker——Docker网络
文章图片

案例:
为了避免配置命令,我们这里的案例使用Alpine Linux,他以小,安全著称,作为基础镜像是一个非常好的选择,只有6M不到的大小。
docker run -it--name alpine1alpine /bin/sh docker run -it --network container:alpine1 --name alpine2alpine /bin/sh

运行结果,查看是否用了同一个网桥:
1号机:
系统学习Docker——Docker网络
文章图片

2号机:
系统学习Docker——Docker网络
文章图片

此时关闭1号机,再查看2号机,会发现网卡消失:
系统学习Docker——Docker网络
文章图片

4.5) 自定义网络
在前面的docker brige网络模式中,我们会发现,可以使用ip地址互相连同,但是用服务名,无法连同,我们可以尝试着看看:
docker run -d -p 8081:8080--name tomcat81 billygoo/tomcat8-jdk8docker run -d -p 8082:8080--name tomcat82 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络
文章图片

案例:
新建一个自定义网络,使用自定义网络启动docker容器
系统学习Docker——Docker网络
文章图片

我们可以发现用服务名的方式可以ping通:
系统学习Docker——Docker网络
文章图片

结论:
自定义网络模式本身就维护好了主机名和ip的对应关系。
5.Docker平台架构图解说明
系统学习Docker——Docker网络
文章图片

在学习了Docker网络以及之前一系列的基础知识之后,我们可以得出:Docker是一个C/S模式的架构,后端为一个松耦合的架构,众多模块各司其职。
Docker 运行的基本流程为:
【系统学习Docker——Docker网络】1 用户使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
2 Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
3 Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
4 Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
5 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境。
6 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
7 Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。

    推荐阅读