Docke 容器网络

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

Container Network Model (CNM)

  1. network sandbox: 包含了容器的网络相关配置,管理容器对外接口,还有路由表和DNS设置等,支持多种网络网络,通过多个不同endpoint.
  2. 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。
  3. network 就是虚拟的网络了,可以是一个bridge,也可会议是要给vlan等,所有的endpoint接入到network中。这样统一network中的endpoint就可以通信,相应的sandbox就通信,所在的container应用之间就能通过这个newwork进行通信了。

具体项目中代码对象有哪些

  1. NetworkController 对用户提供APIs,用户通过APIs可以控制endpoint加入到newwork中,也就是提供容器的网络管理。
  2. Dirver 不是用户可见的对象,dirver对象提供了实际网络协议,通过NetworkController对象的APIs可以配置dirver。我们不能直接操作dirver对象,只能通过networkcontroller对象。dirver可以是内置的(Birdge,Host, overlay,None) 和 remote(来自三方提供的插件),不管内置还是三方,都是为了适应各种场景和cases.Driver拥有一个网络,他管理着网络(包括IPAM)。这个对象以后还会扩展,支持特殊的网络。
  3. Network对象,NetworkController创建该对象,network对象连接一组endpoint对象,并且起到网络隔离作用。
  4. Endpoint 对象,代表了Service Endpoint,提供了当前容器暴露的可连接端口。Newwork来创建endpoint对象。一个endpoint对象只能attache到一个network对象中。
  5. 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 网络范围

  1. local
  2. swarm
  3. 。。。

CNM具体注册流程

参考:https://github.com/docker/libnetwork/blob/master/docs/design.md#cnm-lifecycle

  1. 首先,驱动要注册自己到网络控制器里,控制器根据类型创建network网络;
  2. 其次,网络控制器在创建好的网络上创建endpoint接入端点;
  3. 最后,把容器连接到endpoint接入端点即可。

如果是删除销毁,那么顺序反过来即可。先是把容器从endpoint接入端点拔出,然后是删除endpoint,最后是删除网络。

CNM的出现,让容器的网络使用更加的简单,底层具体实现不需要关心。第三方网络插件要接入容器里,只要提供了network(网络)和endpoint(接入端点)就能联通容器。有了CNM,容器本身和网络就解耦了,灵活性大大增强。

docker网络操作基本命令

  1. docker network ls 列出当前的网络列表
  2. docker network create 创建一个容器网络,指定网络类型 -d overlay 这种方式
  3. docker network connect 连接一个容器到一个容器网络
  4. docker network disconnet 一个容器从一个容器网络中断开
  5. docker network inspect 参看容器详细信息
  6. docker network prune 清楚没有被用到的容器网络
  7. 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": {}
}
]

小结

  1. libnetwork项目,独立出docker容器网络项目
  2. 容器网络模型,主要功能对象
  3. driver类型,也就是提供的网络类型
  4. 创建网络,容器连接到网络,默认的网络类型。

Docker 0x07: Docke 容器网络的更多相关文章

  1. .Net Core微服务入门全纪录(八)——Docker Compose与容器网络

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(七)--IdentityServer4-授权认证]中使用IdentityServer4 ...

  2. Docker的单主机容器网络

    作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...

  3. Docker网络,手把手教你如何实现容器网络相关知识

    Docker网络 理解Docker0 清空所有环境 测试 三个网络 #问题:docker 是如何处理容器网络访问的? [root@hsStudy /]# docker run -d -P --name ...

  4. Docker网络详细理解-容器网络互通

    这篇文章主要解决以下几个问题: 1.同一个网段的容器互相之间通过ip进行ping通 2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法 3.同一个网段的容器互相 ...

  5. 【Networking】容器网络大观 && SDN 资料汇总

    SDNLAB技术分享(十五):容器网络大观   SDNLAB君• 16-06-17 •2957 人围观 编者按:本文系SDNLAB技术分享系列,本次分享来自SDN撕X群(群主:大猫猫)群直播,我们希望 ...

  6. Docker底层架构之网络实现

    前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...

  7. Docker进阶一:网络篇

    理解Docker0 查看本地ip ip addr [root@VM-0-6-centos ~]# ip addr #本机回环地址 1: lo: <LOOPBACK,UP,LOWER_UP> ...

  8. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  9. 理解Docker单机容器网络

    在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...

随机推荐

  1. [RN] React Native 使用 图片预览和放大 插件 react-native-image-zoom-viewer 过程中,放大报错问题

    React Native 使用 图片预览和放大 插件 react-native-image-zoom-viewer 过程中,放大报错问题 报错如下: Cannot record touch end w ...

  2. 决策单调性优化dp 专题练习

    决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...

  3. Golang(三)Goroutine原理

    前言 最近用到了一些 Golang 异步编程的地方,感觉 Golang 相对于其他语言(如 Java)对多线程编程的支持非常大,使用起来也非常方便.于是决定了解一下 Goroutine 的底层原理. ...

  4. 【IntelliJ IDEA学习之四】IntelliJ IDEA常用插件

    版本:IntelliJIDEA2018.1.4 一.代码规范Alibaba Java Coding Guidelines:阿里巴巴代码规范检查插件FindBugs-IDEA:潜在 Bug 检查Sona ...

  5. ubuntu 17.04 下搭建深度学习环境

    .目前使用CPU即可,先不需要显卡配置 .使用pip3 安装深度学习框架 .要先安装pip3 #sudo apt install python3-pip https://blog.csdn.net/b ...

  6. Docker中nginx+tomcat实现负载均衡

    拉取tomcat镜像 docker pull tomcat 运行两个tomcat容器 docker run -d -p 8088:8080 --name tomcat8088 tomcat docke ...

  7. [转帖]pidstat 命令详解

    pidstat 命令详解 https://www.jianshu.com/p/3991c0dba094 pidstat -r -u -d -p 各种参数非常好用. pidstat 概述 pidstat ...

  8. 解决source insight 4.0 不识别.cc文件的问题

    Options -> File Type Options, File Filter 中加入,*.cc 参考了C++ Primer Plus第五版中文版 P8 C++实现 源代码的扩展名 UNIX ...

  9. 科大讯飞语音芯片xfs5152CE,分享遇到的一些坑

    首先 芯片手册的I2C地址是写地址,是8位的,真正的地址是7位地址,应该是0x40,最低位是读写位,读置1,为0x81,写置0,为0x80. 如果是模拟I2C倒无所谓,最坑的是我用的是寄存器,所以必须 ...

  10. ZYNQ笔记(5):软中断实现核间通信

    ZYNQ包括一个 FPGA 和两个 ARM,多个 ARM 核心相对独立的运行不同的任务,每个核心可能运行不同的操作系统或裸机程序,但是有一个主要核心,用来控制整个系统以及其他从核心的允许.因此我们可以 ...