深入浅出容器学习--Docker网络
一.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网络的更多相关文章
- 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化
<英雄联盟>在线服务运维之道 - InfoQ https://www.infoq.cn/article/running-online-services-riot/ 第一章 简 介 我是Jo ...
- Docker 网络模式详解及容器间网络通信
当项目大规模使用 Docker 时,容器通信的问题也就产生了.要解决容器通信问题,必须先了解很多关于网络的知识.Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜 ...
- docker 网络 实现
最近在学习docker网络相关的知识,关于网络这块儿记下来,以便review dokcer安装完成之后默认提供三种网络 bridge host none docker默认使用bridge brid ...
- Docker 网络原理
引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...
- 使用Docker的macvlan为容器提供桥接网络及跨主机通讯
对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人.相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍 ...
- Docker容器学习梳理 - 应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...
- Docker容器学习梳理 - 日常操作总结
使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...
- Docker容器学习与分享07
Docker容器网络 在分享06中学完了bridge网络,接着学习none网络和host网络. Docker在安装时会在host上默认创建三个网络,分别是bridge.host.null. [root ...
- docker容器学习笔记
docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障. docker组成: docker client.docker server.docker组件(镜像(image).容器(contain ...
- 5.Docker容器学习之新手进阶使用
@ 原文地址:点击直达 学习参考:https://yeasy.gitbooks.io/docker_practice/repository/registry.html 0x00 前言简述 描述: 本章 ...
随机推荐
- laravel-admin php artisan admin:install报错问题解决办法
问题描述:根据laravel-admin官方文档安装步骤,执行:php artisan admin:install 安装时报错. 其实是数据库创建特殊字符过长问题,laravel 5.4 改变了默认的 ...
- vSphere是什么,你了解么?
最近这两周都在学习VMware vSphere相关知识,昨天在做了一个项目后,VMware虚拟化之旅暂告一段落了.晚上一个人闲下来时回想了之前所学,忆起vSphere时,大脑一片空白... 我突然发现 ...
- Pydantic根校验器:构建跨字段验证系统
title: Pydantic根校验器:构建跨字段验证系统 date: 2025/3/24 updated: 2025/3/24 author: cmdragon excerpt: Pydantic根 ...
- C# 从零开始使用Layui.Wpf库开发WPF客户端
一.简介 最近需要开发一个桌面版的工具软件,之前用得更多的是Winform,作为一个全干工程师,我们也要兼顾下WPF,趁此机会再研究下开源控件库. MaQaQ:Winform真好用(有个HZHCont ...
- Windows 提权-手工枚举
本文通过 Google 翻译 Manual Enumeration – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别 ...
- spring 事务失效的 12 种场景
看这个:https://blog.csdn.net/hanjiaqian/article/details/120501741里面有12种失效场景以及如何解决. 在 spring 中为了支持编程式事务, ...
- DP——从入门到放弃 [Did Not Finish]
Part 00 dp 什么时候用? 首先,如果这题数据范围一眼 BFS/DFS/暴力/随机化 可以过,那么还写 dp 干什么 但是,但你决定这题要贪心时,我建议咱还是要看一下它对不对 整一个石子合并这 ...
- 【SpringCloud】Eureka服务注册与发现
Eureka服务注册与发现 补充 Eureka基础知识 什么是服务治理 Spring Cloud封装了Netlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与 ...
- 【Ubuntu】Ubuntu 24.04 配置镜像源
[Ubuntu]Ubuntu 24.04 配置镜像源 零.起因 最近在虚拟机中安装了个ubuntu-24.04-desktop-amd64,默认是国外的软件源,很慢,故替换到国内. 壹.替换 源地址( ...
- Kratos 下载与安装
前置条件 请确保已经安装好 go git protoc 然后获取 kratos 工具 go get -u github.com/go-kratos/kratos/tool/kratos 验证是否安装成 ...