使用Docker的macvlan为容器提供桥接网络及跨主机通讯
对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人。相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍。
Why macvlan?
首先我们去对比下VM和Docker中不同的网络,这样会比较清楚。
VM | Docker |
NAT | bridge |
Bridged | macvlan, overlay等 |
Host-only | bridge |
NAT
VM中的NAT对应Docker中的bridge,虽然叫bridge,但和VM的bridged网络却不一样,其原理是在宿主机上虚出一块网卡bridge0,然后所有容器会桥接在这块网卡的网段上。默认情况下容器能访问外部网络,但外部网络无法访问容器,因此需要通过暴露容器端口的方式(docker run -p)让外部网络访问容器内的服务。此时docker会在宿主机上建立一条NAT路由规则,将子网中容器内的服务通过端口转发(port forwarding)的方式暴露给外部网络。当bridge网络下不去暴露任何端口,那么基本上等同于VM的Host-only网络。
Bridged
桥接网络带来的好处是,不需要通过NAT的端口映射即可实现容器内服务的暴露,当容器桥接到物理网络时,容器就是物理网络中的一台主机,使得容器间及容器与物理主机间实现互通。上面提到Docker中默认的bridge并不是真正的桥接网络,而Docker的网络是可以灵活自定义的,可以通过多种方式实现真正的桥接。其中可以通过overlay网络驱动实现,多主机多容器的桥接,但需要依赖额外的key-value服务来保存网络拓扑信息。另外一些第三方工具也能够实现桥接模式,如pipework等。桥接网络可以使容器网络部署简单化,因此Docker官方在1.12版本之后引入了macvlan网络驱动,这样我们可以更简单的为容器配置桥接网络。
Macvlan
顾名思义,macvlan的原理是在宿主机物理网卡上虚拟出多个子网卡,通过不同的MAC地址在数据链路层(Data Link Layer)进行网络数据转发的,它是比较新的网络虚拟化技术,需要较新的内核支持(Linux kernel v3.9–3.19 and 4.0+)。
Using macvlan
docker network create -d macvlan \
--subnet=192.168.1.0/ \
--gateway=192.168.1.1 \
-o parent=enp4s0 mcv # 解释:
# .创建macvlan网络,使用macvlan网络驱动
# .指定要桥接的网络地址
# .指定网关
# .设置要在宿主机上那块网卡上建立虚拟子网卡
# 测试
docker run --net=mcv --ip=192.168.1.99 -itd alpine /bin/sh
# 运行容器,指定刚建好的macvlan网络,并制定IP地址。
# 如果不指定IP,会通过IPAM分配IP,默认是从192.168.1.2开始分配。
# 注意,分配时并不会判断地址冲突,可以通过docker的network命令去指定分配方式,这里不做赘述。 docker run --net=mcv -it --rm alpine /bin/sh
# 运行另外一个容器,进行连通性测试
ping 192.168.1.99
ping 192.168.1.1
另外,macvlan还支持802.1q trunk等更为复杂的网络拓扑结构,大家可以深入学习。
[via] Get started with Macvlan network driver
[via] Linux 上虚拟网络与真实网络的映射
使用Docker的macvlan为容器提供桥接网络及跨主机通讯的更多相关文章
- Docker:macvlan实现容器跨主机通信 [十四]
一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface ...
- 安装docker后,导致qemu的桥接网络出现问题
按照Qemu-4.1 桥接网络设置中介绍的方法建立起桥接网络后,可以实现虚拟机和host的相互ping,但是在虚拟机里去ping其他跟host处于同一个网段的ip地址时却失败了,然后ifconfig后 ...
- docker 实践十一:docker 跨主机通讯
在上一篇了解了关于 docker 的网络模型后,本篇就基于上一篇的基础来实现 docker 的跨主机通信. 注:环境为 CentOS7,docker 19.03. 本篇会尝试使用几种不同的方式来实现跨 ...
- centos7下安装docker(15.3跨主机网络-macvlan)
除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个int ...
- docker之容器访问和网络连接(三)
前言 当一台服务器上部署了多个应用容器,它们直接可能需要相互通信,比如web应用容器需要访问mysql数据库容器. 主机访问容器 通过映射端口的形式我们可以在外部访问容器内的服务 # 将主机的127. ...
- Docker系列04—跨主机网络方案(overlay/weave)
在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...
- docker使用 Flannel(etcd+flannel)网络
一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...
- docker swarm模式跨主机连接
一.前言 当我们开发好微服务之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行.由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的 ...
- VirtualBox安装RHEL之后配置桥接网络
VirtualBox安装RHEL之后配置桥接网络 1 如果主机是Intel (R) Ethernet Connection I217-LM上网的: 2 如果主机是无线上网的, 如ipconfig显示如 ...
随机推荐
- sublime text3中emmet插件的使用
首先,想要快速编码需 要在编辑器中安装常用插件,下面是emmet插件的使用: html5文档结构的生成方式: 1).!+tab键 2).html:5 +tab键 头部head中meta字符集的生成: ...
- 下拉框 tree 基于 EasyUi
public string DataTableToJson() { string dataJson = ""; string temp = ""; string ...
- hdu2087 剪花布条
剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Vue(四)事件和属性
1. 事件 1.1 事件简写 v-on:click="" 简写方式 @click="" <button v-on:click="show&quo ...
- JavaScript字符串API
String.prototype.anchor() anchor()方法用于创建一个<a>html描元素 const str = '我是html内容'.anchor('我是name属性值' ...
- 用C++实现半透明按钮控件(PNG,GDI+)
使用MFC实现上面的按钮半透明效果能看到父窗口中的内容,上面是效果图(一个是带背景图片的.另一个是不带的). 控件继承自CWnd类(彩色的部分是窗口的背景图片.按钮是PNG图片,第二个图标是鼠 ...
- [web 前端] mobx教程(一)-mobx简介
opy from : https://blog.csdn.net/smk108/article/details/84777649 Mobx是通过函数响应式编程使状态管理变得简单和可扩展的状态管理库.M ...
- git ssh 22 端口不可用时通过https 443 端口配置git ssh
Using SSH over the HTTPS port Sometimes, firewalls refuse to allow SSH connections entirely. If usin ...
- 原创科幻短篇《VR》
近些年VR很火,现在似乎又降温了,那么问题来了:VR到底有前景吗?我农村来的读书又少看不清楚哇.近些年房地产很火,现在似乎还是很火,那么问题来了:房价到底会降吗?我农村来的读书又少看不清楚哇. 以下正 ...
- CentOS 7下升级Python版本到3.x系列
由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...