Docker单机网络下
前言
Docker系列文章:
此篇是Docker系列的第七篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!
Docker网络初探
后台方式启动一个最新版本的centos镜像;
docker run -d -it --name centosworktest centos:latest
进入容器内部,查看容器的网络信息,我们可以看到一个eth0的网卡信息,该网卡上挂载的一个Veth-Pair,通过Veth-Pair与内部的网桥通讯;
#查看容器信息
docker ps
#进入容器内部
docker exec -it ad9342449b86 /bin/bash
#查看网络信息(yum install net-tools)
ifconfig

使用route -n查看容器内部的路由表信息,可以证实eth0是这个容器默认的通信的设备;

接下来我们退出容器,看下宿主机的网络情况,我们可以看到宿主机网络上挂载了一个Veth-Pair,猜测是挂载到docker0上的,这里我们推断docker0可能是一个bridge;

验证docker0是否是bridge,我们可以通过brctl show(yum install -y bridge-utils)命令来查看,通过查看我们发现docker0果然是一个bridge;

通过上面的实验我们可以猜测docker的网络模型结构应该是类似于网络篇上的结构,如下图:

为了验证结论的正确性,我们再次启动一个centosworktest02的容器,检查docker0是否挂载了新的Veth-Pair;
#后台方式启动一个名字为centosworktest02的centos镜像
docker run -d -it --name centosworktest02 centos:latest
#查看docker0是否挂挂载信息的Veth-Pair
brctl show
#查看网络情况
ifconfig

通过验证我们发现我们猜测基本正确,接下来我们验证一下容器之间网络的连通性,我们从centosworktest02 ping(yum install -y iputils) centosworktest,发现容器间的网络也是通的;



经过一系列验证,我们发现整体的猜测是正确的docker默认的在宿主机内部的网络模型就是通过bridge和Veth-Pair进行通信的。
Docker网络模型
实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接容器IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机端口,即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
网络模型
bridge
bridge模式是Docker的默认网络模式,也就是我们在网络初探上探索的模式,这里对其容器与宿主机的通信进行一个总结,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,在此宿主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
容器启动的时候会从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0的网卡,另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中,到这里我们只是完成了宿主机与容器,同一主机上容器间的通信,此时容器还不能与外部网络进行通信。
为了使外界可以访问容器中的进程,docker采用了端口绑定的方式,也就是通过iptables的NAT,将宿主机上的端口流量转发到容器内的端口上。当使用使用docker run -p时,就是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式中的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,此外由于容器与外界通信是基于三层iptables NAT,性能和效率上的损耗肯定是不可避免的。


host
如果启动容器的时候使用host模式,容器直接与宿主机使用同一网络命令空间,采用此模式的容器,可以直接使用宿主机的IP地址与外面进行通信,如果宿主机具有公网的IP地址时,那容器也会拥有这个公有的IP地址,与此同时,容器内服务的端口地址也能直接使用宿主机的端口,无需再进行额外的NAT转换。因此host最大的优势就是网络性能比较好,但是容器将不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈使用,容器内部将不再拥有所有的端口资源。

none
如果启动容器的时候使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。容器中只有lo回环地址,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

container
如果使用该模式新创建的容器和已经存在的容器会共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享IP、端口范围等信息。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

结束
欢迎大家点点关注,点点赞!
Docker单机网络下的更多相关文章
- Docker单机网络实战
前言 Docker系列文章: 此篇是Docker系列的第八篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么要学习Docker Docker基本概念 Docker镜像基本原理 ...
- docker单机网络类型
docker单机网络类型概述 Docker 安装时会自动在 host 上创建三种网络 分别为 bridge host none . 可用 docker network ls 命令查看 ...
- Docker单机网络上
前言 Docker系列文章: 此篇是Docker系列的第六篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么要学习Docker Docker基本概念 Docker镜像基本原理 ...
- Docker 单机网络
Docker Network相关命令 root@ubuntu:~# docker network --help Usage: docker network COMMAND Manage network ...
- 理解Docker单机容器网络
在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...
- Docker源码分析(八):Docker Container网络(下)
1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场 ...
- docker - kubernetes 网络(转)+ 架构图
1.host网络 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样.可以通过--network=host指定使用 host 网络.docker ...
- Docker:网络模式详解
Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...
- 【转】理解Docker容器网络之Linux Network Namespace
原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...
随机推荐
- python基础之内建模块base64
一.Base64概念 什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base6 ...
- IDEA 自定义文件头注释
什么是 IDEA 自定义文件头注释 IDEA 自定义文件头注释指的是创建 Java 类文件时,IDEA 可以自动设置文件头的注释信息,如下: 如何设置 IDEA 自定义文件头注释 打开 File-&g ...
- 3 当某个应用的CPU使用达到100%,该怎么办?
你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标-- CPU 使用率.CPU 使用率是单位时间内 CPU 使用情况的统计 ...
- 手机POS机
资质查询 http://www.pbc.gov.cn/zhengwugongkai/127924/128041/2951606/1923625/1923629/d6d180ae/index4.html ...
- 通过git将项目传到github上
lenovo@LAPTOP-3KMEN0B2 MINGW64 /e/Users/lenovo/springboot-project/forum $ ls forum.iml HELP.md mvnw* ...
- 五、SVM推导过程
SVM 时间复杂度一般为O(N³) 最重要的是推导过程 NIPS(机器学习顶级会议) 如果给定一个训练集,我们的目标是给定一个边界(一条线),离他最近的训练集样本路越宽越好 下面的几张图反映了SVM的 ...
- 手把手带你快速入门jQuery(视频|资料,建议收藏!)
jQuery是什么? jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架). jQuery设计的宗旨是 ...
- vmware workstation linux虚拟机点击suspend会卡死
vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...
- 三维视觉惯性SLAM的有效Schmidt-EKF
三维视觉惯性SLAM的有效Schmidt-EKF An Efficient Schmidt-EKF for 3D Visual-Inertial SLAM 论文地址: http://openaccess ...
- NVIDIA深度学习Tensor Core性能解析(下)
NVIDIA深度学习Tensor Core性能解析(下) DeepBench推理测试之RNN和Sparse GEMM DeepBench的最后一项推理测试是RNN和Sparse GEMM,虽然测试中可 ...