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

Docker网络实战:容器通信与隔离之道

文章目录

  • 一、Docker网络概念
    • 1.1 Docker为什么需要网络?
    • 1.2 常见网络类型
  • 二、网络命令
  • 三、网络模式的设置
    • 3.1 host网络
    • 3.2 container网络
    • 3.3 none网络

一、Docker网络概念

1.1 Docker为什么需要网络?

  • 实现容器间通信:这是最核心的原因。现代应用,尤其是微服务架构,是由多个独立的服务组成的(例如:Web前端、用户认证服务、订单服务、数据库等)。每个服务通常运行在各自的容器中。
  • 实现外部网络访问容器内的服务:一个Web服务器容器(如Nginx、Tomcat)之所以有用,是因为外部用户(通过浏览器)或其他系统能够访问它提供的服务(如网站或API)。
  • 允许容器访问外部网络:容器内的应用经常需要从互联网获取资源或数据。
  • 连接容器与宿主机:有时容器需要与宿主机上的服务或文件系统进行交互。

1.2 常见网络类型

  • Bridge网络(桥接网络):是 Docker 的默认网络模式,它会在宿主机内部创建一个私有虚拟网络,容器像连接到同一个虚拟交换机一样被分配独立IP,并通过NAT与外部通信,是实现单主机上多容器间通信最常用且隔离性良好的方式。

  • Host(宿主机网络):让容器直接共享宿主机的网络命名空间,容器本身没有独立IP,直接使用主机网卡和端口,消除了NAT开销从而提供最佳网络性能,但代价是牺牲了网络隔离性并可能引发端口冲突。

  • Container(容器网络):这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

  • None(无网络):模式为容器提供了一个完全无网络的环境,内部仅存在回环接口,使其与外界彻底隔离,适用于追求绝对安全或只需执行离线计算的特殊任务。

  • Overlay(叠加网络):是用于 Docker 集群的高级模式,它能在多个物理主机之上构建一个统一的虚拟网络,使不同机器上的容器能像在同一局域网内一样直接通信,是 Swarm 或 Kubernetes 等编排工具的基础。

二、网络命令

docker network create
功能:创建自定义网络
语法:

docker network create [OPTIONS] NETWORK

关键参数:

  • d, --driver:网络驱动
  • --gateway:网关地址
  • --subnet:表示网段的 CIDR 格式的子网
  • --ipv6:启用 ipv6

示例:
在这里插入图片描述

docker network inspect
功能:查看网络详情
语法:

docker network inspect [OPTIONS] NETWORK [NETWORK...]

关键参数:

  • -f, --format: 指定格式

示例:
在这里插入图片描述

docker network connect
功能:用于将容器连接到网络,可以按名称或 ID 连接容器。连接后,容器可以与同一网络中的其他容器通信。

语法:

docker network connect [OPTIONS] NETWORK CONTAINER

关键参数:

  • --ip: 指定 IP 地址
  • --ip6: 指定 IPv6 地址

示例:
在这里插入图片描述

docker network disconnect
功能:断开网络

语法:

docker network disconnect [OPTIONS] NETWORK CONTAINER

关键参数:

  • -f:强制断开

示例:docker network disconnect web1 mybox1
在这里插入图片描述

docker network prune
功能:删除不使用的网络

语法:

docker network prune [OPTIONS]

关键参数:

  • -f, --force:不提示

示例:
在这里插入图片描述

docker network rm
功能:删除 1 个或者多个网络

语法:

docker network rm NETWORK [NETWORK...]

关键参数:

  • -f: 强制删除

示例:
在这里插入图片描述

docker network ls
功能:列出网络

语法:

docker network ls [OPTIONS]

别名:docker network list
关键参数:

  • -f, --filter: 指定过滤条件
  • --format: 指定格式
  • --no-trunc: 不截断
  • -q,--quiet:仅仅显示id

示例:
在这里插入图片描述

三、网络模式的设置

docker Bridge网络

bridge网络结构:

              +---------------+|   Internet    |+-------+-------+|+--------+---------+|   Host eth0      || 192.168.1.100/24 |+--------+---------+|| (NAT)
