【Docker】Docker的网络

news2024/11/16 8:28:28

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              veth4bdfd60
                                                        vethe5ed0e4

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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0

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

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

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

相关文章

Pytorch代码入门学习之分类任务(一):搭建网络框架

目录 一、网络框架介绍 二、导包 三、定义卷积神经网络 3.1 代码展示 3.2 定义网络的目的 3.3 Pytorch搭建网络 四、测试网络效果 一、网络框架介绍 网络理解&#xff1a; 将32*32大小的灰度图片&#xff08;下述的代码中输入为32*32大小的RGB彩色图片&#xff09;&…

论多段图的最短路径问题(我认为本质上还是暴力枚举法)

比如说这道题&#xff1a;我向前推进 从0到11的最短路径 按照图可以分5段&#xff0c;v1 是第一阶段 0&#xff0c;v2是第二段 有1&#xff0c;2&#xff0c;3&#xff0c;4 从0开始&#xff0c;路径为0&#xff0c;所以m&#xff08;1&#xff0c;0&#xff09;0&#xff1b…

单片机核心/RTOS必备 (ARM汇编)

ARM汇编概述 一开始&#xff0c;ARM公司发布两类指令集&#xff1a; ARM指令集&#xff0c;这是32位的&#xff0c;每条指令占据32位&#xff0c;高效&#xff0c;但是太占空间。Thumb指令集&#xff0c;这是16位的&#xff0c;每条指令占据16位&#xff0c;节省空间。 要节…

reqable(小黄鸟)+雷电抓包安卓APP

x 下载证书保存到雷电模拟器根目录(安装位置) 在根目录打开cmd执行命令 F:\Program\leidian\LDPlayer9>adb push reqable-ca.crt /system/etc/security/cacerts/364618e0.0 reqable-ca.crt: 1 file pushed, 0 skipped. 0.8 MB/s (1773 bytes in 0.002s)如果是powershell…

Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)

案例需求分析 直播公司每日都会产生海量的直播数据&#xff0c;为了更好地服务主播与用户&#xff0c;提高直播质量与用户粘性&#xff0c;往往会对大量的数据进行分析与统计&#xff0c;从中挖掘商业价值&#xff0c;我们将通过一个实战案例&#xff0c;来使用Hadoop技术来实…

Node编写更新用户头像接口

目录 定义路由和处理函数 验证表单数据 ​编辑 实现更新用户头像的功能 定义路由和处理函数 向外共享定义的更新用户头像处理函数 // 更新用户头像的处理函数 exports.updateAvatar (req, res) > {res.send(更新成功) } 定义更新用户头像路由 // 更新用户头像的路由…

Liunx-Kubernetes安装

安装Kubernetes Kubernetes有多种部署方式&#xff0c;目前主流的方式有kubeadm、minikube、二进制包 minikube&#xff1a;一个用于快速搭建单节点kubernetes的工具kubeadm&#xff1a;一个用于快速搭建kubernetes集群的工具二进制包&#xff1a;从官网下载每个组件的二进制…

浏览器多开,数据之间相互不干扰

方法很简单 在浏览器快捷方式中&#xff0c;快捷键点开属性&#xff0c;在目标中添加--user-data-dirD:\chrome\1

【蓝桥每日一题]-贪心(保姆级教程 篇1)#拼数 #合并果子 #凌乱yyy

目录 题目&#xff1a; 拼数 思路&#xff1a; 题目&#xff1a; 合并果子 思路&#xff1a; 题目&#xff1a;凌乱yyy 思路&#xff1a; 题目&#xff1a;拼数 思路&#xff1a; 思路很简单。举个例子&#xff1a;对于a321,b32。我们发现ab32132,ba32321&#xff0c;那么…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下&#xff0c;让函数、接口或类与多种类型一起工作&#xff0c;从而实现复用 基本使用 举个例子&#xff1a; 创…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码&#xff1a;https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

解决:vscode和jupyter远程连接无法创建、删除文件的问题(permission denied)

目录 问题&#xff1a;vscode和jupyter远程连接服务器无法创建、删除文件的问题原因&#xff1a;代码文件的权限不够解决方法&#xff1a;1.ls -l查看目录所在组&#xff0c;权限2.chown修改拥有者和所在组 问题&#xff1a;vscode和jupyter远程连接服务器无法创建、删除文件的…

【兔子王赠书第3期】《案例学Python(进阶篇)》

文章目录 前言推荐图书本书特色本书目录本书样章本书读者对象粉丝福利丨评论免费赠书尾声 前言 随着人工智能和大数据的蓬勃发展&#xff0c;Python将会得到越来越多开发者的喜爱和应用。因为Python语法简单&#xff0c;学习速度快&#xff0c;大家可以用更短的时间掌握这门语…

Spring学习笔记—JDK动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Unity中Shader的ShaderLOD

文章目录 前言一、ShaderLOD的使用步骤1、ShaderLOD使用在不同的SubShader中&#xff0c;用于区分SubShader所对应的配置2、在 C# 中使用 Shader.globalMaximumLOD 赋值来选择不同的 SubShader,以达到修改配置对应Shader的效果3、在设置LOD时&#xff0c;是需要和程序讨论统一 …

WebGL笔记:矩阵的变换之平移的实现

矩阵的变换 变换 变换有三种状态&#xff1a;平移、旋转、缩放。当我们变换一个图形时&#xff0c;实际上就是在移动这个图形的所有顶点。解释 webgl 要绘图的话&#xff0c;它是先定顶点的&#xff0c;就比如说我要画个三角形&#xff0c;那它会先把这三角形的三个顶点定出来…

为什么需要山洪灾害监测预警系统?

在山洪高发地区&#xff0c;安装山洪灾害监测预警系统能够通过实时监测&#xff0c;预警山洪信息&#xff0c;对于保障我们的生命财产安全具有重要意义。 监测山洪不仅需要对山体进行监测&#xff0c;还要监测降雨量以及水位上升情况。山洪灾害监测预警系统是由GNSS监测站和水…

linux安装node(含npm命令) 并配置淘宝镜像源

1. 下载压缩包 wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz # node14 https://nodejs.org/dist/v14.15.4/node-v14.15.4-linux-x64.tar.xz # 推荐将压缩包放置到/usr/local/node文件夹中安装 mv node-v16.14.0-linux-x64.tar.xz /usr/local/node …

LeetCode217——存在重复元素

LeetCode217——存在重复元素 1.题目描述&#xff1a; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 2.Result01(暴力解) public static boolean containsDuplicate(in…

SRAM与DRAM的区别

目录 SRAM 特点 应用场景 DRAM 特点 应用场景 SRAM和DRAM的区别 SRAM SRAM&#xff08;静态随机存取存储器&#xff09;是一种用于存储和检索数据的类型的计算机内存。SRAM的存储单元通过触发器&#xff08;flip-flop&#xff09;实现&#xff0c;它们可以保持数据的状态…