当前位置: 首页 > news >正文

05.容器网络

《Docker 网络相关知识》

文章目录

    • 《Docker 网络相关知识》
      • 一、none 和 host 网络的适用场景
        • 1. none 网络
        • 2. host 网络
      • 二、学容器必须懂 bridge 网络
        • bridge 网络概述
      • 三、如何自定义容器网络?
        • 1. 自定义网络的必要性
        • 2. 自定义网络的方法
      • 四、理解容器之间的连通性
        • 1. 容器连通性的重要性
        • 2. 实现容器连通的方式
      • 五、容器通信的三种方式
        • 1. IP 通信
        • 2. Docker DNS Server
        • 3. joined 容器
      • 六、容器如何访问外部世界
        • 1. NAT(网络地址转换)
        • 2. 端口映射
      • 七、外部世界如何访问容器
      • 八、实战:安装 tomcat
      • 本章小结

一、none 和 host 网络的适用场景

1. none 网络
  • 含义与特点:
    • 在 none 网络模式下,容器没有网络连接,不会被分配 IP 地址,无法与外部网络或其他容器通信。这种模式让容器内的网络处于一种孤立状态。
  • 适用场景:
    • 安全需求高的场景:例如处理高度机密数据且无需网络交互的应用,像某些本地数据加密处理程序。如果这些程序放在有网络连接的容器中,可能存在数据泄露风险,而 none 网络模式可确保数据处理环境的安全。
    • 特定测试场景:当测试一些与网络功能无关的程序时,使用 none 网络可避免网络因素干扰测试结果。比如测试一个只在本地运行算法的程序,使用这种网络模式能保证测试的纯粹性。
  • 创建命令:
    • 使用docker run -it --network = none [image_name]来创建基于 none 网络的容器,其中[image_name]是要使用的镜像名称。
2. host 网络
  • 含义与特点:
    • host 网络模式使容器共享主机的网络命名空间,容器使用主机的 IP 地址,能直接使用主机上的网络接口,网络性能高,因为省去了网络地址转换(NAT)的开销。
  • 适用场景:
    • 对网络性能要求高的应用:比如网络监控工具,像 Wireshark 的容器化版本。在监控主机网络流量时,将容器设置为 host 网络模式,可让监控工具直接获取主机网络接口的数据,确保网络监控的准确性和高效性。
    • 需与主机网络紧密结合的应用:若容器化应用需与主机上其他网络服务无缝对接,host 网络模式是很好的选择。例如,主机上运行的分布式系统中的某个组件,采用 host 网络模式可让它在网络操作上如同直接在主机上运行。
  • 创建命令:
    • 通过docker run -it --network = host [image_name]来创建基于 host 网络的容器。

二、学容器必须懂 bridge 网络

bridge 网络概述
  • 基本情况:
    • bridge(桥接)网络是 Docker 默认的网络模式。Docker 会创建一个虚拟网桥(docker0),新创建的容器如果没有指定网络模式,会自动连接到这个网桥。
    • 在这种模式下,每个容器都有自己独立的 IP 地址,且能通过网桥与其他容器和外部网络进行通信。
  • 工作原理:
    • IP 分配:容器启动时,Docker 会从docker0网桥所在子网(如172.17.0.0/16)中为容器分配 IP 地址。
    • 网络连接:容器通过虚拟网络接口连接到docker0网桥。当容器向外部网络发送数据时,先经过docker0网桥,再由主机网络接口转发;外部网络数据进入容器时,先到主机网络接口,再经docker0网桥转发到容器。

三、如何自定义容器网络?

1. 自定义网络的必要性
  • 网络管理需求:
    • 在复杂的应用场景中,默认网络配置可能无法满足对容器网络精确控制的需求。例如,在构建多层架构或分布式系统时,需要对容器的 IP 地址、网络路由等进行精确设置。
    • 从网络安全考虑,有时需要将处理不同安全级别的服务的容器划分到不同网络,创建隔离的网络环境来保障安全。
  • 业务逻辑需求:
    • 某些业务场景要求容器网络具有特定属性。比如在视频流处理系统中,根据视频处理阶段将容器分到不同网络,优化网络带宽分配和数据传输路径。
2. 自定义网络的方法
  • 创建自定义网络:
    • 使用docker network create [network_name]命令创建自定义网络,例如docker network create my_network可创建名为my_network的网络。还可以通过添加参数进一步定制,如--subnet = 192.168.1.0/24来指定子网范围。
  • 将容器连接到自定义网络:
    • 在创建容器时,使用--network = [network_name]参数将容器连接到自定义网络。如docker run -it --network = my_network [image_name],可让容器连接到my_network

四、理解容器之间的连通性

