【Docker】Docker的网络

Docker提供了多种内置的网络模式,用于在容器之间建立网络连接。这些网络模式,包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。

桥接网络

桥接网络是Docker的默认网络模式。在桥接网络中,Docker会为每个容器创建一个虚拟网络接口,并为容器分配一个IP地址。容器可以通过桥接网络与主机和其他容器进行通信。


桥接网络适用于单主机上的多个容器之间的通信,例如微服务架构中的多个服务容器之间的通信。

优点

隔离性:每个容器都有独立的网络命名空间,相互之间隔离,不会互相干扰。
简单易用:桥接网络是默认的网络模式,无需额外配置,容器可以直接进行通信。
跨主机通信:可以通过端口映射实现容器与主机之间的通信,也可以使用Overlay网络实现跨主机通信。

缺点

性能损失:桥接网络需要进行网络地址转换(NAT),可能会引入一定的性能损失。
端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。

使用默认网络

桥接网络是默认的网络模式,无需额外配置。通过docker run命令创建容器时,可以使用--network bridge参数指定使用桥接网络,当然因为是默认的,也可以选择不加。

创建两个容器,不指定网络名称:

$ docker container run -d --rm --name box1 busybox /bin/sh -c "while true; do sleep 3600; done"
688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d$ docker container run -d --rm --name box2 busybox /bin/sh -c "while true; do sleep 3600; done"
141723898adb64074b223d8823a4b7c8712eb405d4c1542212e09c4f17682c18$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
141723898adb   busybox   "/bin/sh -c 'while t…"   12 seconds ago   Up 10 seconds             box2
688c36657741   busybox   "/bin/sh -c 'while t…"   59 seconds ago   Up 58 seconds             box1

查询容器使用的网络名称:

$ docker container inspect box3
[{"Id": "688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d",。。。 。。。"Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "28e45b9b8f4b19c29f07c732883ccfeab6640dc37a0824b2790f6ea0b7a0ef6a","EndpointID": "21781c6badbb0beb33320c6e9cb307582e60ed02050d5102f9dd21d579d1b5d9","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

可以看到容器默认使用的网络为bridge。

使用自定义网络

创建一个网络名称为mynetwork的网络:

$ docker network create mynetwork$ docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
28e45b9b8f4b   bridge      bridge    local
29c08e905dab   host        host      local
975a764ee90c   mynetwork   bridge    local
d466db2f54a1   none        null      local

创建容器时指定网络名称:

$ docker container run -d --rm --name box3 --network=mynetwork busybox /bin/sh -c "while true; do sleep 3600; do
ne"
25ab55282fb9c132e33b67d01f14f870c0ab6cfa2c4b11245a2f865267607d05$ docker container run -d --rm --name box4 --network=mynetwork busybox /bin/sh -c "while true; do sleep 3600; do
ne"
a8e936928386993b701c7669eb5cdfc4759749d22ab750ebdee5e6970dec2946

查询容器使用的网络名称:

[{"Id": "25ab55282fb9c132e33b67d01f14f870c0ab6cfa2c4b11245a2f865267607d05",。。。。。。"Networks": {"mynetwork": {"IPAMConfig": null,"Links": null,"Aliases": ["25ab55282fb9"],"NetworkID": "975a764ee90c7184df5e1dccec3dd0e9b61d4277f0f64b5a7dd12d5d3bdba31c","EndpointID": "f11f396221cab0a09565175b87bf5c492dc127d11231f6c098ca7a3be018d592","Gateway": "172.18.0.1","IPAddress": "172.18.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:12:00:02","DriverOpts": null}}}}
]

使用自定义网络的容器之间可以使用容器的名称进行通讯,而使用默认网络的容器之间不能使用容器的名称进行通讯:

$ docker container exec -it box3 ping box4
PING box4 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.780 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.069 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.123 ms
^C
--- box4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.324/0.780 ms

从Docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过容器名称通信。这样,容器1和容器2可以通过它们的容器名称 “container1” 和 “container2” 进行通信,而不必记住它们的IP地址。

容器间通信的原理

查看网络的详细信息:

$ docker network inspect bridge
[{"Name": "bridge","Id": "28e45b9b8f4b19c29f07c732883ccfeab6640dc37a0824b2790f6ea0b7a0ef6a","Created": "2023-10-07T10:05:47.8123729+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"141723898adb64074b223d8823a4b7c8712eb405d4c1542212e09c4f17682c18": {"Name": "box2","EndpointID": "ba6e4d32c3346cdeff733f1cb3dea2b1693db5212f8fb3c66ed9c83ea5bb0656","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""},"688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d": {"Name": "box1","EndpointID": "21781c6badbb0beb33320c6e9cb307582e60ed02050d5102f9dd21d579d1b5d9","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""}},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0","com.docker.network.bridge.name": "docker0","com.docker.network.driver.mtu": "1500"},"Labels": {}}
]

