容器网络简介

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 今天我们来简单谈一谈容器的网络知识,这其实是一个很有意思且非常重要的知识点!在容器内,可以看见的“网络栈”其实就是隔离在该容器内 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


image.png

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

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

# 宿主机
ifconfig


image.png

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

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

image.png

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

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

相关文章
|
9天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
26天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
81 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
17天前
|
缓存 Java 应用服务中间件
OpenResty 简介及其容器化实践
【9月更文挑战第2天】OpenResty 是一个基于 Nginx 与 Lua 的高性能 web 平台,它扩展了 Nginx 的功能,使之能够处理更加复杂的业务逻辑。通过集成 Lua 脚本,OpenResty 可以实现高效的请求处理、缓存、负载均衡等功能。
36 8
|
25天前
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。
|
26天前
|
存储 Unix 虚拟化
Docker容器简介
Docker是一种轻量级的虚拟化技术,它通过容器化应用,提高了硬件资源利用率,简化了应用的部署、运输和运行,且与虚拟机相比,具有更快的交付速度和更低的资源消耗。
33 2
|
1月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
17天前
|
Java 应用服务中间件 API
谈谈OpenResty 简介及其容器化实践
【9月更文挑战第2天】OpenResty 是一个基于 Nginx 与 Lua 的高性能 web 平台,它扩展了 Nginx 的功能,使之能够处理更加复杂的业务逻辑。通过集成 Lua 脚本,OpenResty 可以实现高效的请求处理、缓存、负载均衡等功能。
21 0
|
20天前
|
Linux 调度 Docker
容器网络概述
【9月更文挑战第9天】容器技术利用如命名空间(namespace)和控制组(cgroup)等技术创建隔离环境,实现资源限制与独立运行。命名空间避免命名冲突,cgroup则能对CPU、内存等资源进行限制。容器状态可通过镜像保存并标准化,确保在任何环境中都能复现相同状态。
|
29天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)简介
【8月更文挑战第30天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将深入浅出地介绍深度学习的一个重要分支——卷积神经网络(CNN),并探讨其如何在图像识别等领域大放异彩。通过实例,我们将一窥CNN的神秘面纱,理解其背后的原理,并探索如何利用这一工具解锁数据的深层价值。
|
29天前
|
Kubernetes Cloud Native 网络安全
云原生入门指南:Kubernetes和容器化技术云计算与网络安全:技术融合的新篇章
【8月更文挑战第30天】在云计算的浪潮中,云原生技术如Kubernetes已成为现代软件部署的核心。本文将引导读者理解云原生的基本概念,探索Kubernetes如何管理容器化应用,并展示如何通过实践加深理解。