系统学习Docker——Docker网络

发布时间:2024-08-18 18:01

1.Docker网络是什么

2.Docker网络能做什么

3.Docker网络基本命令

4.Docker网络的四种模式以及案例说明

5.Docker平台架构图解说明

1.Docker网络是什么
当我们在使用虚拟机的时候,我们都知道有好多种网络模式
系统学习Docker——Docker网络_第1张图片
我们大概介绍一下这几种网络模式:
1.bridged(桥接模式)
在bridged模式下,虚拟机虚拟出来的操作系统就好像局域网中一台独立的主机,可以访问局域网中任何一台机器。但是你需要手工为其配置IP地址,子网掩码,而且还要和宿主机保持在同一网段,这样虚拟机系统才能和宿主机系统进行通信。

2.NAT(网络地址转换模式)
VMnet8 默认 NAT 模式。

虚拟机向外部网络发送请求的时候,会先将数据交给NAT网络适配器由NAT网络适配器加上“标记”,并以主机的名义转发出去,外部网络返回时的数据,也先由主机接收,然后由NAT网络适配器根据“标识”转发给对应的虚拟机。因此,NAT网络模式下,虚拟机和主机共享一个IP地址,一般情况下,外部网络无法访问到虚拟机

3.host-only(仅主机模式)
仅主机模式下,虚拟机是一种与世隔绝的状态,不能连接上外网。

虚拟机尚且有这么多网络模式,我们docker也有三种网络模式
系统学习Docker——Docker网络_第2张图片

2.Docker网络能做什么

Docker网络一般有两个作用

2.1)容器间的互联和通信以及端口映射

我们都知道容器拥有自己独立的IP地址,但是在容器之间如何通信哪几个容器在同一网段,还是说几个容器共享主机的同一网段,这都需要我们拥有Docker网络的知识。

2.2)容器IP变动时候可以通过服务名直接网络通信而不受到影响
我们的容器重启/扩缩容,是常有的事,不可能我们容器每次重启之后都要手动更改IP,所以容器之间通过Docker网络根据容器名称直连的方式就变得尤为重要

3.Docker网络基本命令
全部命令:
系统学习Docker——Docker网络_第3张图片

查看所有网络:

docker network ls

查看网络源数据:

docker network inspect  XXX网络名字

删除网络:

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网络_第4张图片

默认为bridge模式。

4.1)bridge

Docker服务启动的时候,默认会创建一个docker0网桥:
系统学习Docker——Docker网络_第5张图片
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网络_第6张图片

验证:

启动两个容器:

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

宿主机查看:
系统学习Docker——Docker网络_第7张图片

tomcat1查看:
系统学习Docker——Docker网络_第8张图片
tomcat2查看:
系统学习Docker——Docker网络_第9张图片

4.2) host
host直接使用宿主机的IP地址进行外界通信,不需要额外进行NAT转换。

系统学习Docker——Docker网络_第10张图片

案例:

警告:

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

image.png

如果docker启动的时候,使用--network=host,这个时候还指定了-p映射端口,这个时候就会有警告,且-p参数不会有任何效果,端口号会以主机端口号为主,重复时则递增。

正确方式:不使用任何端口号

docker run -d                          --network host --name tomcat83 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络_第11张图片

此时运行的时候,就可宿主机使用同一IP了。

系统学习Docker——Docker网络_第12张图片

4.3) none

表示禁用网络功能,只有lo标识(127.0.0.1本地回环)

案例:

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络_第13张图片

4.4) container

新建的容器和一个已经存在的容器共享一个网络ip,端口等等。这两个容器除了网络,其它各方面的系统是隔离的。

系统学习Docker——Docker网络_第14张图片

案例:

为了避免配置命令,我们这里的案例使用Alpine Linux,他以小,安全著称,作为基础镜像是一个非常好的选择,只有6M不到的大小。

docker run -it                                                    --name alpine1  alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2  alpine /bin/sh

运行结果,查看是否用了同一个网桥:

1号机:
系统学习Docker——Docker网络_第15张图片

2号机:
系统学习Docker——Docker网络_第16张图片

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

4.5) 自定义网络

在前面的docker brige网络模式中,我们会发现,可以使用ip地址互相连同,但是用服务名,无法连同,我们可以尝试着看看:

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8

docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

系统学习Docker——Docker网络_第18张图片

案例:

新建一个自定义网络,使用自定义网络启动docker容器

系统学习Docker——Docker网络_第19张图片

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

结论:
自定义网络模式本身就维护好了主机名和ip的对应关系。

5.Docker平台架构图解说明

系统学习Docker——Docker网络_第21张图片

在学习了Docker网络以及之前一系列的基础知识之后,我们可以得出:Docker是一个C/S模式的架构,后端为一个松耦合的架构,众多模块各司其职。

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来实现具体对容器进行的操作。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号