docker的网络架构配置
http://xiaorenwutest.blog.51cto.com
docker 网络架构模
默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器。
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务
外部访问容器:
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
大写的“P”表示随机分配端口和docker容器内的端口进行映射,
小写的“p”表示指定端口和docker容器内的端口进行绑定映射。
docker的网络配置:
Docker 四种网络模式
docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:
· host 模式,使用 --net=host 指定。
· container 模式,使用 --net=container:NAMEorID 指定。
· none 模式,使用 --net=none 指定。
bridge 模式,使用 --net=bridge 指定,默认设置。
host 模式
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
例如,我们在192.168.10.1/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.10.1:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
启动容器前,执行pgrep http查看宿主机httpd进程
上面显示结果说明宿容器主机没有httpd进程运行
用 host 模式启动一个含有 web 应Docker用的
用浏览器访问宿主机地址的80端口
注意防火墙:
container 模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
运行一个容器:查看容器的IP
将容器切换到后台运行:ctrl+p ctrl+q
在运行一个容器使用container模式:查看新容器的地址
none模式
这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。
bridge模式
当 docker 启动时,会在主机上创建一个 docker0 的虚拟网卡。他随机挑选 RFC1918 私有网络中的一段地址给 docker0 。比如 172.17.0.1/16,16 位掩码的网段可以拥有 65534 个地址可以使用,这对主机和容器来说应该足够了。
docker0 不是普通的网卡,他是桥接到其他网卡的虚拟网卡,容器使用它来和主机相互通信。当创建一个 docker 容器的时候,它就创建了一个对接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,它们是绑在一起的一对孪生接口。这对接口在容器中那一端的的名字是 eth0 ,宿主主机端的会指定一个唯一的名字,比如 vethAQI2QT 这样的名字。
所有的 veth* 的接口都会桥接到 docker0 ,这样 docker 就创建了在主机和所有容器之间一个虚拟共享网
bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.0.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)
Docker完成以上网络配置的过程大致是这样的:
1.在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
2.Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。
注:brctl 工具依赖 bridge-utils 软件包
3.从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
容器内部访问外网以及容器和主机之间的端口映射都是通过Iptables实现的,可以查看Iptables表分析。
查看当前 docker0地址
在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到 docker0。每个容器都会配置同 docker0 ip 相同网段的专用 ip 地址,docker0 的 IP 地址被用于所有容器的默认网关。
运行一个容器:
查看当前运行的容器:
通过brctl show命令查看
以上, docker0 扮演着6d51c11aa19b和e6901fb7ab36这两个容器的虚拟接口 vethxx interface 桥接的角色。
执行docker network inspect bridge查看桥接网络的详细信息
自定义网桥
除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器。在启动 Docker 服务的时候,使用 -b BRIDGE 或 --bridge=BRIDGE 来指定使用的网桥。
Docker 允许你管理 docker0 桥接或者通过-b选项自定义桥接网卡,需要安装bridge-utils软件包。
基本步骤如下:
1.确保 docker 的进程是停止的
2.创建自定义网桥
3.给网桥分配特定的 ip
4.以 -b 的方式指定网桥
具体操作步骤:
如果服务已经运行,那需要先停止服务,并删除旧的网桥
然后创建一个网桥 bridge0,给网桥分配特定的 ip
查看确认网桥创建并启动
或者
修改/etc/sysconfig/docker文件
修改前:
修改后:添加前面所新建的网桥
启动 Docker 服务。
新建一个容器,可以看到它已经桥接到了 bridge0 上。
进入容器,查看容器的IP
docker 服务启动成功并绑定容器到新的网桥,新建一个容器,你会看到它的 ip 是我们的设置的新 ip段, docker 会自动检测到它。用 brctl show 可以看到容器启动或则停止后网桥的配置变化,在容器中使用 ip a 和 ip r 来查看 ip 地址配置和路由信息。
让我们回顾一些基础知识:
机器需要一个网络接口来发送和接受数据包,路由表来定义如何到达哪些地址段。这里的网络接口可以不是物理接口。事实上,每个 linux 机器上的 lo 环回接口( docker 容器中也有)就是一个完全的linux 内核虚拟接口,它直接复制发送缓存中的数据包到接收缓存中。 docker 让宿主主机和容器使用特殊的虚拟接口来通信 -- 通信的 2 端叫“ peers“,他们在主机内核中连接在一起,所以能够相互通信。创建他们很简单,前面介绍过了。
docker 创建容器的步骤如下:
创建一对虚拟接口
其中宿主主机一端使用一个名字比如 veth65f9 ,他是唯一的 , 另外一端桥接到默认的 docker0, 或其它你指定的桥接网卡。
主机上的 veth65f9 这种接口映射到新的新容器中的名称通常是 eth0, 在容器这个隔离的 networknamespace 中,它是唯一的,不会有其他接口名字和它冲突。
从主机桥接网卡的地址段中获取一个空闲地址给 eth0 使用,并设定默认路由到桥接网卡。
完成这些之后,容器就可以使用这eth0 虚拟网卡来连接其他容器和其他网络。
你也可以为特殊的容器设定特定的参数,在 docker run 的时候使用 --net ,它有 4 个可选参数:
--net=bridge :默认连接到 docker0 网桥。
--net=host :告诉 docker 不要将容器放到隔离的网络堆栈中。尽管容器还是有自己的文件系统、进程列表和资源限制。但使用 ip addr 命令这样命令就可以知道实际上此时的的容器处于和 docker 宿主主机的一样的网络级别,它拥有完全的宿主主机接口访问权限。虽然它不允许容器重新配置主机的网络堆栈,除非 --privileged=true,—但是容器进程可以跟其他 root 进程一样可以打开低数字的端口,可以访问本地网络服务比如 D-bus ,还可以让容器做一些意想不到的事情,比如重启主机,使用这个选项的时候要非常小心!
--net=container:NAME_or_ID :告诉 docker 将新容器的进程放到一个已经存在的容器的网络堆栈中,新容器进程有它自己的文件系统、进程列表和资源限制,但它会和那个已经存在的容器共享 ip 地址和端口,他们之间来可以通过环回接口通信。
--net=none :告诉 docker 将新容器放到自己的网络堆栈中,但是不要配置它的网络。
下面通过配置一个以 --net=none 启动的容器,使他达到跟平常一样具有访问网络的权限。来介绍docker 是如何连接到容器中的。
启动一个运行 /bin/bash的容器,并指定 --net=none
再开启一个新的终端,查找这个容器的进程 id ,然后创建它的命名空间,后面的 ip netns 会用到
检查桥接网卡的 ip 和子网掩码
创建一对” peer“接口 A 和 B ,绑定 A 到网桥,并启用它
将 B 放到容器的网络命名空间,命名为 eth0, 配置一个空闲的 ip
自此,你又可以像平常一样使用网络了
当你退出容器后, docker 清空容器,容器的 eth0 随网络命名空间一起被摧毁, A 接口也被自动从docker0 取消注册。不用其他命令,所有东西都被清理掉了!
注意 ip netns exec 命令,它可以让我们像 root 一样配置网络命名空间。但在容器内部无法使用,因为统一的安全策略, docker 限制容器进程配置自己的网络。使用 ip netns exec 可以让我们不用设置 --privileged=true 就可以完成一些可能带来危险的操作。
扩展:创建一个点到点连接
默认情况下,Docker 会将所有容器连接到由 docker0 提供的虚拟子网中。
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
解决办法很简单:创建一对 peer 接口,分别放到两个容器中,配置成点到点链路类型即可。
首先启动 2 个容器:
#docker run -i -t --rm --net=none 镜像id/bin/bash
root@1f1f4c1f931a:/#
#docker run -i -t --rm --net=none镜像id/bin/bash
root@12e343489d2f:/#
找到进程号,然后创建网络名字空间的跟踪文件。
#docker inspect -f '``.`State`.`Pid`' 1f1f4c1f931a
2989
#docker inspect -f '``.`State`.`Pid`' 12e343489d2f
3004
#mkdir -p /var/run/netns
#ln -s /proc/2989/ns/net /var/run/netns/2989
#ln -s /proc/3004/ns/net /var/run/netns/3004
创建一对 peer 接口,然后配置路由
#ip link add A type veth peer name B
#ip link set A netns 2989
#ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
#ip netns exec 2989 ip link set A up
#ip netns exec 2989 ip route add 10.1.1.2/32 dev A
#ip link set B netns 3004
#ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
#ip netns exec 3004 ip link set B up
#ip netns exec 3004 ip route add 10.1.1.1/32 dev B
现在这 2 个容器就可以相互 ping 通,并成功建立连接。点到点链路不需要子网和子网掩码
DNS/HOSTNAME自定义
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
在容器中使用 mount 命令可以看到挂载信息:注(mount命令软件包util-linux)
# mount
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf文件立刻得到更新。
如果用户想要手动指定容器的配置,可以利用下面的选项。
-h HOSTNAME or --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的/etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker ps 中显示,也不会在其他的容器的 /etc/hosts 看到。
另外DNS指定解析使用的是宿主机的DNS解析;不然也不可能进行SNAT进行地址转发
宿主机的DNS
转载于:https://blog.51cto.com/xiaorenwutest/1926456
相关文章:
【官方福利】CSDN内测师限时申请,参与赢年末礼包
各位程序猿们都下载CSDN官方出品的插件了吧?什么?还有不知道插件是什么的同学??你错过了太多!更酷更高效的浏览器插件,一键万能操作,新标签页极简个性,让你的工作效率UP UP UP&#…