可以看到这个网络的网关地址、网段、子网掩码,以及哪些容器使用了这个网络,连接在同一个网络的容器具有相同的网段和相同的网关地址,他们之间可以通过网关地址互相通信。

可以使用命令brctl来查看操作系统中bridge的名称:

$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242af8acacd       no              veth4bdfd60vethe5ed0e4

brctl使用前需要安装, 对于CentOS, 可以通过sudo yum install -y bridge-utils安装。对于Ubuntu, 可以通过sudo apt-get install -y bridge-utils

容器对外通信的原理

查看容器内的路由:

$ docker container exec -it box3 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

查看主机的路由:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.32.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.17.32.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-975a764ee90c

主机网络

在主机网络模式下,容器与主机共享网络命名空间,直接使用主机的网络接口和IP地址。容器可以通过主机网络与主机和其他容器进行通信。

主机网络模式适用于对网络性能要求较高的场景,例如需要直接访问主机上的网络资源或与主机进行高性能通信的容器。

优点

性能优势:与桥接网络相比,主机网络模式可以提供更高的网络性能,因为容器直接使用主机的网络接口,无需进行额外的网络地址转换。
简化网络配置:容器与主机共享网络命名空间,无需进行端口映射或网络转发配置。

缺点

安全性降低:容器与主机共享网络命名空间,容器可以直接访问主机上的网络资源,可能会增加安全风险。
端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。

使用主机网络

在创建容器时,可以使用–network host参数指定使用主机网络模式。

$ docker container run --rm -it -d --name nginx --network=host nginx
121043d8367c0be214d5ac459b2890601e1013faf581b5a2ff9a9c9842c5f085$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

可以看到容器内的IP和主机的IP是一致的:

$ hostname -I
172.17.35.208 172.17.0.1 172.18.0.1$ docker container exec -it tomcat hostname -I
172.17.35.208 172.17.0.1 172.18.0.1

注意端口冲突:由于容器与主机共享网络命名空间,需要确保容器使用的端口号在主机上是唯一的。

考虑安全性:主机网络模式可能会降低容器的安全性,需要谨慎使用,并确保适当的安全措施。

无网络

在无网络模式下,容器没有网络接口,与外部网络完全隔离。这种模式适用于不需要网络连接的容器,例如批处理任务或与网络无关的应用。

注意容器需求:确保选择无网络模式的容器真正不需要进行网络通信,以避免功能受限或无法满足业务需求。

优点

安全性增强:无网络模式下的容器与外部网络完全隔离,可以提供更高的安全性。
资源节省:无网络模式下的容器不需要网络接口和IP地址,可以节省网络资源。

缺点

无法进行网络通信:容器无法与外部网络或其他容器进行通信。

使用无网络模式

在创建容器时,可以使用–network none参数指定使用无网络模式。

