容器网络简介

简介: 容器网络简介

今天我们来简单谈一谈容器的网络知识,这其实是一个很有意思且非常重要的知识点!

在容器内,可以看见的“网络栈”其实就是隔离在该容器内 Network Namespace 当中的,其中就包括了网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和iptables 规则。这些要素,就构成了网络请求的基本环境。

host 模式

对于 docker 容器来说,可以在启动的时候声明直接使用宿主机的网络栈,即不开始 Network Namespace

docker run -d -net=host --name nginx-host nginx

像上面的这种启动方式,会直接监听宿主机的80端口,虽然这种情况下,可以为容器提供良好的网络性能,但也不可避免的引入共享网络资源的问题,比如端口冲突等。

所以在大多数情况下,我们都希望容器进程能使用自己的 Network Namespace 里的网络栈,即拥有自己的 IP 地址和端口。

Network Namespace 模式

那么在介绍这种网络模式前,我们需要首先解决一个问题,就是这个被隔离的容器进程,该怎么和其他 Network Namespace 里的容器进程进行交互呢?

为了解决这个问题,我们可以把每一个容器看做一台主机,那么现在的问题就变成了如何让两台主机进行通信,其实解决方案就是把两台主机分别连接到一台交换机上就可以了。

那么在 Linux 系统中,能够起到虚拟交换机作用的网络设备,就是网桥(Bridge)。他是一个工作在数据链路层的设备,主要功能是根据 MAC 地址学习来将数据包转发到网桥的不同端口上。

为了实现上面的目的,Docker 项目会默认在宿主机上创建一个名叫 dokcer0 的网桥,凡是连接在 docker0 网桥上的容器,都可以通过它来进行通信。

那么下面我们就来看看这个 docker0 又是如何工作的,是怎么实现网桥的作用的呢?

在这里使用到了一个虚拟设备:Veth Pair,它的特点就是被创建出来后,总是以两张虚拟网卡(Veth Peer)的形式成对出现,并且从其中一个“网卡”发出的数据包,直接可以出现在与它对应的另一张“网卡”上,即使这两个网卡在不同的 Network Namespace 当中。

下面我们来用一个例子来具体看看这个过程

我们启动一个 nginx-1 的容器

docker run -d --name nginx-1 nginx

然后我们进入到该容器,查看一下它的网络设备

# 宿主机
docker exec -it nginx-1 sh
# 容器中
#ifconfig


可以看到,在容器里有一张 eth0 的网卡,它就是 Veth Pair 设备在容器当中的一端,而通过 route 命令可以看到,容器的路由表里,eth0 网卡是这个容器里的默认路由设备:所有对 172.17.0.0/16 网段的请求,都会被交给 eth0 来处理。

而这个 Veth Pair 设备的另一端,就在宿主机上。

# 宿主机
ifconfig


也可以看到,在宿主机上,Veth Pair 设备是一张虚拟网卡,叫做 vetha59a54c。

那么我们如何来确定这张虚拟网卡就是对应于容器中的 eth0 呢,我们可以通过如下的两个命令来确认

如果此时我们再在宿主机上启动一个容器,那么这两个容器默认一定是互通的,其实原理也很简单,因为在容器中发出的数据包,默认都会通过 Veth Pair 设备出现在 docker0 网桥上,因为这是一个网桥,所有“插在”其上面的设备都是互通的,所以两个容器默认网络也是互通的。

以上,就是最为基本的容器网络知识,当然,对于 K8S 项目,会存在更加复杂的网络插件,我们在后面的文章中在慢慢介绍吧!


相关文章
|
4月前
|
存储 Linux 容器
【Container App】在容器中抓取网络包的方法
本文介绍在Azure Container App中安装tcpdump抓取网络包,并通过Storage Account上传抓包文件的方法。内容包括使用curl和nc测试外部接口连通性、长Ping端口、安装tcpdump、抓取网络包、以及通过crul命令上传文件至Azure Storage。适用于需要分析网络请求和排查网络问题的场景。
169 0
|
5月前
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
|
11月前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
6月前
|
网络协议 Docker 容器
使用网络--容器互联
使用网络--容器互联
150 18
|
6月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
213 0
|
12月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
350 61
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
11月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1051 7
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
网络协议 Ubuntu 前端开发
好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题
本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。
602 1

热门文章

最新文章