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上,最终达到一种效果:外部程序通 ...
随机推荐
- ESA2GJK1DH1K基础篇: 测试APP使用SmartConfig绑定Wi-Fi 设备并控制设备
前言 实现功能概要 STM32控制WI-Fi模块以AT指令TCP透传方式连接MQTT服务器, 实现MQTT通信控制. 测试准备工作(详细下载步骤请参考 硬件使用说明 ) 一,下载单片机程序 二,安装A ...
- Lab1:Linux内核编译及添加系统调用(详细版)
实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...
- ECMAScript6-1
1.let与const ES205(ES6)新增两个重要的JavaScript关键字:let和const let声明的变量只在let命令所在的代码块内有效,const声明一个只读的常量,一旦声明,其值 ...
- Gamma阶段第十次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- leetcode 1110. 删点成林
题目描述: 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合). 返回森林中 ...
- Maven 教程(11)— Maven远程仓库的各种配置
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79545408 1.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库 ...
- NamedParameterJdbcTemplate举例使用
原文地址https://www.iteye.com/blog/cosmicbugs-1190279 NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以Jd ...
- vim查找
vim编辑器查找的时候,先 esc,然后 /要查找的内容,按下enter,查找下一个使用 n. 如果向向上查找使用 ?要查找的内容,按下enter,查找上一个使用n
- Python 3.X 练习集100题 01
有以下几个数字:1.2.3.4.5,能组成多少个互不相同且无重复数字的三位数?都是多少? 方法1: import itertools from functools import reduce lyst ...
- Semaphore源码分析
public class SemaphoreExample1 { ; public static void main(String[] args) throws Exception { Executo ...