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

Docker技术概论(5)
Docker网络

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://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 提供了多种内置的网络驱动,如 bridgeoverlayhostmacvlan。用户也可以安装和使用第三方网络驱动。

1.3 容器网络模式

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

1.4 网络配置和管理

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

1.5 安全性和隔离

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

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

在这里插入图片描述

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

2. 桥接网络(bridge)

2.1 基本概念

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

Docker 中,桥接网络提供了与 VMware 的桥接模式类似的功能,允许容器直接连接到物理网络,并且具有独立的 IP 地址。同时,Docker 的端口映射功能则在某种程度上类似于 VMwareNAT 模式,它允许外部访问映射到宿主机端口的容器服务。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.hqwc.cn/news/498664.html

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

相关文章

阿里云服务器大降价20%,简单拥有五年三台2h4gECS,组建公网集群

要在阿里云ECS上组建集群,您可以按照以下步骤进行操作: 创建ECS实例:登录阿里云控制台,选择ECS实例,点击“创建实例”按钮。根据实际需求选择实例的配置参数,例如实例规格、操作系统、网络等。根据需要选择…

如何在Linux使用Docker部署Nexus容器并实现公网访问本地仓库【内网穿透】

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具,用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关,可…

谷歌SEO推广提高网站点击率的10个秘籍-华媒舍

在当今数字化时代,拥有一个高点击率的网站对于企业和个人而言至关重要。通过谷歌SEO推广,可以帮助网站吸引更多的流量,并在搜索引擎结果页面(SERP)中获得更好的排名。本文将介绍10个谷歌SEO推广的秘籍,帮助…

snakeyaml1.x升级2.x导致项目启动报错

snakeyaml1.x升级2.x,修复漏洞 1.背景 在工作中,经常会有漏洞扫描,有一次看到了snakeyaml的漏洞: 项目框架:springBoot 版本:2.2.6.RELEASE snakeyaml 中央仓库信息 snakeyaml中央仓库地址:https://m…

ETH开源PPO算法学习

前言 项目地址:https://github.com/leggedrobotics/rsl_rl 项目简介:快速简单的强化学习算法实现,设计为完全在 GPU 上运行。这段代码是 NVIDIA Isaac GYM 提供的 rl-pytorch 的进化版。 下载源码,查看目录,整个项目…

mongoose源码解读(二) -- mg_mgr_init 初始化

在用 mongoose 源码开发的时候,这个初始化函数 mg_mgr_init()则是必须的,我们看下它到底做了哪些初始化操作。 void mg_mgr_init(struct mg_mgr *m, void *user_data) {struct mg_mgr_init_opts opts;memset(&opts, 0, sizeo…

力扣-移除元素

问题 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

深入Linux内核(进程篇)—进程切换之ARM体系架构 简单总结

context_switch函数完成Arm架构Linux进程切换,调用两个函数: 调用switch_mm() 完成用户空间切换,刷新I-CACHE,处理ASID和TLB,页表转换基址切换(即把TTBR0寄存器的值设置为新进程的PGD)&#xf…

java自动化之自动化框架项目(第四天-常用变量解析到map)

1.实现目标 常用变量解析到map,方便后面解析初始化sql或者入参的时候对变量进行替换 2.添加工具类 VariableUtil.java package com.syq.autotest.utils;import com.syq.autotest.entity.Variable; import org.apache.log4j.Logger;import java.util.HashMap; imp…

AI大模型 拍照搜题

最近,发现一款小程序【问智通】,实现了拍照搜题结合AI大模型,省去了打字和敲数学公式向AI提问,完美的补充了其它拍照搜题平台拍不到,没解析等不足!!! 小程序码: APP下载…

map和set的简单介绍

由于博主的能力有限,所以为了方便大家对于map和set的学习,我放一个官方的map和set的链接供大家参考: https://cplusplus.com/ 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque&#x…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…