还不清楚docker容器间是如何通信的?看这篇文章就够了
nanshan 2024-10-10 07:15 21 浏览 0 评论
如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发。
同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流。
前文演示docker容器内部数据共享与持久化,本文继续讨论docker网络以及容器之间的通信。
通过前面几篇文章的学习,大家对docker已经有了初步的认识,已经能够对单个容器进行管理操作。但在实际工作中,往往需要多个服务容器之间共同协作,这就要求多个容器之间能够相互访问到对方的服务。比如我们部署个人博客网站,往往将数据库服务和web服务放在不同的容器中,web服务需要访问数据库,因此就要求web容器能否访问数据库容器。如何实现这个功能,正是本文将要探讨的。
本文先简要描述docker网络相关基础知识,然后再基于bridge网络模式,演示如何将容器端口映射到宿主机供外部访问、如何通过互联机制实现容器之间相互通信。
一、docker网络初探
正如前文“Docker基础修炼3--Docker容器介绍及常用命令”中演示,通过httpd镜像run一个容器的同时指定端口映射,就可以通过宿主机ip和端口访问到web容器。这是怎么实现的呢,底层原理是什么?要理解这个现象就要理解docker相关的网络知识。
1.1 网络实现原理
docker使用Linux桥接在宿主机虚拟一个docker容器网桥(名称为docker0),每当启动一个容器时会根据docker网桥的网段分配一个IP地址给容器(称为容器IP),同时把docker网桥作为每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器IP直接通信。
为了更好的理解上边这句话,来看如下案例
1.1.1 案例1:查看docker容器网桥信息
我们可以通过ifconfig命令查看docker0容器网桥信息
[root@docker ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ca:9b:e4:a9 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
?
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.78.101 netmask 255.255.255.0 broadcast 192.168.78.255
inet6 fe80::20c:29ff:fea8:5807 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a8:58:07 txqueuelen 1000 (Ethernet)
RX packets 155 bytes 16984 (16.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 180 bytes 22972 (22.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...省略部分内容
可以看到docker0即为容器网桥,是宿主机虚拟出来的,并不是真实存在的网络设备。另外一个eno16777736(每台电脑可能名称不一样)则为网卡信息,可以通过它配置宿主机的IP信息。
1.1.2 案例2:新建两个容器观察容器IP以及互通性
通过案例1可以看到docker0的ip为:172.17.0.1。本例以官方提供的centos镜像为例,创建容器mycentos1、mycentos2,观察这两个容器IP与docker0的IP之间的关系
先创建mycentos1
[root@docker ~]# docker run -it --name mycentos1 centos
[root@6db829977fc4 /]# ifconfig
bash: ifconfig: command not found
[root@6db829977fc4 /]# yum install net-tools
...省略部分内容,中途需要按两次y进行确认
[root@6db829977fc4 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 2562 bytes 12723956 (12.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2168 bytes 121391 (118.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...省略部分内容
[root@6db829977fc4 /]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.17.0.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 eth0
[root@6db829977fc4 /]#
基于官方镜像centos创建容器mycentos1后,进入容器发现ifconfig命令提示不存在,原因是此官方进行默认没有安装网络工具包,因此通过yum install net-tools命令安装网络工具,安装完成后再次通过ifconfig命令即可看到该容器的ip为:172.17.0.2 ,然后再通过netstat -rn查看该容器的网关为:172.17.0.1。
这就证实了前面说的:每当启动一个容器时会根据docker网桥的网段分配一个IP地址给容器,同时把docker网桥作为每个容器的默认网关。
接下来继续创建容器mycentos2,验证两容器之间IP的连通性。
克隆一个连接会话,然后按如下步骤执行
[root@docker ~]# docker run -it --name mycentos2 centos
[root@400c375d202d /]# yum install net-tools
...与上面相同,因此省略输出过程
[root@400c375d202d /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 1957 bytes 12693925 (12.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1584 bytes 89868 (87.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...省略部分输出
[root@400c375d202d /]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.17.0.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 eth0
[root@400c375d202d /]#
同理可以看到mycentos2容器的ip地址为:172.17.0.3,网关为:172.17.0.1
在mycentos2中通过ip去pingmycentos1的ip,观察连通性
[root@400c375d202d /]# ping -c 1 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.069 ms
?
--- 172.17.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms
[root@400c375d202d /]# exit
exit
[root@docker ~]#
可以看到在mycentos2中可以直接通过ping通mycentos1的ip,反过来亦然。这充分证明了:因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器IP直接通信。
1.2 常见网络模式
1.2.1 docker网络相关命令
先简单介绍下几个docker网络相关的命令
docker network ls:查看网络
docker network create:创建网络
docker network inspect:查看网络细节
docker port:查看宿主机与容器间的端口映射
1.2.2 docker网络模式
我们先来看看docker安装后默认的网络
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d0f8ab5a4b42 bridge bridge local
28991c6c5348 host host local
969fd1293425 none null local
[root@docker ~]#
通过docker network ls命令查看宿主机网络情况,可以看到安装docker后,自动安装了三个网络,启动类型分别为:bridge、host、null。
实际上docker有如下几种类型的网络驱动:bridge、none、container、host、overlay等
模式配置说明bridge-net=bridge默认使用该模式none–net=none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。container-net=container:NAME_or_ID容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。host–net=host容器和宿主机共享Network namespace。overlay–net=overlay多主机之间通信
(1)bridge模式
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。
bridge模式示意图如下:
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
当使用命令docker run -p创建容器时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL命令查看。
(2)none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
none模式示意图如下:
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
(3)container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
container模式示意图如下:
(4)host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
host模式如下图所示:
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
(5)overlay模式
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密,当我们初始化一个swarm或是加入到一个swarm中时,在docker主机上会出现两种网络:
a、称为ingress的overlay网络,用于传递集群服务的控制或是数据消息,若在创建swarm服务时没有指定连接用户自定义的overlay网络,将会加入到默认的ingress网络
b、名为docker_gwbridge桥接网络会连接swarm中所有独立的docker系统进程
关于overlay网络的更多细节将在后续讲解,此处提到的swarm是一个新的概念,docker swarm是官方提供的集群管理工具,它将若干台docker主机抽象为一个整体以便于统一进行管理。
总结:
在一台主机上的多个独立的容器,用bridge模式
需要将容器的网络环境和主机的网络环境绑定时,用host模式
需要多个主机上的多个容器相互通信,用overlay网络
二、docker端口映射
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
正如前面所述,容器有自己的内部网络和 ip 地址,使用docker inspec可以详细查看。
前文已经通过ngnix进行了演示,本例再以training/webapp镜像为例进行演示-p和-P的用法。
training/webapp镜像是一个运行python的环境,里边包含了简单的基于python的web程序,运行后即可访问,类似于前文的ngnix演示效果,内部运行端口为5000。如果你没有python基础,完全不用关心镜像内部的细节,本文重点是演示容器端口映射的几种方法。
首先下载镜像
[root@docker ~]# docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp
...输出内容省略
2.1 使用P参数随机映射端口
当容器中运行一些网络应用, 要让外部访问这些应用时, 可以通过-P或-p参数来指 定端口映射。 当使用P(大写的)标记时, Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
[root@docker ~]# docker run -d -P training/webapp python app.py
3f6e17415056c27d3186dad236371be9be9bbdd121babfbf3aed6c8b2c86d01f
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f6e17415056 training/webapp "python app.py" 14 seconds ago Up 12 seconds 0.0.0.0:32768->5000/tcp nifty_wing
[root@docker ~]#
可以看到随机映射到宿主机的端口为32786,因此外部可以通过宿主机ip:32786的形式进行访问。
另外需要注意,如果没有通过--name显式指定容器名称,则会自动随机生成一个容器名,如此处的容器名nifty_wing。
此处的IP地址为我演示是宿主机的ip地址,因此需要改为自己对应的ip即可。
此外,我们还可以通过docker logs命令查看python应用的输出信息,其中3f6e17415056为容器的ID,也可以通过容器名称访问。
[root@docker ~]# docker logs -f 3f6e17415056
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.78.1 - - [07/Apr/2020 23:38:03] "GET / HTTP/1.1" 200 -
192.168.78.1 - - [07/Apr/2020 23:38:03] "GET /favicon.ico HTTP/1.1" 404 -
?
当使用p(小写)参数时,则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。支持格式为:IP:HostPort:ContainerPort 或 IP:: ContainerPort 或 HostPort:ContainerPort,也就是说除了容器端口必须指定外,宿主机IP、宿主机端口可以不同时指定。
2.2 映射所有接口地址
使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口, 可以执行如下命令:
[root@docker ~]# docker run -d -p 5000:5000 --name test2 training/webapp python app.py
511a5a103216391f5075a3e8c3b841bb104806dbd177fce7db1318a887df9f46
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
511a5a103216 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp test2
[root@docker ~]#
此时在通过宿主机ip:5000的形式在浏览器再次访问,将看到2.1中同样的效果,这样就把容器内的5000端口映射到了宿主机的5000端口上。
可以通过docker port命令查看端口映射
[root@docker ~]# docker port test2 5000
0.0.0.0:5000
[root@docker ~]#
可以看到容器内5000端口映射到了宿主机的0.0.0.0:5000。其中0.0.0.0表示任意地址。
由于此处未指定宿主机ip地址,因此当有多块网卡或多IP的时候,都可以通过这种形式访问到。
2.3 映射到指定地址的指定端口
可以使用IP:HostPart:ContainerPort格式指定映射使用一个特定地址,比如 localhost地址127.0.0.1:
[root@docker ~]# docker run -d -p 127.0.0.1:5001:5000 --name test3 training/webapp python app.py
4b689b1be9faed3d8b50beac57ce4b5a95899ef38c6ed7bdbcde11a7d2dddebd
[root@docker ~]# docker port test3 5000
127.0.0.1:5001
[root@docker ~]#
此时由于指定的宿主机固定地址为127.0.0.1,物理主机上将无法直接通过这个地址或宿主机IP访问
此外,还可以采用IP::ContainerPort的形式,不指定宿主机端口,本地主机会自动分配一个端口。这种方式就不演示了。
三、容器互联互通
本文只讨论bridge网络模式下容器之间的相互通信,以后将要讲解的swarm模式下,也是可以通过服务名称进行相互通信的。
容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
查看容器名称除了可以用docker ps进行查看外,还可以用docker inspect命令。前面文章中学习过docker inspect命令,它是用于查看容器内部详细信息的,我们可以通过-f参数来照看指定内容。
[root@docker ~]# docker inspect -f "{{.Name}}" test2
/test2
另外,在执行docker run的时候如果添加--rm标记,则容器在终止后会立刻删除。- -rm 和-d参数不能同时使用。
截至目前为止,我们创建的容器都是采用默认的bridge驱动类型的名称为bridge的网络,因为如果在创建容器时没有显示通过--net指定网络,则默认采用bridge网络。
这里有个大坑,都是dridge驱动类型的网络,默认的bridge和自定义的bridge两者有些区别,3.1和3.2就是用来演示他们的不同
3.1 bridge默认网络下容器间互通
默认的bridge网络下,使用--link参数可以让容器之间安全地进行交互。
在操作之前,我们采用如下命令删除之前创建的所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
本例我们通过training/postgres和training/webapp这2个镜像进行演示。其中postgres为数据库,webapp镜像为基于python的web。
先下载对应的镜像
[root@docker ~]# docker pull training/postgres
3.1.1 创建db容器
[root@docker ~]# docker run -d --name db training/postgres
370dd884b187bfc4f91af955270d1695f737d20883fbb9e11601afbc1a98274a
[root@docker ~]#
3.1.2 创建web容器
[root@docker ~]# docker run -d -P --name web --link db:db training/webapp python app.py
429c3b111d76948812be1a495ff5eebf4fe8340c540c7633a0fe2e212c35cc74
[root@docker ~]#
此时,db容器和web容器建立互联关系。 --link参数的格式为--link name: alias, 其中name是要链接的容器的名称 , alias是别名。
3.1.3 连通性测试
通过docker ps命令查看,相互进入容器ping对方容器名称
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
429c3b111d76 training/webapp "python app.py" 22 seconds ago Up 20 seconds 0.0.0.0:32769->5000/tcp web
370dd884b187 training/postgres "su postgres -c '/us…" About a minute ago Up About a minute 5432/tcp db
[root@docker ~]# docker exec -it web /bin/bash
root@429c3b111d76:/opt/webapp# ping -c 1 db
PING db (172.17.0.2) 56(84) bytes of data.
64 bytes from db (172.17.0.2): icmp_seq=1 ttl=64 time=0.183 ms
--- db ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.183/0.183/0.183/0.000 ms
root@429c3b111d76:/opt/webapp# exit
exit
[root@docker ~]# docker exec -it db /bin/bash
root@370dd884b187:/# ping web
ping: unknown host web
root@370dd884b187:/# exit
exit
[root@docker ~]#
可以看到在web容器内可以ping通db,但是db内却ping不通web,因此说明--link是单向的。
这相当于在两个互联的容器之间创建了一个虚机通道, 而且不用映射它们的端口到宿主主机上。 在启动 db 容器的时候并没有使用 -p 和 -P 标记, 从而避免了暴露数据库服务 端口到外部网络上。
从这个单向性也可以看出,在目前这种默认的bridge网络下,如果在创建web容器时不通过--link指定连接,则在web内是无法连接到db的,可以自己动手验证一下。
3.1.4 link内部原理
docker通过两种方式为容器公开连接信息:环境变量和/etc/hosts文件。
当我们创建容器时,指定--link,实际上docker内部会自动做一些事情,才使得容器之间能够互联。
进入web容器观察环境变量
[root@docker ~]# docker exec -it web /bin/bash
root@1424259bc79d:/opt/webapp# env
HOSTNAME=1424259bc79d
DB_NAME=/web/db
TERM=xterm
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT=tcp://172.17.0.2:5432
DB_PORT_5432_TCP=tcp://172.17.0.2:5432
...省略部分内容
其中 DB—开头的环境变量是供 web 容器连接 db 容器使用, 前缀采用大写的连接别名。
除了环境变量, Docker 还添加 host信息到父容器的 /etc/hosts 的文件。 下面是父容器web的 hosts 文件
root@1424259bc79d:/opt/webapp# cat /etc/hosts
...省略部分无关内容
172.17.0.2 db d31f1617c99f
172.17.0.3 1424259bc79d
root@1424259bc79d:/opt/webapp# exit
exit
[root@docker ~]#
这里有 2 个 hosts 信息, 第一个是 web 容器, web 容器用自己的 id 作为默认主机名, 第二个是 db 容器的 IP 和主机名。
这个过程都是自动的,无需人工干预。这样就实现了容器间的互联。
3.2 bridge自定义网络下容器间互通
上一节演示了创建容器是不指定网络,采用默认的bridge的网络,需要指定--link才能实现容器间通信。而如果是自定义的bridge网络,则无需指定直接就可以通信。
避免干扰,先删除所有容器
[root@docker ~]# docker rm -f $(docker ps -qa)
1424259bc79d
d31f1617c99f
[root@docker ~]#
3.2.1 创建自定义bridge网络
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
da812afe6179 bridge bridge local
28991c6c5348 host host local
969fd1293425 none null local
[root@docker ~]# docker network create -d bridge --attachable mybridge
12d1d3bc9619d8e5f00785a2ac29eb4a5a1cef06610015e1689eddef79ae47b1
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
da812afe6179 bridge bridge local
28991c6c5348 host host local
12d1d3bc9619 mybridge bridge local
969fd1293425 none null local
[root@docker ~]#
创建网络采用docker network create 命令,-d参数指定网络驱动类型,--attacheable指定网络是否可以附加。
3.2.2 创建容器是指定自定义网络
[root@docker ~]# docker run -d --name db --network mybridge training/postgres
9b0fad4485c4fdb08346b1154da4932c4dbf40b20f2af049733bc31edc261638
[root@docker ~]# docker run -d -P --name web --network mybridge training/webapp python app.py
2aa7fcd3400eafb833aa2473eed4d7ecce532e4f571af380fa3df3c459ad73fc
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2aa7fcd3400e training/webapp "python app.py" 10 seconds ago Up 8 seconds 0.0.0.0:32772->5000/tcp web
9b0fad4485c4 training/postgres "su postgres -c '/us…" 44 seconds ago Up 42 seconds 5432/tcp db
3.2.3 测试容器连通性
[root@docker ~]# docker exec -it db /bin/bash
root@9b0fad4485c4:/# ping -c 1 web
PING web (172.18.0.3) 56(84) bytes of data.
64 bytes from web.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.101 ms
--- web ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.101/0.101/0.101/0.000 ms
root@9b0fad4485c4:/# exit
exit
[root@docker ~]# docker exec -it web /bin/bash
root@2aa7fcd3400e:/opt/webapp# ping -c 1 db
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from db.mybridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.094 ms
--- db ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 ms
root@2aa7fcd3400e:/opt/webapp# exit
exit
[root@docker ~]#
可以看到不用--link也可以正常访问,并且是相互能通的。说明自定义bridge网络,无须指定--link参数(如果你指定了也不会报错)直接就可以访问了。
3.3 bridge自定义网络和默认网络区别
上边两个案例演示了基于bridge网络驱动的默认网络和自定义网络之间的区别,在此做一个总结。
按照一般的思维,docker默认提供的bridge网络与用户自定义的bridge网络之间,在功能上应该没有什么区别,但实际情况与此相反,两者之间存在着一些不同,假设有两个容器连接在同一个bridge网络之上,在网络是默认的与用户自定义的情况下的一些不同点:
本文详细演示了docker网络中bridge网络驱动模式下默认网络和自定义网络的区别,关于overlay网络模式将在以后进行介绍。
相关推荐
- 实战派 | Java项目中玩转Redis6.0客户端缓存
-
铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
-
1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...
- Redis与本地缓存联手:多级缓存架构的奥秘
-
多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
-
本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
-
你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
-
在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...
- Spring boot 整合Redis缓存你了解多少
-
在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
-
在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
-
一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
-
缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- Redis客户端缓存的几种实现方式
-
前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...
- Nginx合集-常用功能指导
-
1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...
- 腾讯云国际站:腾讯云怎么提升服务器速度?
-
本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...
- 雷霆一击服务器管理员教程
-
本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 实战派 | Java项目中玩转Redis6.0客户端缓存
- 轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)
- Redis与本地缓存联手:多级缓存架构的奥秘
- 腾讯云国际站:腾讯云服务器如何配置Redis缓存?
- Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?
- 【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案
- Spring boot 整合Redis缓存你了解多少
- 揭秘!Redis 缓存与数据库一致性问题的终极解决方案
- 高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局
- Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)