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应用的深入,我感觉之 ...
随机推荐
- 电路调试检测维修总结积累 20181015 板子:3060-A
今天在检修一块3060-A电路板时 发现 3.3V烫 但是3.3V路上的电容并没有短路 于是拆单片机 拆RS232EN 拆 FM24V 最后发现 原来是 1117-3.3 处的33U ...
- SSH远程主机秘钥失效的解决方法
一.问题描述: 远程主机的SSH秘钥发生了变化,在使用SSH远程登录的时候,提示如下 [root@localhost ~]# ssh root@172.16.48.10 @@@@@@@@@@@@@@@ ...
- SUSE12 操作系统安装
今天开发同事需要一个客户的SUSE环境,原来没有安装过这个操作系统,网络配置方面有些问题见下一篇 镜像:SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso 安装过程: 选 ...
- lvresize 调整LVM逻辑卷的空间大小,可以增大空间和缩小空间
lvresize 相关命令:lvreduce,lvextend,lvdisplay,lvcreate,lvremove,lvscan lvresize指令:调整逻辑卷空间大小[语 法]lvr ...
- Runtime PM 处理不当导致的 external abort on non-linefetch 案例分享
硬件平台:某ARM SoC 软件平台:Linux 1 Runtime PM 简介 在介绍 Runtime PM 之前,不妨先看看传统的电源管理.传统的电源管理机制,称之为 System PM(Syst ...
- 模糊视频帧插值:CVPR2020论文点评
模糊视频帧插值:CVPR2020论文点评 Blurry Video Frame Interpolation 论文链接:https://arxiv.org/pdf/2002.12259.pdf 摘要 现 ...
- 一文教会你认识Vuex状态机
摘要:简单来说,Vuex就是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享. 本文分享自华为云社区<Vuex状态机快速了解与应用>,原文作者:北极光之夜. 一. ...
- 面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置
今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的. Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃圾回收器的 ...
- linux文件内容列传行_行转列
================ 文件内容列传行_行转列 ================ 一.列转行 1.编辑测试文件 vi log.txt 16:23:00 8.2% 1773620k 16:2 ...
- ES6深拷贝与浅拷贝
今天小编和大家一起探讨js中深拷贝和浅拷贝,简单一点理解就是,对于引用数据类型,深拷贝是数据引用地址不同,在改变一个数据的时候,不会影响另一个数据.而浅拷贝刚好相反.两个数据引用的是同一个堆内存地址, ...