当前位置: 首页 > news >正文

容器如何访问外部世界?- 每天5分钟玩转 Docker 容器技术


下面我们讨论容器如何与外部世界通信。这里涉及两个方向:

容器访问外部世界

外部世界访问容器

容器访问外部世界

在我们当前的实验环境下,docker host 是可以访问外网的。

我们看一下容器是否也能访问外网呢?

可见,容器默认就能访问外网。

请注意:这里外网指的是容器网络以外的网络环境,并非特指 internet。

现象很简单,但更重要的:我们应该理解现象下的本质。

在上面的例子中,busybox 位于 docker0 这个私有 bridge 网络中(172.17.0.0/16),当 busybox 从容器向外 ping 时,数据包是怎样到达 bing.com 的呢?

这里的关键就是 NAT。我们查看一下 docker host 上的 iptables 规则:

在 NAT 表中,有这么一条规则:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

其含义是:如果网桥 docker0 收到来自 172.17.0.0/16 网段的外出包,把它交给 MASQUERADE 处理。而 MASQUERADE 的处理方式是将包的源地址替换成 host 的地址发送出去,即做了一次网络地址转换(NAT)。

下面我们通过 tcpdump 查看地址是如何转换的。先查看 docker host 的路由表:

默认路由通过 enp0s3 发出去,所以我们要同时监控 enp0s3 和 docker0 上的 icmp(ping)数据包。

当 busybox ping bing.com 时,tcpdump 输出如下:

docker0 收到 busybox 的 ping 包,源地址为容器 IP 172.17.0.2,这没问题,交给 MASQUERADE 处理。这时,在 enp0s3 上我们看到了变化:

ping 包的源地址变成了 enp0s3 的 IP 10.0.2.15

这就是 iptable NAT 规则处理的结果,从而保证数据包能够到达外网。下面用一张图来说明这个过程:

busybox 发送 ping 包:172.17.0.2 > www.bing.com。

docker0 收到包,发现是发送到外网的,交给 NAT 处理。

NAT 将源地址换成 enp0s3 的 IP:10.0.2.15 > www.bing.com。

ping 包从 enp0s3 发送出去,到达 www.bing.com。

通过 NAT,docker 实现了容器对外网的访问。 


本文作者:CloudMan

来源:51CTO

相关文章:

  • 使用cookies实现浏览历史记录功能
  • 字符串类型内建方法归纳总结
  • 【随笔】也随便说说隐私的事情
  • Android MVC模式
  • 诗歌rails 之bundle
  • 第十七、十八周微职位:tomcat,MogileFS
  • JSON 入门
  • 解密回声消除技术之一(理论篇)
  • 流水号连续生成的问题解决方法
  • PyCharm常用设置
  • 不使用中间变量交换两个数
  • 阿里巴巴集团CTO张建锋兼任阿里云CTO
  • 转:Discuz!NT跨站缓存同步
  • 自行车V刹和碟刹的对比结果分析
  • c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  • 《Java编程思想》读书笔记-对象导论
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CAP理论的例子讲解
  • CentOS 7 修改主机名
  • javascript面向对象之创建对象
  • Logstash 参考指南(目录)
  • Otto开发初探——微服务依赖管理新利器
  • PHP 小技巧
  • Redash本地开发环境搭建
  • Vue 2.3、2.4 知识点小结
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Zsh 开发指南(第十四篇 文件读写)
  • 给第三方使用接口的 URL 签名实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 蓝海存储开关机注意事项总结
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 数组的操作
  • 网页视频流m3u8/ts视频下载
  • 我建了一个叫Hello World的项目
  • 携程小程序初体验
  • 学习HTTP相关知识笔记
  • 用jQuery怎么做到前后端分离
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​linux启动进程的方式
  • ​你们这样子,耽误我的工作进度怎么办?
  • #ifdef 的技巧用法
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #pragma once
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)PySpark3:SparkSQL编程
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (译) 函数式 JS #1:简介
  • (转)socket Aio demo