【Docker】网络

发布时间:2026/9/30 2:23:01
【Docker】网络 个人主页秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 系列专栏Docker_秦jh_的博客-CSDN博客​​​​​目录Docker Network(网络)Docker 为什么需要网络管理Docker 网络架构简介CNMLibnetwork驱动常见网络类型docker 网络管理命令命令清单docker network createdocker network inspectdocker network connectdocker network disconnectdocker network prunedocker network rmdocker network ls网络详解docker Bridge 网络网络介绍操作案例容器间的网络通信创建自定义 bridgeDNS 解析docker Host 网络网络介绍docker Container 网络网络介绍docker none 网络网络介绍前言 hello! 各位铁子们大家好哇。今日更新了Docker相关内容 欢迎大家关注点赞收藏⭐️留言Docker Network(网络)Docker 为什么需要网络管理容器的网络默认与宿主机及其他容器都是相互隔离 但同时我们也要考虑下面的一些 问题 比如• 多个容器之间是如何通信的• 容器和宿主机是如何通信的• 容器和外界主机是如何通信的• 容器中要运行一些网络应用(如 nginx、web 应用、数据库等)如果要让外部也可 以访问这些容器内运行的网络应用应该如何实现• 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现• 容器根本不需要网络的时候应该如何实现• 容器需要更高的定制化网络如定制特殊的集群网络、定制容器间的局域网应 该如何实现• ....上述的这些问题都需要我们对容器的网络进行合理的管理才能解决这就体现出了容 器网络管理的重要性。Docker 网络架构简介Docker 容器网络是为应用程序所创造的虚拟环境的一部分它能让应用从宿主机操作 系统的网络环境中独立出来形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。Docker 为实现容器网络主要采用的架构由三部分组成CNM、Libnetwork 和驱动。CNMDocker 网络架构采用的设计规范是 CNMContainer Network Model。CNM 中规定 了 Docker 网络的基础组成要素Sandbox、Endpoint、Network。• Sandbox提供了容器的虚拟网络栈也即端口、套接字、IP 路由表、防火墙、 DNS 配置等内容。主要用于隔离容器网络与宿主机网络形成了完全独立的容器网络 环境。• NetworkDocker 内部的虚拟子网使得网络内的参与者能够进行通讯。• Endpoint就是虚拟网络的接口就像普通网络接口一样Endpoint 的主要职责 是负责创建连接。Endpoint 类似于常见的网络适配器那也就意味着一个 Endpoint 只 能接入某一个网络 当容器需要接入到多个网络就需要多个 Endpoint。如上图所示容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。那么 容器 A 和容器 B 之间是可以实现通信的因为都接入了 NetworkA。但是容器 A 和容 器 C 不可以通过容器 B 的两个 Endpoint 通信LibnetworkLibnetwork 是 CNM 的一个标准实现。Libnetwork 是开源库采用 Go 语言编写跨 平台的也是 Docker 所使用的库Docker 网络架构的核心代码都在这个库中。 Libnetwork 实现了 CNM 中定义的全部三个组件此外它还实现了本地服务发现、基 于 Ingress 的容器负载均衡以及网络控制层和管理层等功能。驱动驱动主要负责实现数据层相关内容例如网络的连通性和隔离性是由驱动来处理的。 驱动通过实现特定网络类型的方式扩展了 Docker 网络栈例如桥接网络和覆盖网络。Docker 内置了若干驱动通常被称作原生驱动或者本地驱动。例如 Bridge Driver、 Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver 等 等。每个驱动负责创建其上所有网络资源的创建和管理。常见网络类型1. bridge 网络bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下网桥上 的容器可以相互通信。也可以通过 bridge 驱动程序配置实现对外部容器的访问。 Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时桥接网络是最佳选择。2. host 网络对于独立容器移除容器和 Docker 主机之间的网络隔离并直接使用主机的网络。 当网络堆栈不应该与 Docker 主机隔离但是希望容器的其他资源被隔离时主机网络 是最佳选择。3. container 网络这个模式指定新创建的容器和引进存在的一个容器共享一个网络 而不是和宿主 机共享。新创建的容器不会创建自己的网卡配置自己的 ip而是和一个指定的容器 共享 ip端口等两个容器除了网络方面其他的如文件系统、进程列表等还是隔离 的。两个容器的进程可以通过 lo 网卡设备通信4. none 网络Docker 容器拥有自己的 Network Namespace但是并不为 Docker 容器进行任 何网络配置。也就是说这个 Docker 容器没有网卡、IP、路由等信息。容器完全网络 隔离。5. overlay 网络借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个 Docker 守护进程连接在一起使集群服务能够相互通信。当我们需要运行在不同 Docker 主机上的容器进行通信时或者当多个应用程序使用集群服务协同工作时覆 盖网络是最佳选择。另外在 Docker 安装时会自动安装一块 Docker 网卡称为 docker0它是一个网 桥设备主要用于 Docker 各容器及宿主机的网络通信。[zscVM-8-12-centos ~]$ ifconfig docker0: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:c5ff:fefc:88f9 prefixlen 64 scopeid 0x20link ether 02:42:c5:fc:88:f9 txqueuelen 0 (Ethernet) RX packets 112330 bytes 6936523 (6.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 124259 bytes 466453202 (444.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0docker 网络管理命令命令清单docker network create功能 创建自定义网络语法docker network create [OPTIONS] NETWORK关键参数 -d, --driver网络驱动 --gateway网关地址 --subnet表示网段的 CIDR 格式的子网 --ipv6启用 ipv6样例docker network create --driverbridge --subnet192.168.0.0/16 br0docker network inspect功能 查看网络详情语法docker network inspect [OPTIONS] NETWORK [NETWORK...]关键参数 -f,--format:指定格式样例docker network inspect mynetworkdocker network connect功能 于将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接容器可以与同一网络中的其他容器通信。语法docker network connect [OPTIONS] NETWORK CONTAINER关键参数 --ip指定 IP 地址 --ip6指定 IPv6 地址样例将正在运行的容器连接到网络$ docker network connect multi-host-network my_container1启动时将容器连接到网络还可以使用 docker run --networknetwork-name选项启动容器并立即将其连 接到网络。$ docker run -itd --networkmulti-host-network busybox-container指定容器的 IP 地址可以指定要分配给容器网络接口的 IP 地址。$ docker network connect --ip 10.10.36.122 multi-host-network container2docker network disconnect功能 断开网络语法docker network disconnect [OPTIONS] NETWORK CONTAINER关键参数 -f:强制退出样例$ docker network disconnect multi-host-network my_container1docker network prune功能 删除不使用的网络语法docker network prune [OPTIONS]关键参数 -f, --force 不提示样例docker network prunedocker network rm功能 删除 1 个或者多个网络语法docker network rm NETWORK [NETWORK...]关键参数 -f:强制退出样例docker network rm br0docker network ls功能 列出网络语法docker network ls [OPTIONS]关键参数 -f, --filter:指定过滤条件 --format:指定格式 --no-trunc:不截断 -q, --quiet :仅仅显示 id样例docker network list网络详解docker Bridge 网络网络介绍Docker Bridge 网络采用内置的 bridge 驱动bridge 驱动底层采用的是 Linux 内核中 Linux bridge 技术。就网络而言bridge 网络是在网络段之间转发流量的链路层设备 而网桥可以是在主机内核中运行的硬件设备或软件设备就 Docker 而言桥接网络使 用软件网桥 docker0它允许连接到同一网桥网络的容器进行通信同时提供与未连 接到该网桥网络容器的隔离。Docker Container 的 bridge 桥接模式可以参考下图默认情况下创建的容器在没有使用--network 参数指定要加入的 docker 网络时 默认都是加入 Docker 默认的单机桥接网络。默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。 bridge 是 Docker 对网络的命名而 docker0 是内核中网桥的名字。操作案例容器间的网络通信如果是两台主机可以直接通过连接网线的两端进行通信。那多台主机通信怎么处理呢 这就需要新增路由器/交换机把多台主机连接到路由器/交换机上 通过路由器/交换 机来达到交换数据 即通信的目的。其实容器之间的通信也和上面主机通信的方式如出一辙 之前我们提到了安装 Docker 的时候会默认 docker0 这个网桥软件设备 这个 docker0 设备可以类比成上图的交 换机/路由器设备当我们创建好容器之后 如果不手动指定网络模式默认会使用 bridge 网络 容器会自动连接到 docker0 这个网桥设备 然后通过这个网桥来进行 容器间的通信。创建自定义 bridge在默认情况下 我们创建的容器都会连接在 docker0 这个 bridge 上。那其实我们也 可以创建一些自定义的 bridge让运行的容器通过自定义 bridge 进行通信。DNS 解析Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的 也就是说我们 可以直接使用容器名进行通信因为 DNS 服务可以解析容器名到 IP 地址的映射 但 是默认的 bridge 网络是不支持 DNS 的。docker Host 网络网络介绍Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统 但是如果基 于 host 网络模式容器将不会获得一个独立的 Network Namespace而是和宿主机 共用同一个 Network Namespace容器将不会虚拟出自己的网卡IP 等而是直接使 用宿主机的 IP 和端口。连接到 host 网络的容器共享宿主机的网络栈容器的网络配置与宿主机完全一样。我 们可以通过 --networkhost 指定使用 host 网络。使用场景• 之前我们提到 bridge 网络在通信的时候需要进行端口转发以及 NAT 地址转换 这势必会消耗掉一些资源以及性能。• 那么直接使用 host 网络最大的好处就是性能好如果容器对网络传输效率有较高 的要求建议选择 host 网络。当然也会牺牲一些东西比如要考虑端口冲突问题其 他服务已经被占用的端口就不能再使用了docker Container 网络网络介绍Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模 式。之所以称为“other container 模式”是因为这个模式下的 Docker Container会使 用其他容器的网络环境。之所以称为“特别”是因为这个模式下容器的网络隔离性会处 于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境则 至少这两个容器之间不存在网络隔离而这两个容器又与宿主机以及除此之外其他的 容器存在网络隔离。Docker Container 的 other container 网络模式可以参考下图Docker Container 的 other container 网络模式实现逻辑如下1. 查找 other container即需要被共享网络环境的容器的网络 namespace2. 将新创建的 Docker Container也是需要共享其他网络的容器的 namespace 使用 other container 的 namespace使用场景在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容 器传输效率较高。但是两个容器之间存在依赖如果依赖容器重启了会导致另外 一个服务的网络不可用。docker none 网络网络介绍none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环)没有其他任何 网卡。使用场景• 针对一些对安全性要求比较高并且不需要联网的应用 可以使用 none 网络 比 如生成随机密码 避免生成密码被第三方获取。• 一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器 网络由第三 方自己来配置。