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. 洛谷p3916图的遍历题解

    题面 思路: 反向建边,dfs艹咋想出来的啊 倒着遍历,如果你现在遍历到的这个点已经被标记了祖先是谁了 那么就continue掉 因为如果被标记了就说明前面已经遍历过了 而我们的顺序倒着来的 前边的一 ...

  2. Codeforces Global Round 3 题解

    这场比赛让我上橙了. 前三题都是大水题,不说了. 第四题有点难想,即使想到了也不能保证是对的.(所以说下面D的做法可能是错的) E的难度是 $2300$,但是感觉很简单啊???说好的歪果仁擅长构造的呢 ...

  3. Spring Boot 知识笔记(创建maven项目、HTTP接口)

    一.使用Maven手工创建SpringBoot应用(IDEA) 1.  点击File——New——Project——Maven——Next,填写相关信息,创建项目. 2.  在pom.xml中添加相关 ...

  4. 我对网络IO的理解

    Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read).写(write),socket在Linux系统被抽象为流( ...

  5. Kafka Offset Monitor页面显示空白

    下载包:https://github.com/Morningstar/kafka-offset-monitor.git 解决:jar包内\KafkaOffsetMonitor-assembly-0.2 ...

  6. java 执行 shell脚本通过mysql load data导入数据

    1:load_data_test.sh #!/bin/sh load_data_log=/mnt/load_data_test/load.log load_sql="LOAD DATA LO ...

  7. redis生成分布式id方案

    分布式Id - redis方式   本篇分享内容是关于生成分布式Id的其中之一方案,除了redis方案之外还有如:数据库,雪花算法,mogodb(object_id也是数据库)等方案,对于redis来 ...

  8. tomcat宕机自动重启脚本

    #!/bin/bash# 获取tomcat进程ID /usr/share/tomcatTomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat'|grep -v ...

  9. VS web停止调试后关闭浏览器

  10. 史上最全HashMap红黑树解析

    HashMap红黑树解析 红黑树介绍 TreeNode结构 树化的过程 红黑树的左旋和右旋 TreeNode的左旋和右旋 红黑树的插入 TreeNode的插入 红黑树的删除 TreeNode的删除节点 ...