一.Docker的网络概念

容器网络模型主要包含了三个概念:

  • network:网络,这里可以理解为一个Driver,是一个第三方网络栈,包含多种网络模式。

    • 单主机网络模式(none、host、bridge)
    • 多主机网络模式(overlay、macvlan、flannel)
  • sandbox:沙盒,它定义了容器内的虚拟网卡、DNS和路由表,是network namespace的一种实现,是容器的内部网络栈。

  • endpoint:端点,用于连接sandbox和network。



    这里,我们可以类比传统网络模型,将network比作交换机,sandbox比作网卡,endpoint比作接口和网线。

二.Docker的网络模式

这里网络模式包含:

  • host模式
  • none模式
  • bridge模式
  • container模式

2.1 host模式

这个相当于Vmvare中的桥接模式,与宿主机在同一个网络中,但是没有独立的IP地址。

Docker不会为容器创建独有的network namespace,使用宿主机默认的网络命名空间,共享一个网络栈。表现为容器内核宿主机的IP一致。这种模式适用于网络性能要求较高的场景,但网络隔离性不太好。

2.2 bridge模式

桥接模式,这里相当于Vmvare中的Nat模式。

Docker进程启动时会创建一个docker0网桥,docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡、路由、DNS、IP地址与iptables规则(也就是sanbox内容)

2.2.1 Docker完成Bridge网络配置详细说明

1.在主机上创建一堆虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

2.Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth45h6这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show查看。

[root@harbor ~]# brctl show
bridge name bridge id STP enabled interfaces
br-2ba1d6a2e994 8000.02426cb4a81a no veth6a79ace
br-8d4b6181687f 8000.0242d8d0780d no
docker0 8000.02424dbb4b07 no

3.从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

[root@harbor ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b59058aece1 docker-nexus3:v1 "sh -c ${SONATYPE_DI…" 2 months ago Up 2 months 0.0.0.0:81->8081/tcp nexus3
[root@harbor ~]# docker inspect 4b59058aece1
.......
"Networks": {
"nexus_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"4b59058aece1",
"docker_nexus3"
],
"NetworkID": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
"EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
}
]
# 查看nexus_default的bridge network
[root@harbor_reg ~]# docker network inspect nexus_default
[
{
"Name": "nexus_default",
"Id": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
"Created": "2020-08-24T10:20:21.947908808+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"4b59058aece184806ecc8d7d2c7c9dd93b24d7d120ea782d5c6909819725fe2d": {
"Name": "nexus3",
"EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "nexus",
"com.docker.compose.version": "1.23.2"
}
}
]

2.3 none模式

none模式可以说是桥接模式的一种特例,docker会为容器创建独有的network namespace ,但不会为这个命名空间准备虚拟网卡,IP地址,路由等,需要用户自己配置。这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

2.4 container模式

容器共享模式,这种模式是host模式的一种延伸,一组容器共享一个network namespace。对外表现为它们有共同的IP地址,共享一个网络栈。

三.Docker跨主机网络通讯

默认情况下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对许多集群应用来说非常不方便,如果可以让Docker容器直接使用自己的IP地址进行通信可以解决很多问题。这里按照实现原理可以分为:

  • 直接路由模式
  • overlay隧道模式(如flannel、ovs+gre)
  • 桥接模式(如pipework)

3.1 直接路由

直接在两侧主机增加静态路由来实现:

ip route add 172.16.1.0/24 via 192.168.20.1
ip route add 172.16.2.0/24 via 192.168.20.2

注意:centos系统需要卡其ip转发

vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

这里测试两台主机的容器跨主机通信可以参考此博文,相当详细:https://www.cnblogs.com/xiao987334176/p/10049844.html

3.2 overlay隧道模式

这里以flannel(flannel+udp或flannel+vxlan)来说明

flannel实现的容器的跨主机通信过程如下过程实现:

  • 每个主机安装并运行etcd和flannel
  • 在etcd中规划配置所有主机的docker0子网范围
  • 每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机的docker0网段不重复,并将结果(及本主机上的docker0子网信息和本主机IP的对应关系)存储到etcd中,这样etcd就保存了所有主机上的docker子网信息和本主机IP的对应关系。
  • 当需要与其它主机上的网络进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP)。
  • 将原始数据包封装在Vxlan或UDP数据包,IP层以outip为目的IP进行封装。
  • 由于目的IP是宿主机IP,因此路由是可达的。
  • Vxlan或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