$ docker container run --rm -it --network=none centos bash
[root@0550683ce170 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/sit 0.0.0.0 brd 0.0.0.0

可以看到容器只有一个本地回环地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/122133.shtml

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

相关文章

数字音频工作站软件 Ableton Live 11 mac中文软件特点与功能

Ableton Live 11 mac是一款数字音频工作站软件&#xff0c;用于音乐制作、录音、混音和现场演出。它由Ableton公司开发&#xff0c;是一款极其流行的音乐制作软件之一。 Ableton Live 11 mac软件特点和功能 Comping功能&#xff1a;Live 11增加了Comping功能&#xff0c;允许用…

【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一&#xff1a;Agentless&#xff0c;即无Agent的存在1.3.2 特性二&#xff1a;幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…

【linux】SourceForge 开源软件开发平台和仓库

在linux上面安装服务和工具。我们经常会下载安装包。今天推荐一个网站。 SourceForge 开源软件开发平台和仓库 ​ 全球最大开源软件开发平台和仓库 SourceForge.net&#xff0c;又称SF.net&#xff0c;是开源软件开发者进行开发管理的集中式场所。 SourceForge.net由VA Softwa…

【JAVA学习笔记】50 - Math类,Array类,System类,BigInteger和BigDecimal类

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter13/src/com/yinhai/wrapper_/math_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter13/src/com/yinhai/wrapper_/array_ https://github.com/yinhai1114/Java_Lea…

经常遇到的问题

一个前端经常会遇到的问题 例如&#xff0c;我想要在一个项目里&#xff0c;监听所有的fetch请求&#xff0c;应该怎么办&#xff1f;又或者说&#xff0c;我想用别人封装好的方法&#xff0c;但是在它之前&#xff0c;需要经过一层处理、判断&#xff0c;然后再看情况是否调用…

【iPad已停用】解锁教程

iPad多次输错密码时&#xff0c;会自动锁定并停用&#xff0c;这时候你可以使用iTuens或Tenorshare进行解锁。 一、使用iTunes解锁 下载并安装iTunes 使用数据线将iPad连接上电脑 让iPad进入恢复模式&#xff0c;同时安装iPad电源键和Home键&#xff0c;直到Logo出现也不要松…

【爬虫】python打包可执行程序(ui界面制作完成后)

1.安装pyinstaller pip install pyinstaller可能出现连接超时安装不上的情况,可以切换源进行下载 pip install -i http://pypi.douban.com/simple/ pyinstaller2.打包程序 pyinstaller xxxxx.py --noconsole --hidden-import PySide6.QtXml

JVM性能优化 —— 类加载器,手动实现类的热加载

一、类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑&#xff0c;这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件&#xff0c;”.class”文件中保存着Java代码经转换后的虚拟机指令&#xff0c;当需要使用某个类时&#…

docker和K8S环境xxl-job定时任务不执行问题总结

文章目录 xxl-job 任务调度原理1 问题1 时区导致的任务没有执行的问题解决方案 2 执行器注册和下线导致的问题&#xff08;IP问题&#xff09;解决方案 3 问题3 调度成功&#xff0c;但是执行器的定时任务未执行4 问题4 数据库性能问题&#xff0c;导致查询任务和操作日志数据卡…

kaggle新赛:AI Village夺旗赛挑战

赛题名称&#xff1a;AI Village Capture the Flag DEFCON31 赛题链接&#xff1a;https://www.kaggle.com/competitions/ai-village-capture-the-flag-defcon31 赛题背景 夺旗赛这款广受欢迎的竞技游戏&#xff0c;不仅可以在户外进行。数字夺旗赛指的是一系列需要参赛者利…

软考系列(系统架构师)- 2011年系统架构师软考案例分析考点

试题一 软件架构&#xff08;质量属性效用树、架构风险、敏感点、权衡点&#xff09; 【问题2】&#xff08;13分&#xff09; 在架构评估过程中&#xff0c;需要正确识别系统的架构风险、敏感点和权衡点&#xff0c;并进行合理的架构决策。请用300字以内的文字给出系统架构风险…

【Python爬虫三天从0到1】Day1:爬虫核心

目录 1.HTTP协议与WEB开发 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;请求协议和响应协议 2. requests&反爬破解 &#xff08;1&#xff09;UA反爬 &#xff08;2&#xff09;referer反爬 &#xff08;3&#xff09;cookie反爬 3.请求参数 &#x…

大厂面试题-Java并发编程基础篇(二)

目录 一、wait和notify这个为什么要在synchronized代码块中&#xff1f; 二、ThreadLocal是什么&#xff1f;它的实现原理呢&#xff1f; 三、基于数组的阻塞队列ArrayBlockingQueue原理 四、怎么理解线程安全&#xff1f; 五、请简述一下伪共享的概念以及如何避免 六、什…

设计模式(16)迭代器模式

一、介绍&#xff1a; 1、定义&#xff1a;迭代器模式 (Iterator Pattern) 是一种行为型设计模式&#xff0c;它提供一种顺序访问聚合对象&#xff08;如列表、集合等&#xff09;中的元素&#xff0c;而无需暴露聚合对象的内部表示。迭代器模式将遍历逻辑封装在一个迭代器对象…

centos7安装配置以及Linux常用命令

⭐⭐ linux专栏&#xff1a;linux专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.CentOS的安装 使用vi编辑ifcfg-ens33 二. 下载MobaXterm软件 2.1MobaXterm的用途 2.2 MobaXterm的使用 2.3下载插件vim 三.Linux常用命令 3.4 vi或vim编辑器 3.4.1 命令模式 3.4.2.…

StripedFly恶意软件框架感染了100万台Windows和Linux主机

导语 近日&#xff0c;一款名为StripedFly的恶意软件框架在网络安全研究人员的监视之外悄然感染了超过100万台Windows和Linux系统。这款跨平台的恶意软件平台在过去的五年中一直未被察觉。在去年&#xff0c;卡巴斯基实验室发现了这个恶意框架的真实本质&#xff0c;并发现其活…

SpringDoc上传附件或文件 - Swagger3

摘要 从Swagger2 升级到 Swagger3 之后发现对于附件出现了问题。 依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version></dependency>问题描述 在Sw…

基于51单片机的四种波形信号发生器仿真设计(仿真+程序源码+设计说明书+讲解视频)

本设计 基于51单片机信号发生器仿真设计 &#xff08;仿真程序源码设计说明书讲解视频&#xff09; 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0015 这里写目录标题 基于51单片机信号发生…

父子项目打包发布至私仓库

父子项目打包发布至私仓库 1、方法一 在不需要发布至私仓的模块上添加如下代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><configuration><skip>true</s…