一.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. Golang json转换时间格式

    在开发中,将时间转换成json时,默认是把时间转换为 RFC3339 格式 2018-01-14T21:45:54+08:00 这个貌似是GO的诞生的时间 先来看看time包中对格式的常量定义 con ...

  2. MAMP PRO教程

    简单使用 第一步 创建新主机,按主机表左下角的"+"按钮. 第二步 配置域名和项目地址 第三步 选择你要使用的web服务器 第四步 配置URL重写规则 第五步 检查端口号 第六步 ...

  3. WebKit Inside: CSS 的匹配原理

    相关文章 WebKit Inside: CSS 样式表的解析 WebKit Inside: CSS 样式表的匹配时机 WebKit Inside: Acitvie 样式表 当WebView解析完所有外 ...

  4. 搭建自己的OCR服务,第一步:选择合适的开源OCR项目

    一.OCR是什么? 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程. 亦即将图像中的文字进行识别 ...

  5. Git安装与Git GUI的使用

    一.下载安装包 官网:https://git-scm.com/downloads(下载慢) 或 https://pc.qq.com/search.html#!keyword=git,本人使用的是Git ...

  6. FastAPI中实现动态条件必填字段的实践

    title: FastAPI中实现动态条件必填字段的实践 date: 2025/04/03 00:06:20 updated: 2025/04/03 00:06:20 author: cmdragon ...

  7. MaxKB web 站点知识库选择器的花样玩法

    背景:MaxKB 创建知识库支持"web 站点"的这种形式,但是很多同学不知道怎么录入选择器来针对性的获取某一部分内容. 1. 选择器作用 选择器用于定位网页中特定的元素,以便获取 ...

  8. 快速定位MySQL 8.0中的慢查询语句详细步骤

    步骤一.启用慢查询日志 慢查询日志是MySQL记录执行时间超过指定阈值的SQL语句 配置慢查询日志 在MySQL配置文件(如my.cnf或my.ini)中设置以下参数: slow_query_log: ...

  9. nginx代理静态页面添加二级目录

    location /wash { # root html; alias /home/cxq/wash-html/dist; index index.html index.htm; try_files ...

  10. eolinker响应预处理/规则校验:js正则写法注意事项

    JS的正则表达式的写法,需要对原有正则表达式进行适当加工才可正常使用 如:(正则表达式规则取到"/did1280064/Login") 常规的正则表达式为"did(\d+ ...