news 2026/7/15 19:17:38

Docker--认识Docker网络

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker--认识Docker网络

Network Namespace

Network Namespace 是Linux用于实现网络虚拟化的重要功能,他能创建多个隔离的网络空间,每个独立网络空间内的防火墙、网卡、路由表、邻居表、协议栈都是独立的。

不管是虚拟机还是容器,当运行在独立的命名空间时,就像是一台独立的主机一样。

现在的需求是:创建2个Network Namespace,然后连通他们。

创建2个命名空间

创建网络接口veth pair

如果要让两个命名空间连通,需要用到虚拟设备接口技术veth pair。该技术需要一对网络接口分别置于两个命名空间中。

下面命令用来创建一对网络接口veth-ns1 和 veth-ns2

ip link add veth-ns1 type veth peer name veth-ns2

此时通过ip link 查看当前网络地址情况,看到新增了两个胡同的veth pair,他们都有MAC地址,但是状态都是DOWN,都没有IP。

命名空间添加veth接口

通过ip link set 命令,将刚才两个接口分配给两个命名空间

ip link set veth-ns1 netns ns1 ip link set veth-ns2 netns ns2

此时分别在两个命名空间中执行 ip link 命令,可以看到他们都新增了网络接口

为veth 接口分配IP

通过ip netns exec命令,为每个命名空间添加IP

ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth-ns1 ip netns exec ns2 ip addr add 192.168.1.2/24 dev veth-ns2

此时通过在ns1与ns2中运行ip a命令,可以看到接口都有ip了

启动veth接口

通过ip link set dev [接口] up 来启动指定的网络接口。

ip netns exec ns1 ip link set dev veth-ns1 up ip netns exec ns2 ip link set dev veth-ns2 up

相互ping

CNM

docker网络架构由三部分组成:CNM、Libnetwork 与Driver。

CNM (Container Network Model,容器网络模型):是一种网络连接的解决方案,是一种设计规范、设计标准,其规定了Docker网络的基础组成要素。

CNM中定义了三个基本要素:沙盒Sandbox,终端Endpoint 与网络Network。

  • 沙盒:一个独立的网络栈,包括以太网接口、端口号、路由表、DNS配置等。LInux Network Namespace 是沙盒的标准实现。
  • 终端:虚拟网络接口,负责创建连接,即将沙盒连接到网络上,一个终端只能接入一个网络。
  • 网络:802.1d网桥的软件实现,是需要交互的终端的集合。

Libnetwork

Libnetwork 是开源的、go语言编写、跨平台的CNM的标准实现。

Libnetwork 除了实现CNM的三个组件,还实现了本地服务发现、容器负载均衡、网络控制层与管理层功能。

Driver

不同的网络类型对应不同的底层Driver,这些Driver负责在主机上真正实现需要的网络功能,例如创建veth pair 设备等。

无论哪种网络类型。工作方式都是类似的。

  1. 调用Docker 引擎的API 发出请求

  2. Libnetwork 做出框架性处理

  3. 将请求转发给对应的Driver。

通过docker network ls 命令可以查看当前主机所连接的网络及网络类型

bridge 网络

bridge 网络 也称单机桥接网络,是Docker 默认的网络模式。该模式只能存在单个Docker主机上,只能连接所在Docker主机上的容器。

docker0网桥

bridge网络 模式中有个默认的虚拟网桥docker0,通过ip a 或者ifconfig 命令可以查看

docker0网桥的工作原理

在Linux主机上,Docker 的bridge 网络在创建时会创建一个默认网桥docker0。

容器和网桥通过veth pair 技术连接;

网桥与外网通过网络地址转换NAT技术连接,就是将通信的数据包中的内网地址转换为外网地址。

查看网络连接情况

通过 docker network inspect 命令查看当前bridge网络的连接情况。

Containers 中可以看到bb1 和bb2 两个容器,这两个容器和宿主机就是三个完全独立的Network Namespace。

查看宿主机接口

发现除了回环地址lo,本地网卡ens33,网桥docker0外,还有两个veth网络接口。

这两个veth就是由Libnetwork 生成的veth pair中宿主机的EndPoint。

  • vethxxx@if4:表示第5个接口,用来连接外部的第四个接口
  • vethxxx@if6:表示第7个接口,用来连接外部的第六个接口
查看容器接口

可以看到两个容器都包含eth0接口。

bb1的接口4,即eth@if5 来连接宿主机的第5个接口

bb2的接口6,即eth@if7 来连接宿主机的第7个接口

查看网桥连接

先安装网桥的工具包bridge-utils

yum -y install bridge-utils

可以看到网桥有两个接口。

创建网络

通过docker network create 命令可以创建指定名称和类型的网络

docker network create -d bridge bridge2

-d : 指定网络类型。

bridge2是网络名称。

通过docker network ls可以看到刚才创建的网络。

创建容器指定网络

创建一个新的BusyBox容器bb3 ,然后连接在新建的bridge2 网络上。

docker run -d --name bb3 --network bridge2 /bin/sh -c "while true; do sleep 3600; done"

通过--network 指定要连接到的网络,如果不指定,就连接默认的。

查看新建的网络详情

