Docker技术概论(5):Docker网络

Docker技术概论(5)
Docker网络

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/136371753
HuaWei:https://bbs.huaweicloud.com/blogs/422897

【介绍】:本文介绍Docker 网络的基本概念和原理与用法。理解Docker网络相关概念是有效使用Docker 和构建现代化应用的基础。无论是开发新应用还是迁移现有应用到容器环境,Docker 网络都是实现应用高效运行的关键因素之一。

在这里插入图片描述


上一节:《 Docker CLI 基本用法解析 》 | 下一节:《 Docker File 基础与应用 》


1. 概述

Docker 网络是 Docker 容器技术的一个核心组成部分,它负责管理容器之间以及容器与外部世界之间的通信。Docker 网络的设计允许用户高效地配置和管理容器的网络连接,支持容器之间的隔离和通信,同时还能提供必要的安全性和可扩展性。

在 Docker 中,每个容器都可以被视为一个独立的网络实体,具有自己的 IP 地址、网络接口和路由规则。Docker 网络为这些容器提供了各种连接选项,包括桥接、覆盖、主机网络等模式,使得容器的部署和管理更加灵活。

1.1 Docker 网络类型

  1. 桥接网络(Bridge Network):这是 Docker 容器默认使用的网络类型。每个独立的容器都会连接到一个内部网络的私有网桥。
  2. 主机网络(Host Network):在这种模式下,容器共享主机的网络命名空间,直接使用主机的网络接口。
  3. 覆盖网络(Overlay Network):用于 Docker Swarm 集群中,支持不同 Docker 守护进程上的容器之间的网络连接。
  4. Macvlan 网络:使得容器可以直接映射到物理网络,它们拥有独立的 MAC 地址。
  5. None 网络:在这种模式下,容器有自己的网络命名空间,但不配置任何网络接口,通常用于需要手动配置网络的场景。

1.2 网络驱动

Docker 网络驱动负责实现不同的网络类型。Docker 提供了多种内置的网络驱动,如 bridge、overlay、host 和 macvlan。用户也可以安装和使用第三方网络驱动。

1.3 容器网络模式

  • 桥接模式:默认模式,容器拥有独立的网络命名空间。
  • 主机模式:容器共享主机的网络堆栈,不进行网络隔离。
  • 无网络模式:容器有自己的网络堆栈,但不配置任何网络接口。
  • 覆盖模式:在 Docker Swarm 环境中使用,支持跨多个 Docker 主机的容器通信。

1.4 网络配置和管理

Docker 网络的配置和管理通常通过 Docker 命令行界面进行。例如,你可以使用 docker network create 创建新网络,docker network ls 列出网络,docker network connect 和 docker network disconnect 连接或断开容器与网络的连接。

1.5 安全性和隔离

Docker 网络提供了容器之间的隔离机制,增加了安全性。例如,位于不同网络的容器默认无法相互通信,除非显式配置网络规则来允许这种通信。

Docker 容器在网络方面的一些概念和虚拟机是相似的,VMWare虚拟机中就有专门的UI页面来进行相关设置,可以类比理解:

在这里插入图片描述

接下来,详细介绍几种默认的Docker网络驱动。

2. 桥接网络(bridge)

2.1 基本概念

类似于 VMware 虚拟机中的 “桥接 模式”,Docker 的桥接网络(bridge network)是 Docker 容器使用的默认网络模式。在这种模式下,Docker 宿主机会创建一个虚拟的网络桥接,允许容器通过这个桥接与外部网络通信。这种模式为每个容器提供了与主机隔离的网络环境,容器之间可以相互通信,同时也能与外部网络进行交互。

在 Docker 中,桥接网络提供了与 VMware 的桥接模式类似的功能,允许容器直接连接到物理网络,并且具有独立的 IP 地址。同时,Docker 的端口映射功能则在某种程度上类似于 VMware 的 NAT 模式,它允许外部访问映射到宿主机端口的容器服务。Docker 网络的这些特性使得它非常适合于容器化环境,为容器提供了灵活性和隔离性。

2.2 工作原理

在 Docker 中启动容器时,如果没有指定网络模式,它默认连接到 Docker 主机上的一个桥接网络。这个桥接网络起初是空的,当容器连接到它时,Docker 会为每个容器分配一个 IP 地址和一个网络接口,并将这个接口连接到虚拟桥接上。

