2019独角兽企业重金招聘Python工程师标准>>>

前面我们已经解决了容器间通信的问题,接下来讨论容器如何与外部世界通信。这里涉及两个方向:

  1. 容器访问外部世界

  2. 外部世界访问容器

容器访问外部世界

在我们当前的实验环境下,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 规则处理的结果,从而保证数据包能够到达外网。下面用一张图来说明这个过程:

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

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

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

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

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

下一节我们讨论另一个方向的流量:外部世界如何访问容器。

转载于:https://my.oschina.net/u/2397560/blog/1137720

容器如何访问外部世界?- 每天5分钟玩转 Docker 容器技术(36)相关推荐

  1. 外网如何访问 Service?- 每天5分钟玩转 Docker 容器技术(139)

    除了 Cluster 内部可以访问 Service,很多情况我们也希望应用的 Service 能够暴露给 Cluster 外部.Kubernetes 提供了多种类型的 Service,默认是 Clus ...

  2. 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)

    前面我们已经学习了如何部署 service,也验证了 swarm 的 failover 特性.不过截止到现在,有一个重要问题还没有涉及:如何访问 service?这就是本节要讨论的问题. 为了便于分析 ...

  3. 学容器必须懂 bridge 网络 - 每天5分钟玩转 Docker 容器技术(32)

    上一节我们讨论了 none 和 host 类型的容器网络,本节学习应用最广泛也是默认的 bridge 网络. Docker 安装时会创建一个 命名为 docker0 的 linux bridge.如果 ...

  4. DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)

    在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部署时会默认安装 kube-dns 组件. ...

  5. 每天5分钟玩转kubernetes_DNS 访问 Service 每天5分钟玩转 Docker 容器技术(138)

    第138篇 DNS 访问 Service 在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部 ...

  6. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)

    本节开始学习 Service. 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会 ...

  7. 外部 Storage Provider - 每天5分钟玩转 Docker 容器技术(149)

    如果 Kubernetes 部署在诸如 AWS.GCE.Azure 等公有云上,可以直接使用云硬盘作为 Volume,下面是 AWS Elastic Block Store 的例子: 要在 Pod 中 ...

  8. 网络模型 - 每天5分钟玩转 Docker 容器技术(169)

    本节我们讨论 Kubernetes 网络这个重要主题. Kubernetes 作为编排引擎管理着分布在不同节点上的容器和 Pod.Pod.Service.外部组件之间需要一种可靠的方式找到彼此并进行通 ...

  9. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

    在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster  Cluster 是计算.存储和网络资源的集合,Kubernetes 利用 ...

  10. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...

最新文章

  1. c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...
  2. nginx ruoyi 配置静态资源服务
  3. python中列表字典和字符串的相互转化
  4. vue-cli部署ngixs_nginx部署访问vue-cli搭建的项目的方法
  5. jnativecpp.dll一定要放到系统目录下吗_「实用」室内甲醛到底该如何去除?关键要做到这两点...
  6. postgreSQL学习(二):pgsql的一些基础操作
  7. 马化腾:卓越领导者的五种习惯(作出表率尤为重要)
  8. GNSS_NMEA 0183协议的校验和计算方法_C/C++
  9. 如何注册、发布 CSDN博客
  10. toolchain安装教程支持_网上现成toolchain安装操作
  11. 最简行阶梯矩阵生成器
  12. 三七互娱U3D面试记录
  13. sql镜像备份 转 浪客 博客
  14. 五分钟学会用Simulink模型生成HDL代码
  15. 用数学课件制作工具演示三棱锥的三视图
  16. 【JAVA】水仙花数
  17. android vitamio 缓存,Android如何集成Vitamio
  18. 程序员如何承接软件外包项目(转)
  19. 最新gcc下载和linux环境变量设置
  20. 常用的舆情监测技术分享

热门文章

  1. echarts中的自定义tooltips
  2. 数据技术大融合,HSTAP数据库有多少想象空间?
  3. 快手小程序预下单 tp6 demo
  4. 技术译文 | MySQL 8 需要多大的 innodb_buffer_pool_instances 值(上)
  5. 13. 如何打破白天开会、晚上加班的节奏
  6. 名称数据联网简介的翻译(计算机网络论文翻译)
  7. 数据中心产业深度报告:IDC产业链景气周期及投资框架分析
  8. Python游戏——Pong
  9. 自然辩证法与计算机科学与技术,自然辩证法与计算机科学技术的研究.pdf
  10. 电子计算机上total,计算器频幕上grand total 什么意思