Sql年月日计算方法
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几…

读《每天懂一点成功概率学》
概率出现某种结果的数量/出现所有结果的数量 所谓“数学概率”,就是理论上计算出来的概率,例如抛硬币时,只有正面和反面两种结果,因此正面出现的概率就是1/2。 另一方面,我们反复抛硬币,根据实际结果计算出…

AV1时代要来了,超高清视频时代视频编码技术的机遇与挑战
近些年随着视频行业的迅猛发展,尤其像短视频、点播、直播、VR等领域的爆发,人们对于高清、超高清视频体验的追求越来越强烈,流媒体平台如何在提升观众观看体验,同时降低播放成本,利用技术降低带宽消耗的同时又能最大化…

敏捷软件开发(c#版)文摘
第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP 第9章 OCP 第10章 LSP 第11章 DIP 第12章 ISP 第13章 C#程序员UML概观 第三部分 薪水支付案例研究 第四部分 打…

asp.net 2.0 中GridView里设置日期格式
在asp.net 1.0 中的datagrid 中 设置日期字段格式时用 DataFormatString"{0:yyyy-MM-dd}"即可。在gridview 中设置短日期格式 使用<asp:BoundField HeaderText"发表时间" DataField"PostTime" DataFormatString"{0:yyyy-MM-dd}" &g…

springboot初学
首先苦于用ssh、ssm来搭建一个项目,这个基础搭建工作就大概要用半天的功夫才能弄好,想到就头疼,后面听了实验室一位大神的建议,用springboot啊,简单的不止一点点。就顺便学习了下这个神器,果然厉害。 有一次…

Exchange 2013与OWA13集成
好久没发新文章了,因为工作变动的原因,实在抱歉,今天给大家分享先office web app 2013怎么和最新的Exchange 2013进行集成使用吧,这点还是蛮有特色的,因为我们改变以往在OWA中预览Office的效果,我们先看看默…

判断一个string是否可以为数字
方案一:Try...Catch(执行效率不高)/// <summary>/// 名称:IsNumberic/// 功能:判断输入的是否是数字/// 参数:string oText:源文本/// 返回值: bool true:是 false:否/// </summary>/// <…
CSDN湘苗培优|火热报名中
湘苗培优火热报名中CSDN高校俱乐部在这里,你能获得CSDN技术认证与企业导师零距离技术交流参与线下技术沙龙活动求职简历指导参与项目交付并有机会企业内推现在报名即可选择由企业支付学费的订单式培养,或入职后再支付学费等多种付费模式,Z大程…

安装配置Emacs-rails
首先你的机器上肯定要安装emacs啦,此步略过不表。1、从 http://rubyforge.org/projects/emacs-rails 下载最新emacs-rails,解压文件到~/.emacs.d/rails 目录2、根据README,你需要下载三个依赖库:cd ~/.emacs.d/rails wget http://…
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化
来源 | 早起Python大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据,并且将数据写入Excel中同时自动生成折线图,主要…

删除SQL数据库中事务日志方法
DUMP TRANSACTION [数据库名] WITH NO_LOG BACKUP LOG [数据库名] WITH NO_LOG DBCC SHRINKDATABASE([数据库名])

新浪微博应用 IE下面框架嵌套框架的问题解决
新浪微博应用 IE下面框架嵌套框架的问题分为两种:1、回调的参数有误;2、session丢失;第一个问题,需要亲们仔细研读接口文档,App.AuthDialog.show({client_id : <?php echo $this->getParam(sub_appkey);?>,…

corosync+pacemaker+crm简单配置
# 系统 centos7.2 安装版本都是Yum源node1: 192.168.8.111 node2:192.168.8.112 vip :192.168.8.200nfs :192.168.8.113 # 互信~] ssh-keygen~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys~]# chmod go .ssh/authorized_keys~]# scp -p .ssh/i…
给AI系统做“安全体检”,阿里安全提出自动化AI对抗平台CAA | AAAI 2021
出品 | AI科技大本营(ID:rgznai100)安全人员曾为某车企自动驾驶系统做过一次安全测试,用物理对抗攻击欺骗Autopilot车道检测系统,导致汽车在Autopilot不发出警告的情况下驶入错误车道。假如这是一场真实的攻击…

linux新建文件权限问题
touch /etc/init.d/httpdchmod 755 /etc/init.d/httpdtouch可以新建一个空文件,可以修改文件的创建时间。比如:编译时看到提示文件的时间为将来的时间,可以使用touch命令来修改。Linux chmod 755和chmod 777 在linux终端先输入ls -al,可以看到…

基于MMSeg算法的中文分词类库
最近在实现基于lucene.net的搜索方案,涉及中文分词,找了很多,最终选择了MMSeg4j,但MMSeg4j只有Java版,在博客园上找到了*王员外*(http://www.cnblogs.com/land/archive/2011/07/19/mmseg4j.html )基于Java版的翻译代码…
关于git bush 中不能复制黏贴的问题
如果你是一个新手的话,在你使用个git的过程中,你会发现git 竟然不能复制黏贴,这简直是完全不能忍受的事,复制黏贴可以大大的节省了我们敲代码的时间,特别是在github中clone别人的仓库到本地,url地址需要一个…

linux系统proc目录进程信息详解
Proc 文件系统是一个实时的,常驻内存的文件系统,它跟踪进程在你机器上的运行情况和你系统的状态。/proc文件系统是常驻虚拟内存并且维持着操作系统的动态数据。大部分的 /proc文件系统信息被实时更新来与当前操作系统的状态一致。/proc文件系统的内容能被…

AI开源评测基准AI-Rank,为开源建立标准
当前,数字经济已经成为经济发展的活力引擎和促进经济结构转型升级的重要动能,深刻改变着人类的生产生活方式。12月11日,2020中关村大数据日暨数字经济融合创新发展论坛在北京举行。本届中关村大数据日以“开源共享 生态赋能”为主题ÿ…

Linux 汇编语言开发指南
Linux 汇编语言开发指南肖文鹏 (xiaowp263.net), 北京理工大学计算机系硕士研究生本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究,喜爱Linux和Python。你可以通过 xiaowp263.net与他取得联系。 简介&am…

拦截器与filter的区别
在接触拦截器和filter以来,觉得这两者有太多相似之处,都是运用aop的思想处理事情,但是这两者到底有什么区别倒一直很模糊,今天看书的时候,终于看到自己满意的解答了,赶紧记录下来:1.使用范围不同…
湘苗培优 | 从入门到精通
缘起2020年长沙发出软件再出发号召,同时发布了《长沙市软件和信息技术服务业发展三年(2020-2022 年)行动计划》。当软件产业的生态逐渐建立,企业孵化培育的土壤逐渐肥沃,长沙软件产业焕发出前所未有的活力和生机,一大批软件产业项…

HBase scan setBatch和setCaching的区别
2019独角兽企业重金招聘Python工程师标准>>> HBase的查询实现只提供两种方式: 1、按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get) 2、按指定的条件获取一批记录,scan方法&…
3行Python代码就能获取海量数据?
一谈起数据分析,首先想到的就是数据,没有数据,谈何分析。毕竟好的菜肴,没有好的原材料,是很难做的~所以本期小F就给大家分享一个获取数据的方法,只需三行代码就能搞定。「GoPUP」,大…

c语言中int和指针和字符所占字节
Linux下 sizeof(int);int 4字节 sizeof(char);字符1字节 char * p"12345"; sizeof(p);指针占4字节

SCCM 2012 SP1系列(七)分发部署exe软件
2、exe软件分发以skydrive为例,打开SCCM控制台,展开应用程序管理,右键“包”选择“创建包”打开创建包和应用程序向导,填写部署包的相关信息,勾选“此包包含源文件”,然后点击“浏览”选择sykdrive文件位置…

关于勒索病毒的防御
关于勒索病毒的防御Windows的445漏洞与139漏洞由来已久,大面积暴发只是迟早的事情。关于防御方法其实也有很多,早就满地都是了。但是快速、大量、不断网的部署防御却不容易。比如使用端口排除、删除文件与打印共享服务、修改注册表、使用防火墙、以及组策…

linux的根文件系统中的proc文件夹详解
什么是proc文件系统 |linux /proc目录介绍|proc中文手册proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,…