Docker:6种网络配置详解浅介

        在Docker中,网络配置是一个重要的主题,因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和配置选项,以便在不同的场景下满足用户的需求。
本文介绍这些网络模式的区别以及配置,相信看完以后你能够掌握Docker网络的配置以及适应不同的场景做出不同的选择。

一、Bridge网络模式

        Docker Bridge网络模式是Docker默认的网络模式,它将容器连接到Docker宿主机的虚拟网络中,并为每个容器分配一个IP地址。容器之间可以通过IP地址直接通信,也可以通过容器名称进行通信。

        在Bridge网络模式下,Docker会为每个容器创建一个虚拟网桥,容器之间的通信都是通过这个虚拟网桥进行的。Docker宿主机上的所有容器都连接到这个虚拟网桥上,而Docker宿主机本身也是通过一个特殊的容器(名为docker0)连接到这个虚拟网桥上的。

        当Docker创建容器时,它会自动为容器分配一个IP地址,并将该地址添加到虚拟网桥的配置中。这样,在容器之间通信时,就可以使用这个IP地址进行通信了。

        需要注意的是,Bridge网络模式下的容器只能和同一台主机上的容器通信,无法和其他主机上的容器通信。如果需要实现跨主机通信,可以使用Docker的Overlay网络模式。

        使用以下命令带--network bridge选项可以指定启用bridge模式,因为这个模式是默认模式,所以即使完全不指定也是默认使用此模式。

docker run -itd --name mycontainer --network bridge nginx

本地已经启动了2个容器,是一个springboot应用,通过docker命令可以查看到容器的id

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2d1fd1adc1c7        demo:latest         "java -jar demo-0...."   3 seconds ago       Up 2 seconds        0.0.0.0:8081->8080/tcp   optimistic_mirzakhani
b8a144de27a9        demo:latest         "java -jar demo-0...."   4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp   unruffled_mccarthy

使用docker exec命令可以进入容器内部查看IP地址和测试容器与其他容器以及宿主机之间的连通性。

[root@node1 ~]# docker exec -it b8a144de27a9 sh
[root@node1 ~]# docker exec -it 2d1fd1adc1c7 sh

可以看到分别为两个容器分配了IP地址:172.17.0.2和172.17.0.3。

        他们之间可以相互ping通,且ping宿主机172.17.0.1网络也是相通的。

通过查看主机的网络,也可以发现有一个docker0的网桥,且IP地址设置为了172.17.0.1。

宿主机也可以访问容器中暴露出来的服务,例如如下访问8080端口暴露的web服务。

二、Host网络模式

        在Host网络模式下,容器将直接使用宿主机的网络接口,这样容器就可以像宿主机一样,使用主机的IP地址和端口。因此,这种模式下的容器与主机之间没有网络隔离,但它们与其他容器之间则是隔离的。

与其他Docker网络模式相比,Host网络模式的主要特点包括:

  • 简单易用:不需要对容器进行网络配置,与宿主机直接共享网络。
  • 性能高:因为容器与宿主机共享网络,容器之间的通信无需经过网络层,可以获得更高的网络性能。
  • 安全性较低:容器与宿主机共享网络,容器之间的网络隔离会降低,容器中的应用程序可以直接访问宿主机上的网络接口。

        Host网络模式适用于一些特定场景,例如需要访问宿主机上的网络接口、需要最大化网络性能、需要简单易用的网络设置等。

        可以通过在运行容器时指定–network=host选项来启动,类似上面Bridge网络模式的验证流程,我们再次创建两个容器。

[root@node1 ~]# docker run -d -p 8080:8080 demo:latest --network host
683e6d67f93ec2546b1627fa68c0902da749daaaeea4be344b9f0320f183fe69
[root@node1 ~]# docker run -d -p 8081:8080 demo:latest --network host
081bd021af82e63094df42fee80f0a58f7fe0bcc36e19f28b18b6b9619863e45

        同样进入这两个容器进行连通性验证,发现都是能够正常联通的。且直接从容器中可以访问百度网络,证明与宿主机共享了网络。