3.3 桥接模式

这里可以通过静态指定容器的IP为宿主机同一个网络的形式来实现。这里不做具体说明,可以参考其它博文实现:https://blog.csdn.net/xpt211314/article/details/97375671

参考文档连接:

https://www.jianshu.com/p/22a7032bb7bd

https://zhuanlan.zhihu.com/p/82735394

深入浅出容器学习--Docker网络的更多相关文章

  1. 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化

    <英雄联盟>在线服务运维之道 - InfoQ https://www.infoq.cn/article/running-online-services-riot/ 第一章 简 介 我是Jo ...

  2. Docker 网络模式详解及容器间网络通信

    当项目大规模使用 Docker 时,容器通信的问题也就产生了.要解决容器通信问题,必须先了解很多关于网络的知识.Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜 ...

  3. docker 网络 实现

    最近在学习docker网络相关的知识,关于网络这块儿记下来,以便review dokcer安装完成之后默认提供三种网络  bridge host none  docker默认使用bridge brid ...

  4. Docker 网络原理

    引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...

  5. 使用Docker的macvlan为容器提供桥接网络及跨主机通讯

    对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人.相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍 ...

  6. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  7. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  8. Docker容器学习与分享07

    Docker容器网络 在分享06中学完了bridge网络,接着学习none网络和host网络. Docker在安装时会在host上默认创建三个网络,分别是bridge.host.null. [root ...

  9. docker容器学习笔记

    docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障. docker组成: docker client.docker server.docker组件(镜像(image).容器(contain ...

  10. 5.Docker容器学习之新手进阶使用

    @ 原文地址:点击直达 学习参考:https://yeasy.gitbooks.io/docker_practice/repository/registry.html 0x00 前言简述 描述: 本章 ...

随机推荐

  1. SSH登录:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    错误信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICAT ...

  2. NumPy学习10

    今天学习了3节: 18, NumPy副本和视图 19, NumPy字节交换 20, NumPy Matrix矩阵库 numpy_test10.py : import numpy as np ''' 1 ...

  3. Docker镜像介绍

    一.Docker镜像介绍 镜像是Docker的三大核心概念之一. Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认的镜像仓库下载(默认使用Docker Hu ...

  4. 小白必看的cmd简单代码!(图片看不到的可复制 粘贴到Typroa进行观看)

    打卡cmd的方法 直接window加r 输入cmd 在下方菜单 找到window标志,打开 输入命令提示符 更高级的cmd权限使用:右键命令提示符,点击"以管理员身份运行" 一些简 ...

  5. C# Socket教程入门,Socket的使用方法,附可执行Demo

    核心: 在服务器端和客户端的两个Socket实例,共同维持一个连接,而我们还需要一个服务端绑定了特定端口号的固定的serverSocket,用来监听远方clientSocket的申请,并为这个申请建立 ...

  6. C#多线程编程(二)线程池与TPL

    一.直接使用线程的问题 每次都要创建Thread对象,并向操作系统申请创建一个线程,这是需要耗费CPU时间和内存资源的. 无法直接获取线程函数返回值 无法直接捕捉线程函数内发生的异常 使用线程池可以解 ...

  7. 基于UPD的快速局域网聊天室

    UPD与TCP对比: UDP是无连接的协议,也不保证可靠交付,只在IP数据报服务之上增加了很少的功能,主要是复用和分用以及差错检测的功能.这适用于要求源主机以恒定速率发送数据,允许网络拥塞时丢失数据, ...

  8. CocoaPods+Gitee 制作私有库过程以及错误总结

    前言 最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候 ...

  9. QQ收藏self_xss漏洞复现(娱乐)

    漏洞影响范围:QQ安卓版本 <=V8.8.5.5570 漏洞存在位置:QQ我的收藏功能 我的qq版本 漏洞复现 1.点击头像>>我的收藏 2.点击右上角:"+" ...

  10. 【记录】ChatGPT|近期三次更新一览(更新至2023年2月3日)

      如果你还没有使用过ChatGPT,可以先看看我的上一篇文章:[记录]ChatGPT|使用技巧与应用推荐(更新至2023年2月8日).   1月11号晚上,ChatGPT突然很多人都无法登录,包括我 ...