怎么从传统的Linux网络视角理解容器网络?《三》

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 前二篇文章已经发布,请自行查看,否则好像看不大懂的

让外部世界可以访问容器(端口发布)

大家都知道可以将容器端口发布给一些(或者所有)主机的接口。但是端口发布到底是什么意思呢?

假设容器内运行着服务器:

$ sudo nsenter --net=/var/run/netns/netns0   
$ python3 -m http.server --bind 172.18.0.10 5000

如果我们试着从主机上发送一个HTTP请求到这个服务器,一切都工作得很好(root命名空间和所有容器接口之间有链接,当然可以连接成功):

# 从 root 命名空间   
    $ curl 172.18.0.10:5000   
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">   
    # ... 忽略无关行 ...

但是,如果要从外部访问这个服务器,应该使用哪个IP呢?我们知道的唯一IP是主机的外部接口地址eth0:

$ curl 10.0.2.15:5000   
curl: (7) Failed to connect to 10.0.2.15 port 5000: Connection refused

因此,我们需要找到方法,能够将到达主机eth05000端口的所有包转发到目的地172.18.0.10:5000。又是iptables来帮忙!

# 外部流量    
    sudo iptables -t nat -A PREROUTING -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000   
    # 本地流量 (因为它没有通过 PREROUTING chain)   
    sudo iptables -t nat -A OUTPUT -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000

另外,需要让iptables能够在桥接网络上截获流量:

sudo modprobe br_netfilter

测试:

curl 10.0.2.15:5000   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">  
      # ... 忽略无关行 ...

理解Docker网络驱动

我们可以怎么使用这些知识呢?比如,可以试着理解Docker网络模式。

从--network host模式开始。试着比较一下命令ip link和sudo docker run -it --rm --network host alpine ip link的输出。它们几乎一样!在host模式下,Docker简单地没有使用网络命名空间隔离,容器就在root网络命名空间里工作,并且和主机共享网络栈。

下一个模式是--network none。sudo docker run -it --rm --network host alpine ip link的输出只有一个loopback网络接口。这和之前创建的网络命名空间,没有添加veth设备前很相似。

最后是--network bridge(默认)模式。这正是我们前文尝试创建的模式。大家可以试试ip 和iptables命令,分别从主机和容器的角度观察一下网络栈。

rootless容器和网络

podman容器管理器的一个很好的特性是关注于rootless容器。但是,你可能注意到,本文使用了很多sudo命令。说明,没有root权限无法配置网络。Podman在root网络上的方案和Docker非常相似。但是在rootless容器上,Podman使用了slirp4netns项目:

从Linux 3.8开始,非特权用户可以创建user_namespaces(7)的同时创建network_namespaces(7)。但是,非特权网络命名空间并不是很有用,因为在主机和网络命名空间之间创建veth(4)仍然需要root权限。

slirp4netns可以用完全非特权的方式将网络命名空间连接到Internet上,通过网络命名空间里的一个TAP设备连接到用户态的TCP/IP栈(slirp)。

rootless网络是很有限的:“从技术上说,容器本身没有IP地址,因为没有root权限,无法实现网络设备的关联。另外,从rootless容器ping是不会工作的,因为它缺少CAP_NET_RAW安全能力,而这是ping命令必需的。”但是它仍然比完全没有连接要好。

结论

本文介绍的组织容器网络的方案仅仅是可能方案的一种(可能是最为广泛使用的一种)。还有很多别的方式,由官方或者第三方插件实现,但是所有这些方案都严重依赖于Linux网络虚拟化技术。因此,容器化可以认为是一种虚拟化技术。

目录
相关文章
|
21天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
1月前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
54 4
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
94 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
1月前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
22 1
|
10天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
2月前
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
34 2
|
2月前
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
28天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
48 0
|
1月前
|
Linux 调度 Docker
容器网络概述
【9月更文挑战第9天】容器技术利用如命名空间(namespace)和控制组(cgroup)等技术创建隔离环境,实现资源限制与独立运行。命名空间避免命名冲突,cgroup则能对CPU、内存等资源进行限制。容器状态可通过镜像保存并标准化,确保在任何环境中都能复现相同状态。