三、Overlay网络模式

        Overlay网络模式用于连接跨主机的容器。在这种模式下,Docker会创建一个虚拟网络,所有连接到这个虚拟网络的容器都可以相互通信,无论这些容器运行在哪个主机上。Overlay网络模式需要使用Docker Swarm集群管理工具来管理多个Docker主机之间的通信。

        这里启动两个虚拟机,分别在两个虚拟机上各创建1个容器。在使用Overlay网络模式前,需要先创建一个Overlay网络:

docker network create --driver overlay mynetwork

创建一个使用Overlay网络模式的容器:

docker run -itd --name demo --network mynetwork demo:latest

在不同主机上启动多个容器,并连接到同一个Overlay网络:

docker run -itd --name demo1 --network mynetwork demo:latest

在容器内部,使用ping命令测试容器之间是否可以相互通信:

docker exec -it demo ping demo1

发现是可以正常通信的。

四、None网络模式

        在None网络模式下,容器不会拥有任何网络接口,也没有IP地址,因此无法与外部网络通信。这种模式通常用于特殊场景,例如需要禁用网络功能的容器。

创建一个使用Host网络模式的容器:

docker run -itd -p 8080:8080 --name demo --network none demo:latest

进入容器内部,可以看到只有一个lo回环网络,没有分配任何IP地址。

五、Macvlan网络模式

        Macvlan是一种容器网络模式,它允许Docker容器直接连接到主机的物理网络接口。这使得容器能够直接获得一个IP地址,并且在网络上可以像主机一样运行。Macvlan网络模式的优点是容器的网络性能非常好,而且可以实现容器与主机在同一局域网内相互通信。

        在使用Macvlan网络模式时,需要指定一个父网卡(parent interface),也就是一个物理网卡,容器将使用该网卡进行通信。容器可以使用静态IP地址或从DHCP服务器获取IP地址。与其他网络模式相比,Macvlan网络模式的缺点是较为复杂,配置也相对困难。

以下是在Docker中配置和使用Macvlan网络模式的步骤:

        1、首先,需要创建一个Macvlan网络。可以使用以下命令来创建:

docker network create -d macvlan \
  --subnet=<subnet> \
  --gateway=<gateway> \
  -o parent=<physical_interface> \
  <network_name>

        其中,<subnet>是一个可用于Macvlan网络的子网地址,例如192.168.1.0/24;<gateway>是Macvlan网络的网关地址,例如192.168.1.1;<physical_interface>是宿主机上用于连接到物理网络的接口名称,例如eth0或enp0s3;<network_name>是Macvlan网络的名称。
        2、接下来,需要在Docker容器中使用这个Macvlan网络。可以使用以下命令来运行容器:

docker run -itd \
  --name=<container_name> \
  --network=<network_name> \
  --ip=<ip_address> \
  <image_name>

其中,<container_name>是容器的名称;<network_name>是上一步中创建的Macvlan网络的名称;<ip_address>是要分配给容器的IP地址,必须是Macvlan网络中的可用地址;<image_name>是要运行的Docker镜像名称。

        3、容器现在应该已经成功连接到了宿主机上的物理网络,可以使用分配给容器的IP地址来访问容器中运行的服务。

需要注意的是,Macvlan网络模式需要宿主机的网卡支持802.1q VLAN标记,且容器不能与宿主机共享网络命名空间。

六、Ipvlan网络模式

        Ipvlan网络模式是另一种容器网络模式,它允许Docker容器使用主机的IP地址来访问网络。不同于Macvlan模式,Ipvlan模式中的容器不需要使用主机的物理网卡,而是通过虚拟的MAC地址来访问网络。Ipvlan模式的优点是配置简单,而且性能也不错。

        Ipvlan网络模式支持两种模式:L2模式L3模式。L2模式使用与Macvlan模式相似的技术,允许容器与主机在同一子网内。L3模式则允许容器与主机在不同的子网内,需要通过路由器进行通信。

要在Docker中配置Ipvlan网络模式,需要以下步骤:

1、创建Ipvlan网络
首先,使用以下命令创建一个新的Ipvlan网络:

luaCopy codedocker network create -d ipvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=en0 \
  ipvlan-network

