【Docker】网络配置的三种方式

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《Docker实战》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

✨前言

一、网络相关

1.子网掩码

1.1.子网掩码的组成

1.2.子网掩码的表示方法

 1.3.子网掩码的分类

2.网关

3.规则

二、Dockers的网络配置

1.bridge模式

2.host模式

三、容器之间相互通讯

四、自定义IP通讯

1.容器之间连接mysql

 2.自定义容器IP

五、注意事项

①根据自定义网络创建容器失败

②不同容器相互连接


 

✨前言

在使用Docker时,网络通信是必不可少的,它可以使不同的Docker容器相互通信,也可以将容器与外部网络连接起来。以下是一个场景的示例:

假设你正在开发一个包含前端和后端的Web应用程序。你可以使用Docker来创建两个容器,一个用于运行前端代码,另一个用于运行后端代码。

在这种情况下,网络通信非常重要。前端容器需要能够与后端容器进行通信,以便从后端获取数据并将其呈现给用户。同时,前端容器还需要能够通过网络将用户的请求发送到后端容器。

通过创建一个自定义的Docker网络,你可以实现这种通信。你可以将两个容器连接到同一个网络中,使它们能够通过网络进行通信。这样,前端容器就可以通过网络请求来获取后端容器提供的数据,然后将结果呈现给用户。

此外,你还可以配置Docker网络,使得外部网络可以通过特定端口访问你的应用程序。这样,用户可以通过他们的Web浏览器访问你的应用程序,并与前端容器进行通信,通过网络请求与后端容器进行交互。

一、网络相关

在学习网络模式的配置之前我们需要了解以下几个东西,分别是子网掩码、网关、规则,这些东西对于后面我们对ip的理解有很大的帮助。

1.子网掩码

IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据。

  • 子网掩码是“255.255.255.0”的网络:
最后面一个数字可以在 0~255 范围内任意变化,因此可以提供 256 个 IP 地址。但是实际可用的 IP 地址数量是256-2 ,即 254 个,因为主机号不能全是 “0” 或全是 “1” 。
  • 子网掩码是“255.255.0.0”的网络:
后面两个数字可以在 0~255 范围内任意变化,可以提供 255² 个 IP 地址。但是实际可用的 IP 地址数量是255²-2 ,即 65023 个。

1.1.子网掩码的组成

①同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址。
②子网掩码32位与IP地址32位相对应,IP地址如果某位是网络地址,则子网掩码为1,否则为0。
③举个栗子:如:11111111.11111111.11111111.00000000

注:左边连续的1的个数代表网络号的长度,(使用时必须是连续的,理论上也可以不连续),右边连续的0的个数代表主机号的长度。

1.2.子网掩码的表示方法

①、点分十进制表示法
二进制转换十进制,每8位用点号隔开
例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0

②、CIDR斜线记法
IP地址/n
例1:192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000
例2:172.16.198.12/20,其子网掩码表示为255.255.240.0,二进制表示为11111111.11111111.11110000.00000000
不难发现,例1中共有24个1,例2中共有20个1,所以n是这么来的。运营商ISP常用这样的方法给客户分配IP地址。

注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。

 1.3.子网掩码的分类

①、缺省子网掩码

也叫默认子网掩码,即未划分子网,对应的网络号的位都置 1 ,主机号都置 0 。

未做子网划分的IP地址:网络号+主机号

A类网络缺省子网掩码: 255.0.0.0,用CIDR表示为/8

B类网络缺省子网掩码: 255.255.0.0,用CIDR表示为/16

C类网络缺省子网掩码: 255.255.255.0,用CIDR表示为/24

②、自定义子网掩码

将一个网络划分子网后,把原本的主机号位置的一部分给了子网号,余下的才是给了子网的主机号。其形式如下:

做子网划分后的IP地址:网络号+子网号+子网主机号

举个例子:

如:192.168.1.100/25,其子网掩码表示:255.255.255.128

意思就是将192.168.1.0这个网段的主机位的最高1位划分为了子网。关于子网划分将在下篇文章讲到,这里不在阐述。

2.网关

