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. 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(Wi-Fi模块SSL连接MQTT)

    5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(配置MQTT的SSL证书,验证安全通信) 首先确定自己的固件打开了SSL,升级篇里面的固件我打开了SSL,如 ...

  2. P1553 数字反转(升级版)

    Emma,关于这道题,我..不想说啥子,也就做了它一个下午左右吧(原由:本人太菜) 补充一个知识点goto语句: 这个东西特别的好用,可以直接无条件调到冒号后面的语句,进行操作. 举个例子: #inc ...

  3. 【border相关】【P3426】 [POI2005]SZA-Template

    [border相关][P3426] [POI2005]SZA-Template Description 给定一个字符串 \(S\),要求一个最短的字符串 \(T\),使得 \(S\) 可以由 \(T\ ...

  4. mysql 包含查找

    #从表iot_company选择,company_name字段包含10091015的项SELECT id FROM iot_company WHERE company_name LIKE " ...

  5. java web开发入门三(Hibernate)基于intellig idea

    Hibernate 1.开发流程 项目配置好后的结构: 1.下载源码: 版本:hibernate-distribution-3.6.0.Final 2.引入hibernate需要的开发包(3.6版本) ...

  6. Linux上安装git并在gitlab上建立对应的项目

    1.CentOS上面安装git我所用的CentOS为CentOS6.5,其他版本没有测试. yum install git 安装之后查看git版本信息 git --version 2.配置git信息g ...

  7. Linux查看端口使用情况

    1.netstat -tunlp,查看已使用的端口 2.netstat -tunlp | grep 8080,查询指定端口使用情况 3.netstat命令无法使用需要安装net-tools yum i ...

  8. 记一次网络故障——pod间无法通信

    一.背景 集群是二进制部署 部署完成后一起正常,各种资源对象均可正常创建. 部署应用后发现无法跨节点通信,且pod的ip都是172.17.0.0段的 二.排查过程层 查看节点路由,发现docker0网 ...

  9. Python内网渗透扫描器Ladon

    Ladon Scanner For Python PyLadon 目前python版功能较少,无论在Windows还是Linux系统性能以及速度均也比不上Ladon.exe 唯一的优点是跨平台,后续会 ...

  10. [原创]小巧免杀的端口转发工具PortTran(附.net源码)

    0x001 简介 PortTran by k8gege.NET版端口转发工具,支持任意权限下转发 0x002 背景工具在2016年左右写的,当时某个内网不知何原故LCX用不了 由于Win2003才刚停 ...