1.Docker网络是什么
2.Docker网络能做什么
3.Docker网络基本命令
4.Docker网络的四种模式以及案例说明
5.Docker平台架构图解说明
1.Docker网络是什么当我们在使用虚拟机的时候,我们都知道有好多种网络模式:我们大概介绍一下这几种网络模式:1.bridged(桥接模式)在bridged模式下,虚拟机虚拟出来的操作系统就好像局域网中一台独立的主机,可以访问局域网中任何一台机器。但是你需要手工为其配置IP地址,子网掩码,而且还要和宿主机保持在同一网段,这样虚拟机系统才能和宿主机系统进行通信。
2.NAT(网络地址转换模式)VMnet8 默认 NAT 模式。
虚拟机向外部网络发送请求的时候,会先将数据交给NAT网络适配器,由NAT网络适配器加上“标记”,并以主机的名义转发出去,外部网络返回时的数据,也先由主机接收,然后由NAT网络适配器根据“标识”转发给对应的虚拟机。因此,NAT网络模式下,虚拟机和主机共享一个IP地址,一般情况下,外部网络无法访问到虚拟机。
3.host-only(仅主机模式)仅主机模式下,虚拟机是一种与世隔绝的状态,不能连接上外网。
虚拟机尚且有这么多网络模式,我们docker也有三种网络模式:
2.Docker网络能做什么
Docker网络一般有两个作用:
2.1)容器间的互联和通信以及端口映射
我们都知道容器拥有自己独立的IP地址,但是在容器之间如何通信,哪几个容器在同一网段,还是说几个容器共享主机的同一网段,这都需要我们拥有Docker网络的知识。
2.2)容器IP变动时候可以通过服务名直接网络通信而不受到影响我们的容器重启/扩缩容,是常有的事,不可能我们容器每次重启之后都要手动更改IP,所以容器之间通过Docker网络根据容器名称直连的方式就变得尤为重要。
3.Docker网络基本命令全部命令:
查看所有网络:
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指定 |
容器实例的网络模式查看:

默认为bridge模式。
4.1)bridge
Docker服务启动的时候,默认会创建一个docker0网桥: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 run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
宿主机查看:
tomcat1查看:tomcat2查看:
4.2) hosthost直接使用宿主机的IP地址进行外界通信,不需要额外进行NAT转换。

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

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

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

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

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

案例:
为了避免配置命令,我们这里的案例使用Alpine Linux,他以小,安全著称,作为基础镜像是一个非常好的选择,只有6M不到的大小。
docker run -it--name alpine1 alpine /bin/shdocker run -it--network container:alpine1 --name alpine2 alpine /bin/sh
运行结果,查看是否用了同一个网桥:
1号机:
2号机:
此时关闭1号机,再查看2号机,会发现网卡消失:
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容器

我们可以发现用服务名的方式可以ping通:
结论:自定义网络模式本身就维护好了主机名和ip的对应关系。
5.Docker平台架构图解说明

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

版权声明:本文内容来自个人博客segmentfault:苏凌峰,遵循CC 4.0 BY-SA版权协议上原文接及本声明。
本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。
原文链接:https://segmentfault.com/a/1190000042427691
如有涉及到侵权,请联系,将立即予以删除处理。
在此特别鸣谢原作者的创作。
此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。