其中:

  • -d ipvlan 指定网络驱动程序为Ipvlan
  • --subnet 指定网络子网
  • --gateway 指定网络网关
  • -o parent 指定网络接口,这里是Mac上的en0
  • ipvlan-network 是网络的名称

2、启动容器
现在可以启动一个新的容器,并将其连接到Ipvlan网络:

cssCopy codedocker run --name=my-container \
  --network=ipvlan-network \
  --ip=192.168.1.100 \
  -d \
  nginx

其中:

  • --name 指定容器的名称
  • --network 指定容器连接的网络
  • --ip 指定容器的IP地址
  • -d 指定容器在后台运行
  • nginx 是要运行的容器镜像名称

七、网络模式选择

        基于以上介绍做一下Docker网络模式适用场景的总结:

  1. bridge(默认):这种模式适合在单台主机上运行多个容器的场景,且多个容器之间需要互相访问。
  2. host:容器和主机共享网络命名空间和网络接口。这种模式可以实现最大的网络性能和最小的网络延迟,适合需要高网络性能的场景。
  3. none:容器没有网络连接。这种模式适用于特殊的情况,如仅用于生成数据卷的容器。
  4. overlay:在 Docker Swarm 模式下使用的网络模式,允许容器在不同主机上的 Docker 引擎中通信。这种模式适合分布式应用程序的场景。
  5. macvlan:将容器连接到物理网络,每个容器分配一个 MAC 地址。这种模式适合需要容器使用主机网络拥有独立 IP 地址的场景,如在企业内部网络中运行容器,暴露相关的服务供内部人员使用。
  6. ipvlan:类似于 macvlan,但容器共享物理接口,可以更有效地使用网络带宽。这种模式适用于需要在容器之间共享网络命名空间的场景。
     

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

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

相关文章

100 道 Linux 面试题 附答案(二)

五、编程题 判断一文件是不是字符设备文件&#xff0c;如果是将其拷贝到 /dev 目录下&#xff1f; #!/bin/bash read -p "Input file name: " FILENAME if [ -c "$FILENAME" ];thencp $FILENAME /dev fi添加一个新组为 class1 &#xff0c;然后添加属于这…

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码&#xff08;配置文件&#xff09;application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性&#xff0c;这些属性将由…

Python如何按指定列的空值删除行?

目录 1、按指定列的空值删除行2、滑动窗口按指定列的值填充最前面的缺失值 1、按指定列的空值删除行 数据准备&#xff1a; df pd.DataFrame({C1: [1, 2, 3, 4], C2: [A, np.NaN, C, D], C3: [V1, V2, V3, np.NaN]}) print(df.to_string()) C1 C2 C3 0 1 A V1 1 …

写作的金字塔原则

起源 芭芭拉明托 (Barbara Minto) 是 20 世纪 70 年代麦肯锡公司培训主管&#xff0c;她创立了金字塔原则。1963 年从哈佛商学院毕业后&#xff0c;明托加入了麦肯锡公司。在前往该公司位于巴黎和杜塞尔多夫的办公室出差时&#xff0c;她遇到了与她在美国和英国见过的同样的写作…

用的到的linux-Day1

前言&#xff1a; 从入门IT开始我们知道Linux操作系统与其他操作系统不同&#xff0c;Linux因为其独特的优势&#xff0c;被广泛应用在服务器领域&#xff0c;而且是一个近乎完美的操作系统&#xff0c;运行稳定、功能强大、安全性高、开源、可定制等等。 因此我打算从24年开始…

爬虫(一)

1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;…

如何根据ASheet中的A字段去查询BSheet中的A字段,然后把BSheet中的B字段回填到ASheet的I字段?

问题描述 我想在excel中根据第一个sheet页中的第一个字段A&#xff0c;作为查找条件&#xff0c;去第二个sheet页中查询第一个字段A&#xff0c;如果查询到了&#xff0c;把第二个sheet页中的第二个字段B的值&#xff0c;填充到第一个sheet页中I字段。 其实之前也用到过Excel…

智能文本编辑代码

智能文本编辑代码 智能文本编辑代码智能文本编辑代码 from glob import globclass ZhiWen:def __init__(self, root):self.path = glob(root + "/*.txt")

