【Docke进阶篇】Docker网络模式与容器间通信
本篇主要是Docker网络模式与容器间通信。
上一篇:【Docker基础篇】Docker核心概念与指令
文章目录
- 一、预备知识点
- 二、Docker网络模式
- 1、查看Docker网络模式
- 2、bridge网络模式
- - 原理
- - 实现
- - 图解
- 3、host网络模式
- - 原理
- - 实现
- - 图解
- 4、none网络模式
- - 原理:
- - 实现:
- 5、container 网络模式
- - 原理:
- - 实现:
- - 图解:
- 三、自定义网络
- 1、用自定义网络实现容器互连
- 2、网络的连接、断开与移除
- 3、DNS
一、预备知识点
了解Docker网络模式前,先准备点计算机网络。
1、Veth:
Veth是Linux中一种虚拟出来的网络设备,veth设备总是成对出现,所以一般也叫veth-pair。veth模拟了在物理世界里的两块网卡,以及一条网线。通过它可以将两个虚拟的设备连接起来,让他们之间相互通信。
如:v-a和v-b是一对veth设备,v-a收到的数据会从v-b发出。相反,v-b收到的数据会从v-a发出。Veth就像一根网线。
Veth设备的特点:
- veth和其它的网络设备都一样,一端连接的是内核协议栈
- veth设备是成对出现的,另一端两个设备彼此相连
- 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去
veth的2头都直接连着网络协议栈,所以创建一个veth对,主机上就会多2个网卡。
veth的实现和底层理解参考这里。
2、eth0:
ethernet的简写,以太网接口与网卡对应,每个硬件网卡(一个MAC)对应一个以太网接口,其工作完全由网卡相应的驱动程序控制。
如果物理网卡只有一个,而却有eth1,eth2等,则可能存在无线网卡或多个虚拟网卡,虚拟网卡由系统创建或通过应用层程序创建,作用与物理网卡类似。
3、网卡和网桥
参考这里。
二、Docker网络模式
1、查看Docker网络模式
docker network ps
安装 Docker 以后,会默认创建三种网络:bridge、host、none
网络模式 | 特点 |
---|---|
bridge | 为每个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为bridge模式 |
host | 容器将不会虚拟出自己的网卡,也不会配置自己的IP,而是使用宿主机的IP和端口 |
none | 容器有独立的Network namespace ,但并没有对其进行任何网络设置,如分配veth和网桥连接、IP等 |
container | 新创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
2、bridge网络模式
- 原理
bridge模式下,Docker守护进程会创建一个虚拟以太网桥docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0接口(容器的网卡)。另一个接口放置在宿主机的命名空间中,以类似 vethxxx这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。
- 实现
首先以busybox为镜像创建容器net01(BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件)
docker run -it --name net01 busybox
ip addr查看信息:
查看宿主机的ip addr信息:
可以看到:
守护进程创建的一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,即图中的veth7353413
同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。
查看网桥信息
brctl show
#指令安装:
yum install -y bridge-utils
容器的IP地址和Gateway信息,可以docker inspect在NetworkSettings中查看
docker inspect 容器名 |grep -i NetworkSettings -A 50|grep -Ei "Gateway|IPAddress
查看bridge网络模式下的所有容器信息:
docker network inspect bridge
因bridge是创建容器时默认使用的网络模式,所以docker run时不用加–net bridge指定
- 图解
步骤总结就是:
Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
3、host网络模式
- 原理
host网络模式的容器,直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP,无需额外进行 NAT 转换,同时容器内服务的端口也可以使用宿主机的端口。
host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
- 实现
创建host网络模式的容器net02,注意这时要加–net host指定模式:
docker run -it --name net02 --net host busybox
ip addr查看信息,和宿主机的ip addr信息完全一致
再查看host网络模式下的所有容器信息,可以看到net02容器
docker network inspect host
- 图解
4、none网络模式
- 原理:
none 网络模式是指禁用网络功能,只有 lo 接口。
none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
lo,即locate,lo其实是一个系统虚拟的环回接口,它的IP地址是127.0.0.1,利用这个接口可以实现系统内部(一个本地进程为另一个本地进程)发送和接收数据。
- 实现:
–net none指定容器网络模式,创建net03容器
docker run -it --name net03 --net none busybox
docker network inspect none 查看所有 none 网络模式下的容器:
5、container 网络模式
- 原理:
创建容器时通过参数 --net container:容器名称或ID。Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信,两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的
- 实现:
基于容器net01创建container网络模式的容器net04
docker run -it --name net04 --net container:net01 busybox
查看net04和net01的addr信息:
可以看到,容器net04直接使用了net01的网卡信息。此时,stop容器net01,容器net04就只剩下lo接口了:
接下来重启net01,再重启net04,可以看到网卡信息恢复正常了:
- 图解:
三、自定义网络
考虑到安全性问题,实际开发中,我们常使用自定义网络来进行容器间的通信。
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称(run的时候用–name指定)通信。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用,即自定义网络,而不是安装Docker后自带的三个网络。
1、用自定义网络实现容器互连
第一步:新建网络,起名test–net
docker network create -d bridge test--net
参数:
- -d:参数指定 Docker 网络类型,即–driver
- 更多参数可docker network create --help查看
第二步:运行一个容器并连接到新建自定义网络 test–net
docker run -it --name net05 --net test--net busybox
docker inspect 查看容器的网络信息,在NetworkSettings中:
第三步:再创建一个容器,并连接到新建自定义网络 test–net,并ping上一步中创建的容器
当然,ping容器的Name和IP地址都可以,操作如下图:
可以看到容器net05和net06成功建立了互连关系!
2、网络的连接、断开与移除
- 连接网络
docker network connect 网络名称 容器名称
docker inspect 查看网络信息可以看到多了一个默认的bridge:
- 断开网络
docker network disconnect 网络名称 容器名称
断开net05新增的bridge网络,再docker inspect 查看容器网络信息,只剩一个test–net网络了:
- 移除网络
docker network rm 网络名称
删除某自定义网络,但当通过该自定义网络创建了容器,则该网络无法删除。
3、DNS
最后,关于DNS,可在宿主机的/etc/docker/daemon.json文件中来增加以下内容来设置全部容器的DNS:
{"dns" : ["114.114.114.114","8.8.8.8"]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8.8。配置完成后,需要重启docker才能生效,重启所有docker直接systemctl restart docker
。
systemtl系列指令功能强大,了解更多可跳这里here。
【Docke进阶篇】Docker网络模式与容器间通信相关推荐
- docker容器网络 - 同一个host下的容器间通信
2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...
- docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件
首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...
- 【云原生 | Docker 高级篇】06、Docker 网络模式详解
目录 一.Docker 平台架构图解 整体说明: 二.Docker 网络是什么 三.Docker 网络常用基本命令 1.查看网络 2.查看网络源数据 3.删除网络 4.案例 四.Docker 能干 ...
- docker 获取宿主机ip_Docker基础修炼6——网络初探及单机容器间通信
如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...
- Docker 学习笔记 - 进阶四 Docker网络和 Docker compose
Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...
- 关于docker那点事儿——docker网络模式
docker网络模式 前言 一.容器网卡.网桥docker0.veth关系 二.docker的4种网络模式 bridge模式 host模式 container模式 none模式 前言 可以说每一次技术 ...
- Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问
前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...
- docker网络--理解linux底层实现机制、docker网络模式
1. Linux网络基础 Linux内核具有非常成熟和高性能的TCP / IP堆栈实现.Docker网络使用linux内核的网络堆栈作为低级原语来创建高级网络驱动程序.简而言之,Docker网络就是 ...
- docker容器网络配置之容器间的链接(默认桥接网络下的links)
一. 遗留的容器连接方式 --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...
最新文章
- 数据治理展示血缘关系的工具_Nebula Graph 在微众银行数据治理业务的实践
- 深入理解 Event Loop
- border属性的CSS缩写顺序
- PHP获取重定向URL的几种方法
- MQTT数据处理之从tcp连接获取数据过程
- 不知道如何选择的时候,付诸行动比选择更重要
- [摘录]软件版本GA,RC,alpha,beta,Build 含义
- CSS改变插入光标颜色
- leetcode344题:反转字符串
- 拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
- 再还校园一个干净、健康的网络环境
- 电子邮件验证及部分常用正则表达式
- Java成员方法getinfo_我想问下程序中的setInfo()和getInfo()它们怎调用的??
- css背景颜色如何铺满屏幕
- WebView 入坑
- 【Alpha阶段】第五次scrum meeting
- 记一次艰难的SQL注入(过安全狗)
- 浏览器上检测电脑是否安装某个应用程序
- 中国动力电池PACK行业商业模式创新及发展方向建议报告2022-2028年版
- 并联串联混合的电压和电流_【中学物理】电流传感器在串联、并联电路中的应用...