帮做毕设的网站,航空网站建设,域名收录,做网站接广告赚钱么#x1f389;#x1f389;欢迎来到我的CSDN主页#xff01;#x1f389;#x1f389; #x1f3c5;我是Java方文山#xff0c;一个在CSDN分享笔记的博主。#x1f4da;#x1f4da; #x1f31f;推荐给大家我的专栏《Docker实战》。#x1f3af;#x1f3af; … 欢迎来到我的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 例1192.168.1.100/24其子网掩码表示为255.255.255.0二进制表示为11111111.11111111.11111111.00000000 例2172.16.198.12/20其子网掩码表示为255.255.240.0二进制表示为11111111.11111111.11110000.00000000 不难发现例1中共有24个例2中共有20个所以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与BC与D都可以直接相互通信都是属于各自同一网段不用经过路由器但是A与CA与DB与CB与D它们之间不属于同一网段所以它们通信是要经过本地网关然后路由器根据对方IP地址在路由表中查找恰好有匹配到对方IP地址的直连路由于是从另一边网关接口转发出去实现互连。 注意网关的主机部分通常占用的是.1 3.规则 计算机的 IP 地址由两部分组成一部分为网络标识一部分为主机标识同一网段内的计算机网络部分相同主机部分不同同时重复出现。 路由器连接不同网段负责不同网段之间的数据转发交换机连接的是同一网段的计算机。通过设置网络地址和主机地址在互相连接的整个网络中保证每台主机的IP 地址不会互相重叠即 IP 地址具有了唯一性。 在计算机网络中主机 ID 全部为 0 的地址为网络地址而主机 ID 全部为 1 的地址为广播地址 这 2 个地址是不能分配给主机用的 二、Dockers的网络配置 当你安装了 docker, 它会自动创建 3 个网络可以使用 docker network ls 命令来查看 docker network ls Docker提供了以下常用的网络模式 Bridge模式桥接模式默认的网络模式容器通过虚拟网桥连接到主机的物理网络接口上可以通过端口映射将容器的端口映射到主机上。 Host模式主机模式容器与主机共享网络命名空间容器直接使用主机的网络栈可以轻松访问主机上的网络资源但会损失一定的隔离性。 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 --nethost 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-setutf8[mysql]
default-character-setutf8[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
usermysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links0log-error/var/log/mysqld.log
pid-file/var/run/mysqld/mysqld.pidinit_connectSET collation_connection utf8_unicode_ci
init_connectSET NAMES utf8
character-set-serverutf8
collation-serverutf8_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_packet10M
default-time_zone8:00
default_authentication_pluginmysql_native_password
我们进入到mysql/data目录下创建mysql容器
docker run \
--name m1 \
-v /mysql/conf/my.cnf:/etc/my.cnf \
-v /mysql/data:/var/lib/mysql \
--privilegedtrue \
-e MYSQL_ROOT_PASSWORD123456 \
-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 \
--privilegedtrue \
-e MYSQL_ROOT_PASSWORD123456 \
--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有几个网络 现在就可以进行连接了
到这里我的分享就结束了欢迎到评论区探讨交流
如果觉得有用的话还请点个赞吧