+---------------------+------------------------+
|               docker0 Bridge                 |
|              172.17.0.1/16                   |
+--------+----------------------------+---------+|                            || (veth pair)                | (veth pair)|                            |
+--------+----------+       +---------+---------+
|   Container A     |       |   Container B     |
|                   |       |                   |
|    eth0:          |       |    eth0:          |
|   172.17.0.2/16   |       |   172.17.0.3/16   |
+-------------------+       +-------------------+

在创建容器时没有使用--network参数指定网络时,默认连接到docker模式。

  • 注意:docker 自定义桥接网络支持通过Docker DNS服务进行域名解析,也就是我们可以直接通过使用容器名进行通信,因为DNS服务可以解析容器名到IP地址的映射,但是默认的Bridge网络时不支持DNS的。

案例:让两个容器连接到同一个自定义网络进行通信

  1. 创建自定义网络web1
    • docker network create web1
  2. 创建并启动两个busybox容器,并且将容器连接到网络web1
    • docker run -itd --name=box1 --network web1 busybox
    • docker run -itd --name=box2 --network web1 busybox
  3. 进入box1容器检验是否能与box2通信
    • docker exec -it box1 sh
    • ping box2
    • exit
  4. 进入box2容器检验是否能与box1通信
    • docker exec -it box2 sh
    • ping box1
    • exit
  5. 创建一个容器box3使用默认的bridge
    • docker run -itd --name=box33 --name=box3 busybox
  6. 验证是否能进行DNS域名解析和是否能与使用自定义网络的容器通信
    • docker exec -it box3 sh
    • ping box1

效果如下:
在这里插入图片描述在这里插入图片描述

  • 注意:容器启动后,Docker 有时不会明确提示运行结果(成功 / 失败),因此建议每次启动容器后,通过docker psdocker ps -a命令检查容器状态。

3.1 host网络

host网络结构:

                            +---------------+|   Internet    |+-------+-------+|
+-------------------------------------------------+
|                   Docker Host                   |
|                                                 |
|  +---------------------+                        |
|  |   Host eth0         +------------------------+
|  | 192.168.1.100/24    |                        |
|  +---------------------+                        |
|                                                 |
|  +-------------------------------------------+  |
|  |              Container                    |  |
|  |                                           |  |
|  |  (直接使用宿主机的网络栈)                     |  |
|  |  (共享 eth0: 192.168.1.100/24)             |  |
|  +-------------------------------------------+  |
+-------------------------------------------------+

示例:

  1. 运行容器使用host网络
    • docker run -itd --name=box4 --network host busybox
  2. 检查宿主机网络配置信息和容器的网络配置信息是否相同
    • ifconfig
    • docker exec -it box4 ifconfig

该模式的缺点:宿主机和容器的端口是共用的,无隔离,所以不能让它们用相同的端口。

测试:

  1. 因为将宿主机nginx服务启动(默认是80端口)
    • nginx
  2. 启动一个nginx容器(默认使用的也是80端口)使用host网络,看是否出现冲突
    • docker run -d --name=web1 --network host nginx:1.24.0
  3. 检查该容器是否在正常运行
    • docker ps
    • docker ps -a

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2 container网络

container网络结构:

                      +---------------+|   Internet    |+-------+-------+|+--------+---------+|   Host eth0      || 192.168.1.100/24 |+--------+---------+|+--------+---------+|   docker0 Bridge ||  172.17.0.1/16   |+--------+---------+|| (veth pair)
+-------------------+       +--+-------------------+
|   Container A     |       |   Container B      |
|  (网络提供者)       |       |  (共享网络栈)       |
|                   |       |                    |
|    eth0:          |       |                    |
|   172.17.0.2/16   +-------+                    |
|                   |       | 使用Container A的   |
+-------------------+       | 网络命名空间         || eth0: 172.17.0.2/16|+-------------------+

该模式和host模式类似,只是对象换成了容器

示例:

  1. 启动box5容器以container模式连接到box1
    • docker run -itd --name=box5 --network container:box1 busybox
  2. 检查网络联通性
    • docker exec -it box5 ping www.baidu.com
    • docker exec -it box5 ifconfig
  3. 断开box1的网络,检查box5网络变化
    • docker network disconnect web1 box1
    • docker exec -it box5 ping www.baidu.com
    • docker exec -it box5 ifconfig
  4. 启动box1的网络,检查box5网络变化
    • docker network connect web1 box1
    • docker exec -it box5 ping www.baidu.com
    • docker exec -it box5 ifconfig

在这里插入图片描述
在这里插入图片描述

