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
网桥转发到容器。
- IP 分配:容器启动时,Docker 会从
三、如何自定义容器网络?
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 地址通信。容器启动时会被分配 IP 地址,其他容器可使用该 IP 地址发送请求。例如,容器 A 的 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
访问)。
- 假设在 bridge 网络环境中有容器 A 和容器 B,容器 A 运行 Web 服务,IP 地址为
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 地址可能动态变化的情况下。
- 若有容器 A(名称为
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 容器共享网络命名空间。创建 joined 容器的命令是
- 通信机制与应用场景:
- 在 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。
- 假设容器 A(IP 地址为
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。
- 若容器内运行 Nginx Web 服务器监听在 80 端口,通过
七、外部世界如何访问容器
- 端口映射:
- 如前文所述,通过在创建容器时进行端口映射(如
-p
选项),外部网络可访问容器内的服务。
- 如前文所述,通过在创建容器时进行端口映射(如
- 反向代理:
- 可使用反向代理服务器如 Nginx 来代理外部网络对容器的访问。通过配置 Nginx,可将外部请求转发到相应容器内服务,还能实现负载均衡等功能。
八、实战:安装 tomcat
- 安装步骤:
- 首先,拉取 Tomcat 镜像:
- 使用
docker pull tomcat
命令从 Docker 仓库中拉取 Tomcat 镜像。
- 使用
- 然后,创建并运行一个 Tomcat 容器:
- 例如,将容器内的 8080 端口映射到主机的 8080 端口,使用命令
docker run -it -p 8080:8080 tomcat
。
- 例如,将容器内的 8080 端口映射到主机的 8080 端口,使用命令
- 之后,在浏览器中访问
http://主机IP:8080
,就能看到 Tomcat 的欢迎页面。
- 首先,拉取 Tomcat 镜像:
本章小结
本章阐述了 Docker 网络相关知识,包括不同网络模式(none、host、bridge)的特点、适用场景和操作方法,如何自定义容器网络,容器之间连通性和通信方式,以及容器与外部世界相互访问的方法,并通过安装 Tomcat 容器的实战操作,深入理解和应用 Docker 网络知识。