1. 容器连通性的重要性
  • 微服务架构中的作用:
    • 在微服务架构中,多个容器分别运行不同微服务组件,这些组件需相互通信才能协同工作。例如电商应用中的用户认证、商品目录、订单处理和支付等微服务,它们在不同容器中运行,相互之间的数据传递至关重要。如果容器间无法通信,会导致业务流程无法正常运行,如订单无法处理、支付失败等问题。
  • 分布式系统中的基础:
    • 在分布式系统中,容器间的连通性是实现系统功能的基础。比如分布式数据存储系统,数据分散在多个容器化数据节点中,这些节点需要通过网络进行数据同步和查询操作。若容器不能连通,数据的一致性和可用性将无法保证。
2. 实现容器连通的方式
  • 通过 IP 地址通信
    • 原理与操作:
      • 在同一网络中的容器可直接使用 IP 地址通信。容器启动时会被分配 IP 地址,其他容器可使用该 IP 地址发送请求。例如,容器 A 的 IP 地址为172.17.0.2,容器 B 可通过curl 172.17.0.2访问容器 A(假设容器 A 有可通过 HTTP 访问的服务)。这种通信基于 TCP/IP 协议栈。
    • 优缺点:
      • 优点是简单直接,适用于简单网络环境。缺点是容器 IP 地址变化(如重启后重新分配)时,需重新配置通信地址,在动态环境中管理不便。
  • 通过服务发现
    • 原理与操作:
      • 使用 Consul 或 Etcd 等工具实现服务发现,容器通过服务名称找到对方。这些工具基于分布式键值存储系统,维护容器服务注册信息。例如,容器启动时将服务信息(服务名、IP 地址、端口号等)注册到服务发现工具中,其他容器查询该服务信息后建立网络连接。
    • 优缺点:
      • 优点是能适应容器 IP 地址动态变化,提高网络可维护性。缺点是需引入额外工具,增加系统复杂性和资源消耗。
  • 通过网络插件
    • 原理与操作:
      • 第三方网络插件如 Weave Net 和 Flannel 可提供高级的容器连通性解决方案。它们通过创建覆盖网络(Overlay Network)实现容器连通,覆盖网络可跨越不同物理网络和主机。例如,Weave Net 通过在容器间建立加密网络隧道实现跨主机容器连通,自动将不同主机上的容器连接到虚拟网络,使容器能像在同一主机上通信。
    • 优缺点:
      • 优点是能提供强大的跨主机容器连通性和网络管理功能,适用于大规模容器集群。缺点是配置和管理复杂,可能影响网络性能。

五、容器通信的三种方式