3.3 none网络

  none网络就是指没有网络,处于这个模式下的容器除了lo(本地环回),没有任何虚拟网卡。
示例:

  1. 创建并启动容器,网络设置为none模式
    • docker run -itd --name=box6 --network none busybox
  2. 尝试ping百度
    • docker exec -it box6 ping www.baidu.com
  3. 查看ifconfig
    • docker exec -it box6 ifconfig

效果:
在这里插入图片描述

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!在这里插入图片描述


文章转载自:

http://V31hUmaw.msfqt.cn
http://HIPE5N5h.msfqt.cn
http://BQT77n70.msfqt.cn
http://H66O0jsH.msfqt.cn
http://VC06p91e.msfqt.cn
http://AdFDrgtc.msfqt.cn
http://XDKv7PJI.msfqt.cn
http://jwH0Htmy.msfqt.cn
http://1mWyP8fv.msfqt.cn
http://6bDlsr9o.msfqt.cn
http://VslMlbSl.msfqt.cn
http://uyhiKemJ.msfqt.cn
http://yJ3uqb9e.msfqt.cn
http://AbzCJkp0.msfqt.cn
http://a3VkdlVT.msfqt.cn
http://yU3EH2eN.msfqt.cn
http://WB6RdTjY.msfqt.cn
http://cwDteBMh.msfqt.cn
http://mpUHSrTf.msfqt.cn
http://WxwFDqPV.msfqt.cn
http://Eeefmjiv.msfqt.cn
http://EjDJTVp5.msfqt.cn
http://C7gL3h4x.msfqt.cn
http://g1QmGSqs.msfqt.cn
http://OZ7GEpHh.msfqt.cn
http://sFW6qqdu.msfqt.cn
http://DHRRRLJ0.msfqt.cn
http://T44LTAyh.msfqt.cn
http://sWOl172h.msfqt.cn
http://xrChXWPD.msfqt.cn
http://www.dtcms.com/a/379676.html

相关文章:

  • AI 赋能云端运维:基于 MCP 协议深度集成 Codebuddy CLI 与腾讯云 Lighthouse 的实战全解
  • 《从 0 建立测试开发认知:先搞懂 “是什么”,再学 “怎么做”》
  • Flink1.17.0集群的搭建
  • #C语言——刷题攻略:牛客编程入门训练(十二):攻克 循环控制(四)、循环输出图形(一),轻松拿捏!
  • 面试经典150题[029]:三数之和(LeetCode 15)
  • Ubuntu 24.04 搭建k8s 1.33.4
  • 从数字后端角度谈谈occ电路(一)
  • Hadoop简介:分布式系统的基石与核心架构详解
  • [数据结构] 优先级队列(堆)
  • 计算机毕业设计 基于深度学习的酒店评论文本情感分析研究 Python毕业设计项目 Hadoop毕业设计选题 机器学习选题【附源码+文档报告+安装调试】
  • 数据结构 Java对象的比较
  • EDID 数据结构解析与编辑工具:校验和计算、厂商/设备名编解码、物理地址读写、颜色与时序信息提取
  • 龙蜥8.10中spark各种集群及单机模式的搭建spark3.5.6(基于hadoop3.3.6集群)
  • Hadoop MapOutputBuffer:Map高性能核心揭秘
  • Kubernetes 弹性伸缩:深入讲解 HPA 和 VPA
  • 代理服务器是什么?怎么选择?
  • java Redisson 实现限流每秒/分钟/小时限制N个请求 -V2.0
  • 高并发、低延迟全球直播系统架构
  • zookeeper是啥
  • 短波红外相机在机器视觉检测方向的应用
  • 阿里云国际代理:如何利用RDS构建高可用、可扩展的数据库架构
  • 【Python】通俗理解反向传播
  • RFID技术在半导体电子货架上的应用方案
  • Windows 安装 Redis 教程
  • CMake 全流程开发实战:从零开始掌握C++项目构建、测试到一键分发的完整解决方案​
  • 如果数据量小但是点击后需要获取的是最新的定位信息,这种时候采取什么策略最优?
  • 使用 Pyinstaller 打包 PPOCRLabel
  • 科技信息差(9.12)
  • 是德科技 | 关于AI 数据中心时代的光通信的精选问答
  • 深入剖析 Elasticsearch (ES) 的近实时搜索原理