Docker 的桥接网络通常使用 NAT(网络地址转换)来连接到物理网络,使得容器能够通过宿主机的 IP 地址访问外部网络。

2.3 创建和管理

虽然 Docker 默认创建了一个名为 bridge 的桥接网络,但用户也可以创建自定义的桥接网络。自定义桥接网络提供了更好的隔离和网络配置选项。

1.创建自定义桥接网络

使用以下命令创建一个新的桥接网络:

docker network create --driver bridge my_bridge_network

这与 VMware 虚拟机的多个网络适配器类似。

2.连接容器到桥接网络

在启动容器时,可以使用 --network 选项指定容器连接到特定的桥接网络:

docker run -d --name my_container --network my_bridge_network my_image

这类似于 VMware 中为虚拟机指定特定的网络适配器。

3.查看网络信息

要查看 Docker 网络的详细信息,包括哪些容器连接到特定网络,可以使用以下命令:

docker network inspect my_bridge_network

类似于在 VMware 中查看虚拟网络的详细配置。

2.4 网络隔离和通信

桥接网络不仅为容器提供了与宿主机的网络隔离,还可以在容器之间建立隔离的网络环境。只有连接到同一桥接网络的容器才能相互通信,这为构建安全的多容器应用提供了基础。

2.5 端口映射信

桥接网络模式中,可以通过端口映射(Port Mapping)将容器内的端口映射到宿主机的端口,从而使外部网络能够访问容器内的应用。例如,如果你的容器内运行了一个 Web 服务器,监听容器的 80 端口,你可以将其映射到宿主机的 8080 端口:

docker run -d -p 8080:80 my_web_server_image

Docker 的桥接网络为容器提供了一个简单有效的方式来与外部网络进行交互,同时保持了网络隔离。通过创建自定义桥接网络,用户可以实现更细粒度的网络管理和隔离策略。桥接网络是 Docker 网络中最常用的一种模式,适用于大多数标准的容器部署场景。

3. 主机网络(host)

Docker 的主机网络模式提供了一种高效的网络解决方案,尤其适用于对网络性能有高要求的应用。但由于其较低的网络隔离级别和潜在的安全风险,需要谨慎使用。主机网络模式是 Docker 网络选项中的一种高级功能,适合于特定的使用场景和高级用户。

3.1 基本概念

在 Docker 中,主机网络(host network)模式允许容器共享宿主机的网络命名空间。这意味着容器不会像在桥接或覆盖网络模式中那样获得自己的网络接口,而是直接使用宿主机的网络接口。当容器运行在主机网络模式下时,它能够无障碍地访问外部网络,同时也能够更高效地进行网络通信,因为不需要通过 Docker 的网络堆栈来转发数据。

3.2 工作原理

主机网络模式下,容器将不会获得独立的 IP 地址。容器的网络堆栈将直接映射到宿主机上,容器内的网络服务可以直接绑定到宿主机的 IP 地址和端口上。这种模式通常用于需要进行大量网络操作或需要提供高性能网络服务的场景。

3.3 使用场景

  • 性能敏感型应用:当容器化应用需要最大化网络性能时,使用主机网络是一个好选择。因为它消除了网络虚拟化带来的额外开销。
  • 端口冲突:在主机网络模式下,容器可以直接使用宿主机的端口,避免了端口映射可能带来的端口冲突问题。
  • 网络监控和管理:对于需要进行网络监控和管理的工具,主机网络模式能够提供更广泛的网络可视性和控制能力。

3.4 如何使用

要在 Docker 中使用主机网络模式,可以在运行容器时使用 --network host 选项。例如:

docker run -d --network host --name my_host_network_container my_image

这个命令会启动一个容器,它将直接使用宿主机的网络堆栈。

5 注意事项

  • 安全风险:使用主机网络模式会降低网络隔离级别,可能会增加安全风险。需要仔细管理容器对宿主机网络资源的访问。
  • 端口管理:因为容器可以直接绑定到宿主机的端口,所以必须确保容器不会尝试使用已被宿主机其他服务占用的端口。
  • 跨主机通信:主机网络模式不适用于需要跨多个宿主机通信的容器,这种情况下更适合使用覆盖(overlay)网络模式。

4. 覆盖网络(Overlay Network)

覆盖网络是 Docker 网络解决方案中针对分布式应用和服务的一种方案。它提供了跨多主机容器通信的能力,特别适合用于 Docker Swarm 集群环境中。虽然存在一定的网络性能开销,但它的灵活性和跨主机通信能力使其成为大规模容器部署的理想选择。