力扣面试题 16.24. 数对和(双指针)

Problem: 面试题 16.24. 数对和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 若本题目直接双循环暴力求解会超时&#xff0c;可以利用排序 双指针进行优化&#xff0c;具体&#xff1a; 1.对原数组进行升序排序&#xff1b; 2.双指针指向排好序的数组的头尾(…

美易平台:起亚公司第四季度净利润未达预期,但仍保持稳健增长

近日&#xff0c;韩国汽车制造商起亚公司公布了其第四季度的财务报告。根据报告显示&#xff0c;起亚公司第四季度净利润为1.62万亿韩元&#xff0c;略低于市场预期的2.16万亿韩元。尽管未能达到预期&#xff0c;但该公司仍然保持着稳健的增长态势。 起亚公司作为全球知名的汽…

【方法】如何打开7Z格式压缩文件?

7Z是一种常见的压缩文件格式&#xff0c;那遇到7Z压缩文件&#xff0c;要如何打开呢&#xff1f; 想要打开7Z压缩包&#xff0c;需要用到解压缩软件&#xff0c;比如WinRAR、7-Zip等软件。安装软件后&#xff0c;只需要用鼠标双击7Z压缩包&#xff0c;就可以打开压缩包&#x…

基于SSM的蛋糕甜品店管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的蛋糕甜品店管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

支付宝推出新年“五福节”活动,新增四大AI玩法;大型语言模型综合指南

&#x1f989; AI新闻 &#x1f680; 支付宝推出新年“五福节”活动&#xff0c;新增四大AI玩法 摘要&#xff1a;支付宝宣布今年的“集五福”活动升级为“五福节”&#xff0c;新增了四大AI玩法&#xff1a;飙戏小剧场、时空照相馆、会说话红包和大家来找福。用户可以通过拼…

RUST笔记 FireDBG| Rust 代码调试器

安装https://firedbg.sea-ql.org/blog/2023-12-12-introducing-firedbg/ 更新VSCODE sudo dpkg -i code_1.85.2-1705561292_amd64.deb 安装FireDBG binaries (base) pddpdd-Dell-G15-5511:~$ curl https://raw.githubusercontent.com/SeaQL/FireDBG.for.Rust/main/install.sh …

GBK+大小写不敏感组合报错(DM8达梦数据库)

DM8达梦数据库 GBK大小写不敏感组合报错 环境介绍1 不支持的版本列表2 报错内容 环境介绍 在个别版本中,达梦数据库不支持gbk大小写不敏感的组合,若一定要用这个组合,只能换新的版本数据库; 1 不支持的版本列表 dm8.1-1-156-21.01.20 dm8.2-1-144-20.11.20-130135-SEC SPE P…

dataGrip连接数据库mysql和intersystems的iris

文章目录 前言创建新项目选择对应的数据库产品类型新建数据库资源连接sql命令窗体手动配置本地驱动 前言 intersystems公司的产品iris是cache的升级版本&#xff0c;目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/da…

1822. 数组元素积的符号(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;知识点&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x …

AtCoder Beginner Contest 337

A nint(input())a,b0,0 for i in range(n):x,ymap(int,input().split())axby if a>b:print("Takahashi") elif a<b:print("Aoki") else:print("Draw")B A B C必须都连着放&#xff0c;且必须按照ABC的顺序 分别给ABC赋值&#xff0c;有小…

Domain Socket

目录 一、基本介绍 二、C Demo 1、Stream Domain Socket 1.1 Client 1.2 Server 2、Datagram Domain Socket 2.1 Client 2.2 Server 三、Java 应用 一、基本介绍 Unix域套接字&#xff08;Unix Domain Socket&#xff09;是基于 socket 框架上发展出的一种 IPC 机制…

初步认识并发编程的艺术

一、Java内存模型 JMM&#xff08;Java Memory Model&#xff09;&#xff1a;Java 内存模型&#xff0c;是 Java 虚拟机规范中所定义的一种内存模型&#xff0c;Java 内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别。也就是说&#xff0c;JMM 是 JVM 中定义的一…