Docker 单主机网络
PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家。
当容器逐步向容器集群,容器云技术演进的时候,一个不得不面对的问题就是各个容器的管理问题,有些容器需要交互,有些容器需要隔离,如何保证这些操作能够顺利地进行,这个时候,很多容器管理和编排的平台就应运而生了。首先,当然是 Docker 社区自己开发的 Swarm+Machine+Compose 的集群管理套件,然后还有 Twitter 主推 Apache 的 Mesos,最有名的应该为 Google 开源的 Kubernetes。
这些平台综合了容器集群资源管理,服务发现和扩容缩融等问题,是一个集大成的解决方案,但其实这些问题本质上都离不开网络,资源在各容器之间调度需要网络,服务发现需要网络,所以,可以说网络是容器集群环境下最基础的一环。
Docker 容器网络根据容器的部署位置,可以分为单主机网络(host)和多主机网络(multi-host),本文先看 Docker host 网络。
Docker host 网络分为 none,host,joined container 和 bridge 网络。
none 网络模式下,Docker 容器拥有自己的 network namespace,但是并不为容器进行任何的网络配置,也就是说容器除了 network namespace 本身自带的 localback 网卡外什么都没有,包括网卡、IP、路由等信息。用户如何要使用 none 网络,就需要自己添加特定的网卡,并配置 IP、路由等信息,但一般不会这么干,none 网络很好地做到了隔离,一般是用来跑那些对安全性要求极高且不需要联网的应用。
比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。
想要使 Docker 使用 none 网络,只需要在创建容器的时候附带 --network = none 即可。
host 网络,顾名思义就是 Docker 容器使用宿主机的网络,相当于和 host 共用了同一个 network namespace,Docker 容器使用 host 的网卡、IP 和路由等功能对外通信。
虽然这种模式下 Docker 没有创建独立的 network namespace,但其他 namespace 仍然是隔离的,如文件系统、进程列表等。host 网络最大的好处就是使得 Docker 容器对外通信变得简单,直接使用 host 的 IP 进行通信即可,但缺点也很明显,就是降低了隔离性,同时还会存在和其他容器对网络资源的竞争与冲突的问题。
同样要使用 host 网络,只需创建容器时附带 --network = host 即可。

joined container 网络和 host 网络不同的是,它是和其他的 container 共享一个 network namespace,一个 network namespace 可以被一个或者多个 Docker 容器共享。在这种模式下,两个容器之间可以通过 localback 回环网卡通信,增加了容器间通信的便利性。
同样可以在创建容器时,使用参数 --network = container:another_container_name 来和另外容器共享网络。

bridge 网络是最常用的网络模式,它兼顾了安全性和功能的完备性,但其与外部通信要通过 NAT 转换,在复杂的网络场景下会存在诸多不便。
bridge 网络在创建的时候通过 --network = bridge 指定,Docker daemon 会为创建的容器自动创建一个 Docker 网桥——docker0(也可以人为指定名称 --driver bridge my_net),这个 docker0 就用来联结 Docker 容器和 host 的桥梁。
然后,Docker daemon 会创建一对虚拟网卡 veth pair,一块网卡留在宿主机的 root network namespace 中,并绑定到 docker0 上,另一块放在新创建的 network namespace 中,命名为 eth0,并为其配置 IP 和路由,将其网关设为 docker0,如下,这样整个容器的 bridge 网络通信环境就建立起来了,其他容器的建立方式也是如此,最终各容器之间就通过 docker0 这个桥梁互联互通了。

下文将讨论更为复杂的 multi-host 网络。
PS:对云计算感兴趣的小伙伴可以关注我的微信公众号:aCloudDeveloper,专注云计算领域,坚持分享干货。

Docker 单主机网络的更多相关文章
- docker单主机网络
当你安装Docker时,它会自动创建三个网络.你可以使用以下docker network ls命令列出这些网络: [root@localhost ~]# docker network ls NETWO ...
- Docker跨主机网络——overlay
前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...
- Docker 多主机网络总结(非常全)
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- docker多主机网络方案
本文探讨Docker多主机网络的性能. 在过去的博文里,我测试过 Docker的网络 . MySQL服务器团队 提供了他们自己的结果,和我的观察是一致的. 本文里一系列的测试,想更多关注使用多主机的D ...
- Docker多主机网络 OpenvSwitch
一.Open vSwitch Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...
- Docker入门篇(二)之docker的单主机网络
Docker 安装时会自动在host上创建三个网络,我们可用 docker network ls命令查看: [root@localhost ~]# docker network ls NETWORK ...
- Docker跨主机网络实践
Docker使用中网络管理是最麻烦的,在项目初始化前期就需要进行合理的规划,如果在比较理想的单主机的网络通信是比较简单的,但如果涉及到跨主机的网络就需要使用docker自带的overlay netwo ...
- Docker多主机网络
网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...
随机推荐
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...
- Cocos2D在Xcode7和iOS 9.2上IMP调用出错
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原来的代码一直在Xcode6.4上和iOS 8.4上运行,没有 ...
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...
- 文章标题 Oracle数据库中dual表使用
一. 业务场景 业务流程需要进行写入和更新的比较,所以有原表和历史表. 要求表中的ID唯一性,以及两张表的ID关联,另外后续可能数据库会进行迁移 二.方案选择 方案一:id设置为int型自增长. 这种 ...
- (NO.00005)iOS实现炸弹人游戏(五):游戏数据的初始化(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们现在来依次看一下上篇中提到的各个方法,首先介绍的是updat ...
- 【一天一道LeetCode】#350. Intersection of Two Arrays II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- 【一天一道LeetCode】#155. Min Stack
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Design ...
- UNIX网络编程——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include&l ...
- Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT
本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...
- log4j.xml示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SY ...