4.1 基本概念

覆盖网络(Overlay Network)是 Docker 的一个高级网络类型,主要用于 Docker Swarm 集群环境中。它允许不同 Docker 主机上的容器相互通信,无论它们的物理位置如何。覆盖网络通过在宿主机之间创建一个虚拟网络层,来连接分布在不同节点上的容器。

4.2 工作原理

覆盖网络使用网络驱动(如 VXLAN)在宿主机之间建立一个虚拟网络。这个网络工作在现有的物理网络之上,容器之间的通信会被封装并通过这个虚拟网络传输。当数据包到达目的地后,它会被解封装并传递给目标容器。这种方式使得容器间能够透明地通信,就像它们在同一个网络中一样。

4.3 使用场景

  • 多主机容器部署:当你需要在多个 Docker 主机上部署容器,并且这些容器需要相互通信时,覆盖网络是理想的选择。
  • Docker Swarm 集群:在 Docker Swarm 环境中,覆盖网络允许不同节点上的服务实例之间进行通信,非常适合微服务架构。
  • 跨主机负载均衡:覆盖网络支持跨多个宿主机的负载均衡,使得服务可以更加灵活地扩展和管理。

4.4 如何使用

要在 Docker Swarm 环境中创建一个覆盖网络,首先确保你的 Docker 环境已经初始化为 Swarm 模式,然后使用以下命令创建覆盖网络:

docker network create -d overlay my_overlay_network

创建了覆盖网络后,你可以在部署服务时指定使用这个网络:

docker service create --name my_service --network my_overlay_network my_image

4.5 注意事项

  • 网络性能:由于覆盖网络中存在数据封装和解封装的过程,可能会对网络性能造成一定影响。
  • 安全性:Docker 提供了网络加密选项来保护覆盖网络中的数据传输。
  • 网络管理:管理覆盖网络可能需要对 Docker Swarm 集群的管理和网络原理有一定的了解。

5 Macvlan 网络

Macvlan 网络为 Docker 容器提供了一种直接与物理网络接口的能力,使容器在网络上表现得像是一个独立的物理设备。这种网络类型在需要高性能网络通信或直接网络访问的特定场景下非常有用,但同时也带来了更高的复杂性和安全挑战。在使用 Macvlan 网络时,必须仔细考虑其对网络架构和安全的影响。

5.1 基本概念

Macvlan 网络是 Docker 提供的另一种网络类型,允许容器直接连接到物理网络。每个使用 Macvlan 网络的容器都会被分配一个独立的 MAC 地址,使其在网络上表现得就像是一个物理设备一样。这种网络类型适用于需要容器直接参与物理网络的场景,例如,当容器需要有自己的 IP 地址、或需要绕过 Docker 网络堆栈的复杂性时。

5.2 工作原理

Macvlan 网络通过创建一个或多个虚拟网络接口(Macvlan 接口)来工作,这些接口附加到宿主机的物理网络接口上。每个接口都有自己的 MAC 地址,容器通过这些虚拟接口与外部网络进行通信。这样,容器可以直接出现在物理网络上,而不是通过 Docker 主机的网络堆栈。

5.3 使用场景

  • 需要直接网络访问:对于需要绕过 NAT、或需要与外部网络中的其他设备直接通信的容器,Macvlan 网络是一个理想的选择。
  • 遗留系统集成:在一些遗留系统或需要直接网络访问的环境中,Macvlan 网络可以帮助容器更好地集成进这些环境中。
  • 网络性能:由于容器直接连接到物理网络,Macvlan 可以提供更好的网络性能,减少虚拟化带来的开销。

5.4 如何使用

创建 Macvlan 网络的基本步骤如下:

  1. 创建 Macvlan 网络:

    docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan_net
    

    这个命令会在宿主机的 eth0 网络接口上创建一个新的 Macvlan 网络,设置了子网和网关。

  2. 运行容器并连接到 Macvlan 网络:

    docker run --network my_macvlan_net --name my_container my_image
    

    这个命令启动一个容器,并将其连接到刚刚创建的 Macvlan 网络。

5.5 注意事项

  • 网络隔离:使用 Macvlan 网络时,容器的网络隔离级别较低,容器直接暴露在物理网络上。
  • 路由和防火墙配置:可能需要在网络设备或宿主机上进行额外的路由和防火墙配置,以确保网络通信的正确性和安全性。
  • 宿主机通信:默认情况下,使用 Macvlan 的容器可能无法与其宿主机进行直接通信。这可能需要额外的网络配置来解决。