可以看到bb3容器已经连上了。

此时查看宿主机网络接口和bb3容器网络接口,发现他们的接口都对应上了。

容器连接到指定网络

现将容器bb2连接到bridge2 上。可以使用docker network connect 命令

docker network connect bridge2 bb2

此时bb2容器连接在两个网络上,具有两个IP

此时容器bb2 和bb3 可以ping 通

但是bb3 和bb2的另一个网段是ping不通的。

容器除了可以直接ping IP外,还可以直接ping 容器名称

docker exec bb3 ping bb2
创建定向连接容器

自定义的bridge网络,可以通过容器名互相ping。但是默认的bridge不行。

如果想在默认的bridge网络上通过容器名称进行连接,则在创建容器时通过--link 指定。

docker run -d --name bb4 --link bb1 busybox /bin/sh -c "while true; do sleep 3600; done"

此时bb4 可以用容器名称ping bb1

docker exec bb4 ping bb1

注意:bb1 无法通过容器名称ping bb4 ,因为--link 是一种定向连接,带有指向性和方向性。

创建共享网络命名空间容器

创建容器时可以指定其与已经存在的容器共享 Network Namespace 。但要求已存在容器必须采用bridge模式。

docker run -d --name bb1-1 --network container:bb1 busybox /bin/sh -c "while true; do sleep 3600; done"

此时这两个容器的网络接口完全相同。

none网络

none网络,即没有网络。容器仍是一个独立的Network Namespace ,但是没有网络接口,没有IP。

创建none网络容器

在docker run 命令中,通过--network none 指定没有网络

docker run -d --name bb5 --network none busybox /bin/sh -c "while true; do sleep 3600; done" # 查看容器详情,发现没有IP,没有网关,没有MAC地址 docker inspect bb5 # 查看网络接口,发现只有一个回环地址lo,没有其他接口 docker exec bb5 ip a

host网络

host网络:与宿主机host共用一个Network Namespace。该网络类型的容器没有独立的网络空间,没有独立IP。全部与host共用。

创建host网络容器

通过--network host指定为host网络。

docker run -d --name bb6 --network host busybox /bin/sh -c "while true; do sleep 3600; done" # 查看host网络详情,发现bb6 连接在该网络上,但是没有IP、MAC,并且该网络没有网关Gateway。 # 因为该网络模式相当于没有网络,容器与宿主机共用Network Namespace,不需要网络连接。 docker network inspect host

关于端口映射

由于容器和宿主机共用一个Network Namespace。所以无论IP还是Port ,容器和宿主机都是相同的。所以容器中的Port 不存在映射问题,host中的Port 和容器中的Port相同。

# 运行tomcat docker run --name mytom --network host -dp 8081:8080 tomcat:8.5.32

上面虽指定了端口映射,但是网络是host类型,所以端口映射不起作用。

此时仍需要通过8080端口访问。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 5:15:19

FMEA×控制计划×PPAP自动联动,这才是研发管理的天花板-全星研发项目管理APQP软件系统#APQP #PLM #汽车电子 #芯片研发 #新能源 #项目管理软件

FMEA控制计划PPAP自动联动,这才是研发管理的天花板-全星研发项目管理APQP软件系统 做汽车部件、芯片、新能源、新材料的研发人,是不是有这种感觉:通用PLM用起来各种别扭🤯 文档管得了,流程控不住;BOM看得见…

作者头像 李华
网站建设 2026/7/13 5:15:43

MSP430 ADC模块深度解析:从寄存器配置到低功耗设计实战

1. ADC模块的核心价值与设计哲学在嵌入式系统设计的江湖里,ADC(模数转换器)模块的地位,就好比一个顶尖厨师手中的那把主厨刀。它不一定是系统里最复杂的部分,但绝对是决定最终“菜品”品质——也就是数据采集精度与可靠…

作者头像 李华
网站建设 2026/7/13 5:15:40

| LiveMoments 用参考图引导的扩散模型提升重选封面帧画质

常使用中,用户往往希望从这段视频中重新选择某一帧作为封面,以捕捉更理想的表情、动作或时机。然而,在实际使用中,问题也随之显现:由于视频本身分辨率低、压缩严重,重选的封面帧往往画质不足,难…

作者头像 李华
网站建设 2026/7/13 5:15:39

如何通过4个维度全面提升Windows系统性能?

如何通过4个维度全面提升Windows系统性能? 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN 你…

作者头像 李华
网站建设 2026/7/13 5:15:38

从TPA3111D1评估板到自主设计:D类音频功放实战指南

1. 项目概述:从一块评估板到你的第一个D类功放设计如果你正在为一个小型音箱、便携式播放器或者任何需要紧凑、高效音频放大的项目寻找解决方案,那么D类音频放大器几乎是你绕不开的选择。而当你拿到一颗像德州仪器(TI)TPA3111D1这…

作者头像 李华
网站建设 2026/7/14 15:44:53

百度网盘秒传转存终极指南:3分钟掌握全平台快速分享技巧

百度网盘秒传转存终极指南:3分钟掌握全平台快速分享技巧 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 百度网盘秒传转存工具是一款让你…

作者头像 李华