网关实质上是一个网络通向其他网络的 IP 地址。
路由器( Windows 下叫默认网关,网关就是路由,路由就是网关不要蒙)
在如下拓扑图示例中,A与B,C与D,都可以直接相互通信(都是属于各自同一网段,不用经过路由器),但是A与C,A与D,B与C,B与D它们之间不属于同一网段,所以它们通信是要经过本地网关,然后路由器根据对方IP地址,在路由表中查找恰好有匹配到对方IP地址的直连路由,于是从另一边网关接口转发出去实现互连。
注意:网关的主机部分通常占用的是.1

3.规则

计算机的 IP 地址由两部分组成,一部分为网络标识,一部分为主机标识,同一网段内的计算机网络部分相同,主机部分不同同时重复出现。
路由器连接不同网段,负责不同网段之间的数据转发,交换机连接的是同一网段的计算机。通过设置网络地址和主机地址,在互相连接的整个网络中保证每台主机的IP 地址不会互相重叠,即 IP 地址具有了唯一性。

在计算机网络中,主机 ID 全部为 0 的地址为网络地址,而主机 ID 全部为 1 的地址为广播地址
这 2 个地址是不能分配给主机用的

二、Dockers的网络配置

当你安装了 docker, 它会自动创建 3 个网络,可以使用 docker network ls 命令来查看​​​​​​​
docker network ls

Docker提供了以下常用的网络模式:

  1. Bridge模式(桥接模式):默认的网络模式,容器通过虚拟网桥连接到主机的物理网络接口上,可以通过端口映射将容器的端口映射到主机上。

  2. Host模式(主机模式):容器与主机共享网络命名空间,容器直接使用主机的网络栈,可以轻松访问主机上的网络资源,但会损失一定的隔离性。

  3. None模式(无网络模式):容器不连接到任何网络,只能通过内部与其他容器进行通信,不能与外部进行网络通信。

当你运行一个容器的时候,可以使用 --network 参数来指定你的容器连接到哪一个网络。

1.bridge模式