6 结论

Docker 网络是容器化技术中不可或缺的一部分,它不仅提供了容器之间以及容器与外部世界之间通信的能力,还支持了高度的网络隔离和安全性。通过不同的网络类型和配置,Docker 能够满足各种应用场景的需求,从简单的单机部署到复杂的多主机、跨主机的集群环境。

桥接网络作为默认的网络类型,适用于大多数标准部署场景,提供了容器与外部网络的连接以及容器之间的隔离。主机网络模式提供了最高的网络性能,适用于性能敏感型应用。覆盖网络支持跨主机的容器通信,是在 Docker Swarm 集群中运行分布式应用的理想选择。Macvlan 网络则允许容器直接连接到物理网络,适用于需要直接网络访问或遗留系统集成的场景。

每种网络类型都有其适用场景和注意事项。选择合适的网络类型和配置,可以帮助开发者和运维人员构建高效、安全且易于管理的容器化应用。同时,Docker 的网络配置和管理工具也提供了灵活性和便利性,使得网络管理变得更加简单。

Docker 网络提供了强大而灵活的网络功能,支持各种应用部署和运行模式。通过合理选择和配置网络类型,可以最大化地发挥 Docker 容器的潜力,构建出高性能、安全且易于管理的容器化应用。


如果你对Docker技术还不是很了解,可以考虑从本系列第一篇文章开始阅读:《Docker技术概论(1):Docker与虚拟化技术比较》。

如果你觉得本文对你有所帮助,请在文章处点赞支持。 虽然这不会使我从中获得经济利益,但是你的赞是继续分享的巨大动力&^_^&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.tpcf.cn/news/715469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于QT和Visa的安捷伦(keysight)34970A温度采集

在以前的文章中,描述了如何在labview开发读取34970A仪器采集的温度。 也描述了如何安装keysight IO Libraries Suits. 那么本文更进一步,描述QT平台c语言开发软件,读取34970A仪器采集的温度。 以下是c代码,因为采集耗费时间长&…

C++虚函数调用规则

C虚函数调用规则 基类、派生类结构&#xff1a; class Foo { public:virtual void print() {cout << "Foo" << endl;} }; class Bar : public Foo { public:virtual void print() {cout << "Bar" << endl;} };1.通过对象直接调用…

AcWing 895. 最长上升子序列(线性dp)

问题描述 给定一个长度为N NN的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式&#xff1a; 第一行包含整数N NN。 第二行包含N NN个整数&#xff0c;表示完整序列。 输出格式&#xff1a; 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤…

【C++提高编程】

C提高编程 C提高编程1 模板1.1 模板的概念1.2 函数模板1.2.1 函数模板语法1.2.2 函数模板注意事项1.2.3 函数模板案例1.2.4 普通函数与函数模板的区别1.2.5 普通函数与函数模板的调用规则1.2.6 模板的局限性 1.3 类模板1.3.1 类模板语法1.3.2 类模板与函数模板区别1.3.3 类模板…

备战蓝桥杯---动态规划的一些思想1

话不多说&#xff0c;直接看题&#xff1a; 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考&#xff1a; 1.双线程DP 可能有人会说直接贪心&#xff1a;先选第1条的最优路径&#xff0c;再选第2条最优路径。 其实我们再选第1条时&#xff0c;我们怎么选会对第2条的路径…

FastJson中“$ref 循环引用检测”的问题

今天在测试时&#xff0c;错误停留在了以下的代码行 Object object new ObjectMapper().readValue(JSON.toJSONString(procInst.getForm()), Object.class); 报错信息&#xff1a;com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &quo…

linux命令行与shell脚本大全——学习笔记(1-4章)

第一章、第二章 查看运行层级 runlevel 目前有7个层级&#xff0c;3是有联网的多用户模式&#xff0c;5是配有GUI的多用户模式&#xff0c;等等 第三章 启动shell 查看/etc/passwd文件&#xff0c;可以看到每个用户的默认shell程序&#xff0c;如: christine:x:1001:1001:…

面条机水箱低液位提醒功能如何实现

光电液位传感器在面条机水箱低液位功能的实现中发挥着重要作用。该技术通过光学原理和分离式设计&#xff0c;实现了面条机水箱液位的精准检测和智能控制&#xff0c;为面条生产提供了稳定的保障。 采用分离式液位传感器&#xff0c;将菱镜部分设计直接置于面条机水箱上&#…