1. IP 通信
  • 原理与机制:
    • 同一网络中的容器可通过 IP 地址通信。容器启动时被分配的 IP 地址在其所在网络中是唯一的,容器内的进程可基于此 IP 地址进行网络协议通信。从网络分层看,基于网络层的 IP 协议,容器内应用程序将数据封装成 IP 数据包发送到目标容器,目标容器接收后解包处理。
  • 实际应用示例:
    • 假设在 bridge 网络环境中有容器 A 和容器 B,容器 A 运行 Web 服务,IP 地址为172.17.0.2,容器 B 运行客户端程序。容器 B 可通过curl 172.17.0.2访问容器 A 的 Web 服务(若容器 A 的 Web 服务监听在 80 端口,可通过http://172.17.0.2:80访问)。
2. Docker DNS Server
  • 工作原理与配置:
    • Docker 内置 DNS 服务器,当容器在同一网络时,可通过容器名称访问对方。Docker 的 DNS 服务器会将容器名称解析为对应的 IP 地址。容器启动时会将自己的名称和 IP 地址注册到 DNS 服务器,其他容器使用容器名称作为目标地址时,DNS 服务器会进行解析后建立网络连接。
  • 实际应用示例:
    • 若有容器 A(名称为container_A)和容器 B,在容器 B 中可直接使用curl container_A访问容器 A(假设容器 A 有可通过 HTTP 访问的服务),无需知道容器 A 的 IP 地址,方便了容器间通信,尤其在 IP 地址可能动态变化的情况下。
3. joined 容器
  • 概念与创建方法:
    • joined 容器共享网络命名空间。创建 joined 容器的命令是docker run -it --network = container:[container_name] [image_name]。例如,有parent_container,创建与其共享网络命名空间的容器可使用docker run -it --network = container:parent_container ubuntu:latest
  • 通信机制与应用场景:
    • 在 joined 容器中,由于共享网络命名空间,两个容器内的进程可像在同一操作系统环境中通信。例如,一个容器运行主应用程序,另一个容器运行辅助工具(如日志收集工具),辅助工具容器可方便地与主应用程序容器通信来收集日志数据。

六、容器如何访问外部世界

1. NAT(网络地址转换)
  • 原理与机制:
    • Docker 使用 NAT 技术实现容器对外部世界的访问。当容器向外部网络发送请求时,Docker 将容器的私有 IP 地址转换为主机的 IP 地址并转发请求,外部网络返回的响应经主机再转发回容器。
  • 实际应用示例:
    • 假设容器 A(IP 地址为172.17.0.2)内的应用要访问外部网站www.example.com,主机 IP 地址为192.168.1.100。容器 A 内应用发送 HTTP 请求时,在主机网络接口处,请求数据包的源 IP 地址从172.17.0.2转换为192.168.1.100后转发到外部网络;外部网站返回的响应数据包目标 IP 地址为192.168.1.100,主机收到后转换为172.17.0.2再转发到容器 A。
2. 端口映射
  • 原理与配置方法:
    • 通过端口映射可让外部网络访问容器内的服务。创建容器时使用-p选项进行端口映射,如docker run -it -p 8080:80 [image_name],表示将容器内监听 80 端口的服务映射到主机的 8080 端口,外部网络可通过访问主机的http://主机IP:8080来访问容器内服务。
  • 实际应用示例:
    • 若容器内运行 Nginx Web 服务器监听在 80 端口,通过-p 8080:80端口映射,外部网络用户可在浏览器中输入http://主机IP:8080访问容器内的 Nginx。

七、外部世界如何访问容器

  • 端口映射:
    • 如前文所述,通过在创建容器时进行端口映射(如-p选项),外部网络可访问容器内的服务。
  • 反向代理:
    • 可使用反向代理服务器如 Nginx 来代理外部网络对容器的访问。通过配置 Nginx,可将外部请求转发到相应容器内服务,还能实现负载均衡等功能。

八、实战:安装 tomcat

  • 安装步骤:
    • 首先,拉取 Tomcat 镜像:
      • 使用docker pull tomcat命令从 Docker 仓库中拉取 Tomcat 镜像。
    • 然后,创建并运行一个 Tomcat 容器:
      • 例如,将容器内的 8080 端口映射到主机的 8080 端口,使用命令docker run -it -p 8080:8080 tomcat
    • 之后,在浏览器中访问http://主机IP:8080,就能看到 Tomcat 的欢迎页面。

本章小结

本章阐述了 Docker 网络相关知识,包括不同网络模式(none、host、bridge)的特点、适用场景和操作方法,如何自定义容器网络,容器之间连通性和通信方式,以及容器与外部世界相互访问的方法,并通过安装 Tomcat 容器的实战操作,深入理解和应用 Docker 网络知识。

http://www.dtcms.com/a/403443.html

相关文章:

  • 自己做的博客网站吗网站重构
  • vue 构建工具如何选择 | vue-cli 和 vite的区别
  • 公司网站建设会计上怎么处理怎么做一个网站
  • 网站建设群国金紫郡府淮北论坛
  • DC-DFTC工具串scan chain过程中遇到Error(TEST-1313)
  • flutter 3.22+ Android集成高德Flutter地图自定义Marker显示
  • K8s学习笔记(六) K8s升级与节点管理
  • Android,jetpack compose实现俄罗斯方块,简单案例♦️
  • Kubernetes(K8S)完全详解:从架构设计到云原生实践
  • IDEA/WebStorm 卡顿问题与启动参数调优指南
  • 杭州精品课程网站建设青海媒体网站建设公司
  • Metal - 5.深入剖析 3D 变换
  • 上海网站建设友汇网站网站修改备案号
  • nccl中的rdma是指什么 (来自deepseek)
  • C#练习题——List排序与反转操作详解:怪物属性排序示例
  • Linux离线安装指定包
  • WebGIS:在 Vue 2 项目中使用 Mapbox 时,如果需要加载的 GIS 数据量过大,怎么让接口一次性获取的geojson数据分批加载
  • 您的前端开发智能工作流待升级,查收最新 Figma2Code!
  • 多品牌集运管理的革新:易境通集运系统的一站式解决方案
  • 用dw做网站的步骤山东网站建设开发
  • Docker和K8S的区别详解
  • 高性能内存池(四)----CentralCache实现
  • Python快速入门专业版(四十四):Python面向对象基础:类与对象的创建与使用(核心概念解析)
  • 阿里云电影网站建设教程2345浏览器网址导航
  • flutter json转实体类
  • MCU内存到下载的诸多问题
  • 论文解读:利用中断隔离技术的 Linux 亚微秒响应性能优化
  • 莱芜住房和城乡建设厅网站海外代理ip
  • 服务器时间同步校准
  • 本地应用程序如何通过 VPC Endpoint 或本地网络代理访问 AWS S3