Docker 0x07: Docke 容器网络
Docke 容器网络
容器既然对外提供网络服务,那么容器肯定要有虚拟网卡,和要接入的网络,构建网络就要有虚拟网络设备。本篇就进入容器网络模型介绍。也是docker中最难点和最重要的一点了。自从v1.7后docker的网络实现,就独立为一个单独的项目,叫做libnetwork, 这个项目对docker的网络进行了实现。所以淡docker的网络,我们现在就看libnetwork项目结合docker。
Container Network Model (CNM)

- network sandbox: 包含了容器的网络相关配置,管理容器对外接口,还有路由表和DNS设置等,支持多种网络网络,通过多个不同endpoint.
- endpoint: endpoint实现当前sandbox接入到一个network中。An implementation of an Endpoint could be a veth pair, an Open vSwitch internal port or similar. 再network sandbox介绍知道,一个endpoint只能接入一个网络,如果连接到网络中,那只能属于一个sandbox。
- network 就是虚拟的网络了,可以是一个bridge,也可会议是要给vlan等,所有的endpoint接入到network中。这样统一network中的endpoint就可以通信,相应的sandbox就通信,所在的container应用之间就能通过这个newwork进行通信了。
具体项目中代码对象有哪些
- NetworkController 对用户提供APIs,用户通过APIs可以控制endpoint加入到newwork中,也就是提供容器的网络管理。
- Dirver 不是用户可见的对象,dirver对象提供了实际网络协议,通过NetworkController对象的APIs可以配置dirver。我们不能直接操作dirver对象,只能通过networkcontroller对象。dirver可以是内置的(Birdge,Host, overlay,None) 和 remote(来自三方提供的插件),不管内置还是三方,都是为了适应各种场景和cases.Driver拥有一个网络,他管理着网络(包括IPAM)。这个对象以后还会扩展,支持特殊的网络。
- Network对象,NetworkController创建该对象,network对象连接一组endpoint对象,并且起到网络隔离作用。
- Endpoint 对象,代表了Service Endpoint,提供了当前容器暴露的可连接端口。Newwork来创建endpoint对象。一个endpoint对象只能attache到一个network对象中。
- sandbox 对象, 代表了网络配置,如IP,MAC,routes, DNS。sandbox被创建当用户创建一个endpoint在network中时。
Implementations实现的网络(直接英文版)
Libnetwork includes the following driver packages:
- null
- bridge
- overlay
- remote
Null
The null driver is a noop implementation of the driver API, used only in cases where no networking is desired. This is to provide backward compatibility to the Docker's --net=none option. 不接入网络
Bridge
The bridge driver provides a Linux-specific bridging implementation based on the Linux Bridge. For more details, please see the Bridge Driver documentation. 网桥模式,这个时默认的网络驱动模式,安装完docker我们会发现默认创建了一个叫docker0的网桥,创建好的容器默认会使用这个网桥。这个其实是一个linux bridge。
Overlay
The overlay driver implements networking that can span multiple hosts using overlay network encapsulations such as VXLAN. For more details on its design, please see the Overlay Driver Design.
Remote
The remote package does not provide a driver, but provides a means of supporting drivers over a remote transport. This allows a driver to be written in a language of your choice. For further details, please see the Remote Driver Design.
Scope 网络范围
- local
- swarm
- 。。。
CNM具体注册流程
参考:https://github.com/docker/libnetwork/blob/master/docs/design.md#cnm-lifecycle
- 首先,驱动要注册自己到网络控制器里,控制器根据类型创建network网络;
- 其次,网络控制器在创建好的网络上创建endpoint接入端点;
- 最后,把容器连接到endpoint接入端点即可。
如果是删除销毁,那么顺序反过来即可。先是把容器从endpoint接入端点拔出,然后是删除endpoint,最后是删除网络。
CNM的出现,让容器的网络使用更加的简单,底层具体实现不需要关心。第三方网络插件要接入容器里,只要提供了network(网络)和endpoint(接入端点)就能联通容器。有了CNM,容器本身和网络就解耦了,灵活性大大增强。
docker网络操作基本命令
- docker network ls 列出当前的网络列表
- docker network create 创建一个容器网络,指定网络类型 -d overlay 这种方式
- docker network connect 连接一个容器到一个容器网络
- docker network disconnet 一个容器从一个容器网络中断开
- docker network inspect 参看容器详细信息
- docker network prune 清楚没有被用到的容器网络
- docker network rm 删除容器网络
一个运行着的容器的网络设置,
"NetworkSettings": {
"Bridge": "",
"SandboxID": "e02c19fea9a70967d4151bbb2c5f951200288e412a7dbb3ca85e012b90ad4865",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}
]
},
"SandboxKey": "/var/run/docker/netns/e02c19fea9a7",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "165c1ebe469e25f175f369ab45b899048740998668a5ea45eb586f7107fb5fc1",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "740d9e4f3c2a84f89a4fbb81421ab6fe5bd7232ad1473bdfeba7026abffc97fc",
"EndpointID": "165c1ebe469e25f175f369ab45b899048740998668a5ea45eb586f7107fb5fc1",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
上面容器所在的bridge容器网络
[
{
"Name": "bridge",
"Id": "740d9e4f3c2a84f89a4fbb81421ab6fe5bd7232ad1473bdfeba7026abffc97fc",
"Created": "2019-07-04T16:25:31.052265571+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"fdc1a38f45275d5c59176f595b9f2554c97366d7f6dcf2769cf2ffe3f3bf4a2e": {
"Name": "nginx_webserver",
"EndpointID": "165c1ebe469e25f175f369ab45b899048740998668a5ea45eb586f7107fb5fc1",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
小结
- libnetwork项目,独立出docker容器网络项目
- 容器网络模型,主要功能对象
- driver类型,也就是提供的网络类型
- 创建网络,容器连接到网络,默认的网络类型。
Docker 0x07: Docke 容器网络的更多相关文章
- .Net Core微服务入门全纪录(八)——Docker Compose与容器网络
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(七)--IdentityServer4-授权认证]中使用IdentityServer4 ...
- Docker的单主机容器网络
作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...
- Docker网络,手把手教你如何实现容器网络相关知识
Docker网络 理解Docker0 清空所有环境 测试 三个网络 #问题:docker 是如何处理容器网络访问的? [root@hsStudy /]# docker run -d -P --name ...
- Docker网络详细理解-容器网络互通
这篇文章主要解决以下几个问题: 1.同一个网段的容器互相之间通过ip进行ping通 2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法 3.同一个网段的容器互相 ...
- 【Networking】容器网络大观 && SDN 资料汇总
SDNLAB技术分享(十五):容器网络大观 SDNLAB君• 16-06-17 •2957 人围观 编者按:本文系SDNLAB技术分享系列,本次分享来自SDN撕X群(群主:大猫猫)群直播,我们希望 ...
- Docker底层架构之网络实现
前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...
- Docker进阶一:网络篇
理解Docker0 查看本地ip ip addr [root@VM-0-6-centos ~]# ip addr #本机回环地址 1: lo: <LOOPBACK,UP,LOWER_UP> ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- 理解Docker单机容器网络
在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...
随机推荐
- GOOD BYE OI
大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...
- table开发中遇到的问题
table元素是一个很常用的元素.但是在开发中,我也遇到了一些值得记录下来的问题及解决方案: 1.td内容溢出时,隐藏内容并且以省略号提示 .hide-content{ /* 不换行 */ white ...
- 第02组Beta冲刺(2/4)
队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...
- python 使用nmap 模块
官网 https://pypi.org/project/python-nmap/ >>> import nmap>>> nm = nmap.PortScannerS ...
- Java操作Hive
Hadoop版本:hadoop-2.9.2.tar.gz,Hive版本:apache-hive-2.3.6-src.tar.gz,安装Hive可查看:CentOS安装Hive 保证Hive以正确启动h ...
- 【视频开发】伽马校正(gamma correction)学习笔记
我相信几乎所有做图像处理方面的人都听过伽马校正(Gamma Correction)这一个名词,但真正明白它是什么.为什么要有它.以及怎么用它的人其实不多.我也不例外. 最初我查过一些资料,但很多文章 ...
- Maven 教程(15)— 实现多个项目关联自动化构建(maven-invoker-plugin插件的使用)
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79726664 一.场景设想一个团队正在开发一个项目 bus-core-api,并 ...
- BitSet源码
public class BitSet1 implements Cloneable, java.io.Serializable { // >>>左边补0, << 右边补0 ...
- 在flask中使用sqlalchemy插入数据返回新增的id
user = User(‘name’=‘张三’)db.session.add(user)db.session.flush()#输出新插入数据的主键print(user.id)#此时数据才插入到数据库中 ...
- NER(BiLSTM+CRF,Keras)
数据集为玻森命名实体数据. 目前代码流程跑通了,后续再进行优化. 项目地址:https://github.com/cyandn/practice/tree/master/NER 步骤: 数据预处理: ...