当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。 在主机上创建一对虚拟网卡 veth pair 设备, Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为eth0 (容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入
到 docker0 网桥中。
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。每个bridge模式的容器都有一个独立的IP,如果外部需要访问需要进行端口映射。
docker run -itd --name t1 -p 8080:8080 tomcat:8.5.20

创建一个容器后我们查看一下它的bridge信息

docker inspect t1

 可以看到它网桥是172.17.0.2,它的网关是172.17.0.1,网络模式是bridge

我们再来看一下这个网络模式bridge

docker inspect bridge

这里有个Containers容器集合,bridge的容器中就会有个“t1”容器它的IP是172.17.0.2/16说明它的子网掩码是255.255.0.0,用CIDR表示为/16

docker0 就像是一个路由器,容器就像是路由器下的设备,它们在同一个网段内可以互相 ping 通。

注意:
-p 参数可以出现多次,绑定多个端口号
docker run - itd -- name t1  - p 8082:8080 - p 8083:8080 tomcat:8.5.20

 

2.host模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace ,而是 和宿主机共用一个Network Namespace 。
容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

 创建一个容器指定为host模式

docker run -itd --name t2  --net=host tomcat:8.5.20

如果你的虚拟机是和主机一个网络那么可直接访问8080,不需要做端口映射

使用host模式可能会导致安全隐患。由于容器共享主机网络栈,容器内的进程可以访问主机上的所有网络资源,包括主机上未公开的端口和共享文件。因此,如果容器本身存在安全漏洞,则容易受到攻击。

三、容器之间相互通讯

我们了解了bridge模式,下面我们来尝试一下看看是否真的可以建立连接

docker run -it --name c1   centosdocker run -it --name c2   centos

首先创建两个容器,因为默认是bridge模式所以不用指定,下面再查看一下c2的IP是多少

ip addr

可以看到我们的c2的IP是172.17.0.3我们使用c1连接一下

 四、自定义IP通讯

1.容器之间连接mysql

我们现在宿主机上创建一个目录名为soft并往目录下放入一个war包

创建一个基于tomcat的容器并进行目录挂载

docker run -it \
--name t1 \
-p 8080:8080 \
-v /soft:/usr/local/tomcat/webapps \
tomcat:8.5.20

 可以看到跑成功了

但是我们接下来做一个操作进行数据访问

进行数据访问它会去连接我们的mysql,因为没有mysql所以报错,现在我们来搞一个mysql,创建mysql之前需要做一个事情,mysql需要一个my.cnf的配置文件,目前我们还没有所以需要在宿主机上创建一个将该文件放入到目录中

mkdir  -p /mysql/{conf,data}

这是my.cnf的内容

[client]
default-character-set=utf8[mysql]
default-character-set=utf8[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pidinit_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# modeified: 
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_allowed_packet=10M
default-time_zone='+8:00'
default_authentication_plugin=mysql_native_password

我们进入到mysql/data目录下创建mysql容器

docker run \
--name m1 \
-v /mysql/conf/my.cnf:/etc/my.cnf \
-v /mysql/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql/mysql-server:5.7

进入我们的mysql容器进行登录

 docker exec -it m1 bashmysql -uroot -p

 登录成功以后,我们现在需要一个账户进行远程连接所以创建一个账户并赋予权限

grant all on *.* to ww@'%' identified by '密码'

记得重启一下docker restart m1

我们进入到被解压的war的配置文件中修改配置文件中的mysql连接

我们查看指定容器的日志并以实时方式跟踪输出看一下现在会怎么样。

docker -logs -f t1

 

 2.自定义容器IP

虽然现在容器之间是可以相互访问了,但是我们的ip是docker0发放的,也就是说,这个ip和创建容器的顺序有关系,如果我是先创建mysql容器后创建tomcat容器,那么我们的ip是不是又发生了改变,是不是有需要去修改mysql的配置连接?太麻烦了我只能说。

我们就可以使用自定义网络的方式,自定义网络不但支持自定义IP还可以支持以容器名的方式进行访问。

①我们首先需要创建一个网络

docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 [name]

 ②我们需要查看该网络的网段是多少

docker inspect net

③为我们的容器指定IP

docker run -it \
--name t1 \
-p 8080:8080 \
-v /soft:/usr/local/tomcat/webapps \
--net net \
--ip 172.18.0.2 \
tomcat:8.5.20
docker run \
--name m1 \
-v /mysql/conf/my.cnf:/etc/my.cnf \
-v /mysql/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
--net net \
--ip 172.18.0.3 \
-d mysql/mysql-server:5.7

 ④修改mysql连接的配置文件

我们前面说过自定义网络的方式可以通过容器名来访问

五、注意事项

①根据自定义网络创建容器失败

如果在使用自定义网络创建容器的时候出现这个问题

 因为docker中,只有使用 --subnet创建的网络才能指定静态IP。因此在使用docker-compose或者docker run命令创建容器时,如果需要指定,则可以使用 :

  • –subnet创建网络(用来指定ip段)
  • –gateway(用来指定网关)
  • name为创建的名字
docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 [name]

②不同容器相互连接

我现在有两个容器他们的IP分别是172.17.0.2和172.18.0.2根本不在一个网段里面,此时我想要172.17.0.2的这个容器去ping172.18.0.2是根本不可能的

运行以下命令将c1容器连接到自定义的net网络

 docker network connect net c1

现在我们看一下我们c1有几个网络

 

现在就可以进行连接了

请添加图片描述​

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

烧钱地推的反思

烧钱地推是一种独特的互联网企业的市场竞争手段。 1.地推的成本分析 最开始比较低等的地推方式是,为了获得一手的活动客户流,最开始的方式主要有扫码关注、注册或是转发送一些廉价的赠品,如气球、杯子、毛绒玩具、廉价多肉等等。 除此之外…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时,我们首先接触的就是变量,再深入学习,我们可以利用运算符对变量进行操作,当我们使用C编写程序时,经常会遇到一些需要对特殊的例如自定义数据类型…

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

文件加密怎么设置?文件工具哪个好用?

在使用电脑时,我们可以通过加密来保护电脑中的重要文件,那么,文件加密要怎么设置呢?下面我们就来了解一下。 文件夹加密超级大师 作为“加密大师”,文件夹加密超级大师支持文件加密功能,并提供了金钻加密和…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好,我是鱼皮,对不会前端的同学来说,开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单,使用框架,几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具,使用Qt Designer可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 主要内容 1、Qt Designer程序主界…

从濒临破产到玩具行业天花板,乐高怎么做到的?

成立于1932年的乐高一开始只是儿童玩具,到现在也俘获了许多大人的心,然而在2003年乐高遇到了巨大的经营危机,离破产只有一一步之遥,然而在当下,乐高已经成功跻身世界500强。今天媒介盒子就来和大家聊聊:从濒…

Server/PC 稳定性测试(Windows)

Server/PC 稳定性测试 1. CPU - 中央处理器1.1 CPU稳定性1.2 CPU温度 2. Memory - 内存2.1 内存性能 3. DISK - 硬盘3.1 HDD - 机械硬盘机械硬盘转速详解监测工具 3.2 SSD - 固态硬盘监测工具 4. 使用时长cpu能用多久?主板能用多久?内存能用多久&#xf…

主键、外键、建表范式、MySQL索引、用户管理

1 案例1:主键 1.1 问题 完成如下练习: 练习主键的创建、查看、删除、添加、验证主键练习复合主键的使用练习与auto_increment连用的效果 1.2 方案 主键使用规则: 表头值不允许重复,不允许赋NULL值一个表中只能有一个primary…

第二篇:新建node项目并运行

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 安装 Node.js:首先,确保你的…

【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

音视频-SDL的简单使用

使用SDL进行音视频的播放 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台&#xff0…

hnswlib报错ItemCannotBeInsertedIntoTheVectorSpaceException

异常信息 com.stepstone.search.hnswlib.jna.exception.ItemCannotBeInsertedIntoTheVectorSpaceExceptionat com.stepstone.search.hnswlib.jna.Index.checkResultCode(Index.java:247)at com.stepstone.search.hnswlib.jna.Index.addItem(Index.java:125)原因是初始化index环…

抖音SEO搜索排名优化培训教程课件

【干货资料持续更新,以防走丢】 抖音SEO搜索排名优化培训教程课件 部分资料预览 资料部分是网络整理,仅供学习参考。 抖音运营资料合集 (完整资料包含以下内容) 目录 抖音易爆单的商品特征 抖音作为一款短视频平台,…

【应用方案】基于MT7628 JN5169 和SUN724的4G-Zigbee智能网关方案

产品方案特性 - 4G-Zigbee智能网关扩展性强; - 百兆以太网接入; - 支持Zigbee 3.0智能家居产品和智能安防产品接入; - 实时检测烟感、气感,联动阀门控制器可自动关闭燃气阀门,并拨打报警电话,防止火灾&…

静态住宅代理与动态住宅代理的区别?如何选?

住宅代理ip分类两种类型:静态住宅代理和动态住宅代理,他们有什么区别又能用在什么场景呢?我们先从他们是如何运作开始。 一、什么是住宅代理ip isp住宅代理ip我们称为真人住宅代理,地址是从真人/家庭中出发,安全性更高…

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具,主要用于游戏艺术创作。它提供了一套全面的功能,旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力,允许用户根据独特的风格和艺术方向训…

Qt单个字符判断

1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…

【AIGC入门一】Transformers 模型结构详解及代码解析

Transformers 开启了NLP一个新时代,注意力模块目前各类大模型的重要结构。作为刚入门LLM的新手,怎么能不感受一下这个“变形金刚的魅力”呢? 目录 Transformers ——Attention is all You Need 背景介绍 模型结构 位置编码 代码实现&…

Agent检索增强生成

检索增强生成(RAG)设计模式通常用于在特定数据域中开发大语言模型(LLM)应用。然而,RAG的过往的研究重点主要在于提高检索工具的效率,例如嵌入搜索、混合搜索和微调嵌入,而忽视了智能搜索。本文介绍了一种受人类研究方法启发的新方法&#xff…