nvidia a100-pcie-40gb环境安装

1.conda create --name torch_li python3.8 2. conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit11.0 -c pytorch 环境测试&#xff1a;torch.cuda.is_available() 3.conda remove -n torch_li --all 4.pip install opencv-python-headless 5.pip ins…

SOCKS55代理与Http代理有何区别?如何选择?

在使用IPFoxy全球代理时&#xff0c;选择 SOCKS55代理还是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http协议自主切换&#xff0c;但要怎么选择&#xff1f;为解决这个问题&#xff0c;得充分了解两种代理的工作原理和配置情况。 在这篇文章中&#xff0c;我们会简要介绍 …

overleaf上传到arxiv 参考文献无法引用(?)

记一下overleaf上传到arxiv的bug 参考文献无法引用&#xff08;&#xff1f;&#xff09; 因为需要上传bbl文件而不是bib 用overleaf生成bbl 另外需要将bbl和txt的文件名设置成一样的

Linux笔记--解压缩

一、tar指令 Linux打包文件通常以.tar结尾&#xff0c;压缩文件以.gz(.bz2)结尾。通常压缩和打包是一起进行的&#xff0c;打包压缩后文件后缀名一般为.tar.gz。 z∶使用gzip进行解压缩 j:使用bzip2进行解压缩 c: create&#xff0c;创建文件 x : extract&#xff0c;解压 v:…

RocketMQ消息积压如何处理

在高并发的场景下&#xff0c;由于消息产生速度超过消费速度&#xff0c;可能会导致消息积压的问题。本文将介绍 RocketMQ 消息积压的原因和如何处理积压问题。 什么是消息积压 消息积压是使用 MQ 消息队列系统中&#xff0c;最常见的一种性能问题。如下图所示&#xff0c;当生…

2、Redis-Hash【常用】

目录 一、Hash和String的区别 二、常用命令与演示 三、Redis中Hash类型应用场景 一、Hash和String的区别 这是String, keyvaluenameTrxcx 这是Hash&#xff0c; keyvaluestudentTrxcxnameTrxcxage21sexmale 可以明显的看出&#xff0c;String的value就是一条数据&#…

手动实现一个简单的 HTTP 请求

本文我们通过 Socket&#xff0c;写一个 HTTP 协议&#xff0c;直观的感受一下上篇文章中的请求和响应。 定义 socket server 通过上篇文章&#xff0c;我们知道 HTTP 协议底层是通过 Socket 实现的&#xff0c;所以我们先通过 socket 定义一个 server import socket#初始化 …

复试PAT乙级day34

1111~1115 1113 很难&#xff0c;看了题解 人类习惯用 10 进制&#xff0c;可能因为大多数人类有 10 根手指头&#xff0c;可以用于计数。这个世界上有一种叫“钱串子”&#xff08;学名“蚰蜒”&#xff09;的生物&#xff0c;有 30 只细长的手/脚&#xff0c;在它们的世界里…

【探索AI】十六 深度学习之第2周:深度神经网络(五)实践与应用

实践与应用 实现步骤 当您想要使用深度学习框架构建简单的深度神经网络并进行训练与评估时&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤一&#xff1a;选择深度学习框架 选择您熟悉或希望学习的深度学习框架&#xff0c;比如TensorFlow、PyTorch、Keras等。 …

算法题目跟连系列之“手把手刷链表”

第一道 题目&#xff1a;https://leetcode.cn/problems/partition-list/description/ 86 Partition List 这个题解决的时候&#xff0c;无非就是把链表中小于X的元素摘出来形成一个链表&#xff0c;同时也把大于等于X的元素摘出来形成另外一个链表。最后把这两个链表合并。这个…

卷积神经网络介绍

卷积神经网络(Convolutional Neural Networks&#xff0c;CNN) 网络的组件&#xff1a;卷积层&#xff0c;池化层&#xff0c;激活层和全连接层。 CNN主要由以下层构造而成&#xff1a; 卷积层&#xff1a;Convolutional layer&#xff08;CONV&#xff09;池化层&#xff1a…

docker报错 fatal error: runtim: out of memory

fatal error: runtim: out of memory 真无语了 系统内存也够用 原来是虚拟机的不够用了 &#xff08;原本1g已经加到2g还是会报错&#xff09; 直接3台虚拟机都加到4g