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应用的深入,我感觉之 ...
随机推荐
- Linux_部署日志服务器
一.部署日志服务 1.查看自己的系统是否安装(一般默认安装) [root@localhost ~]# rpm -qa | grep rsyslog rsyslog-8.37.0-13.el8.x86_ ...
- 028.Python面向对象继承(单继承,多继承,super,菱形继承)
一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...
- Redis 主从架构搭建
引言 准备搭建的是主从架构( Master/Slave )中的一主两从模式:其中 Master 为 Redis 的主服务器,主要负责写操作,两个 Slave 为 Redis 的从服务器,主要负责读操作 ...
- Spring IoC容器 XML 配置与加载
IoC 容器 XML 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- linux 修改IP, DNS -(转自fighter)
linux下修改IP.DNS.路由命令行设置 ubuntu 版本命令行设置IP cat /etc/network/interfaces # This file describes the networ ...
- Synchronize 和 volatile 的区别
1. 在应用层面来讲 a. volatile是线程同步的轻量级实现,所以volatile的性能要比synchronize好: volatile只能用于修饰变量,synchronize可以用于修饰方法. ...
- 微信小程序开发(后端Java)
微信使用的开发语言和文件很「特殊」. 小程序所使用的程序文件类型大致分为以下几种: ①WXML(WeiXin Mark Language,微信标记语言) ②WXSS(WeiXin Style Shee ...
- IoU、GIoU、DIoU、CIoU损失函数
IoU.GIoU.DIoU.CIoU损失函数 目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成.目标检测任务中近几年 ...
- 容斥+dp (一)
ARC115 E AtCoder Problem Statement Given is a sequence of \(N\) integers \(A_1\),\(A_2\),...,\(A_N\) ...
- Spring如何使用三级缓存解决循环依赖
Spring如何使用三级缓存解决循环依赖 首先来了解一下什么是循环依赖 @Component public class A { @Autowired B b; } @Component public ...