前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker容器中的应用是怎么跟外界通信的?

Docker容器中的应用是怎么跟外界通信的?

作者头像
Java学习录
发布2020-01-22 12:40:03
1.7K0
发布2020-01-22 12:40:03
举报
文章被收录于专栏:Java学习录Java学习录

当你安装Docker时,它会自动创建三个网络,使用docker network ls命令可以列出这些网络:

代码语言:javascript
复制
[root@master ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8ec195128f2b        bridge              bridge              local
cce37a6963d8        host                host                local
5f91f09783a0        none                null                local

而docker的网络模式则有4种。我们在启动docker容器时可以使用用 --net 选项指定容器的网络模式:host模式、none模、bridge模式、container模式,使用 --net=container:NAME_or_ID指定

host模式

这个模式类似于虚拟机中的桥接模式,和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口

Container模式

很好理解,指定新创建的容器和已经存在的一个容器共享一个Network Namespace

none模式

none 模式就是container 没有任何的网络,不给它创建网络,我们可以自己去自定义实现

Bridge模式

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中

那么docker容器是如何与外界通信的呢?

假设我们在容器中ping我的博客shiyujun.cn。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关上。接着包会转发给eth0,并从eth0发出去。在发出去之前,会有Iptable规则对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从宿主机上发出来的

那么外界的流量是如何进入容器的呢?

我们知道,容器启动后都需要与宿主机绑定一个端口,而当外界流量请求到那个端口时Iptable规则发现这个端口数容器使用的,就会进行DNAT转换将包发送到eth0,然后eth0会转发到docker0紧接着就到达了具体的容器中了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • host模式
  • Container模式
  • none模式
  • Bridge模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档