docker中的桥接模式介绍
桥接模式:用于连接两个不同网络段的设备,使他们能够共享通信的一种方式
桥接设备:工作在OSI模型的第二层,数据链路层,转发数据帧(根据mac地址)。
类似于交换机,交换机只能转发同一网段,通过泛洪广播来找目标设备的mac地址。
docker的网络就是基于桥接模式实现的
1.虚拟网络桥:安装开启docker之后,docker进程就会自动创建一个虚拟网络桥(docker0),是一个虚拟网设备,类似于物理网络设备的交换机
2.分配唯一的IP地址,每次运行一个容器,docker进程都会分配一个唯一的且未被其他容器占用的IP地址给容器。
这个IP地址在桥接模式网络的子网当中
3.容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务。主机也可以通过桥接网络docker:0来访问容器内部的进程(iptables的nat地址转换。在主机上做了地址转换)
问题:docker的网桥是宿主机虚拟出来的,并不是一个真正的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0。
每创建完的docker都会生成一个虚拟网卡---docker0
举个例子,我们用nginx:1.22.0去创建
docker run -itd --name test1 -P nginx:1.22.0 /bin/bash
-P:在创建容器时,在宿主机和容器之间做一个端口映射。-P随机分配一个端口给宿主机,容器端口是不变的
-P 32768开始-P----随机指定
-p----指定端口,人为设置固定的端口映射进入容器开启一下服务。
实际上,docker是在宿主机和容器之间做了个iptables的NAT地址转换宿主的32768端口去映射容器的80端口
以上是随机分配口,桥接模式也可以自定义端口去创建
docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bashdocker ps
接下来进入容器
docker exec -it test2 bashsevice restart nginxnginx//启动nginx
cd /usr/share/nginx/html/
docker的网络模式
网络模式 | 配置 | 说明 |
bridge//桥接模式 | -network bridge | 容器拥有独自的网络命名空间,且拥有独立的IP,端口,路由等,使用veth pair 连接docker0 网桥,并以docker0网桥为网关(docker默认模式) |
host//主机模式 | -network host | 容器将不会虚拟出自己的网卡,也没有自己的IP地址。全部使用宿主机的IP地址和端口 |
container//容器模式 | -network container:容器的id或者名字 | 容器和宿主之间公用一个IP和端口 |
none//无网络模式 | -network none | docker容器有自己的network-space,但是这个容器没有任何网络设置。和host一样,没有网卡,同时也没有IP,没有路由,只有lo的回环网络。在none模式下,容器不可以联网。 工作中一般用于测试,测试定制好的容器的功能 |
自定义网络 | network create | 网段可以自定义 |
bridge--桥接模式
bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。
相当于Vmware中的 nat模式,容器使用独立.network Namespace,并连接到docker)虚拟网卡。通过dockerO网桥以及iptables
nat表配置与宿主机通信,此模式会为每一个容器分配hetwork Mamespace、设置等,并将一个主机上的 Docker容器连接到一个虚拟网桥上。
(1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Dokcer容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
(2)从docker0子网中分配一个IP给容器使用,并设置dockerO的I地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来、因此,veth设备常用来连接两个网络设备。
(3) 使用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bashdocker ps
host---主机模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离 文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespacel隔离。一个Docker容器一 般会分配一个独立的Network. Namespace。
但如果启动容器的时候使用host模式, 那么这个容器将不会获得一 个独立的Network Namespace,而是和宿主机共用一个Network Namespace。 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
容器和宿主机共享网络命名空间,但没有独立IP地址,使用宿主机的IP地址,和宿主机共享端口范围,例如宿主机使用了80端口,那么容器不能使用80端口。这种模式比较方便,但不安全。
#创建容器web1,指定网络模式为 host#容器和宿主机共享网络命名空间,但没有独立IP地址。使用宿主机的IP,和宿主机共享端口范围。
docker run -itd --name test1 --network host nginx /bin/bash#访问宿主机的ip和80端口,则可以访问到tt1的nginx服务curl http://20.0.0.20:80
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 新创建的容器不会创建自己的网卡,配置自己的Ie,而是和一个指定的容器共享re、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
新创建的B容器和A容器共享命名空间。假如A容器使用了80端口,B容器就不能使用80端口。
两个容器公用一个端口,但不能同时用
docker run -itd --name mysql1 --network=container mysql /bin/bashdocker psdocker exec -it mysql1 bash
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个locker容器没有网卡、iP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡、这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
自定义网络
默认是172.17.0.1
但我们可以自定义他的网段。
在使用默认docker:0网桥时,创建容器是不能指定IP地址的,只能由docker网桥自动分配。
除非用户自定义的网络才可以给容器自定义IP地址。
所以得先创建自定义网络,才能创建容器
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork--opt "com.docker.network.bridge.name"="docker1"
可以不加,但是网卡名称比较难以识别mynetwork:自定义网络的名称//创建一个 docker1 的虚拟网卡
docker run -itd --name nginx1 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bashdocker exec -it nginx1 bash
总结
docker的网络模式:
1.bridge模式:桥接模式,也是docker的默认模式,创建时无需指定
2.host模式:容易不会有自己的网络设备,但是可以和宿主机共享IP和端口
3.container模式:容器和容器之间共享IP和端口
4.none模式:也没有自己的网络设备,也没有网卡,没有IP。只有一个回环地址--127.0.0.1,不能够联网。相当于飞行模式(一般用于测试容器的功能)
5.自定义网络:创建容器时,默认使用docker0网桥时是无法给容器定义IP地址的,只能自动分配。自定义网络在创建容器时,可以给容器指定IP
docker如何在创建容器时指定端口映射:
-P:随即指定
-p:自定义指定
32768:80
前面是宿主机,后面是容器端口
docker logs 容器名/容器ID
docker logs -f
dockers logs --tail=10 test1
dockers logs --tail=10 -f test1
--tail=10 从尾部开始,只看最近10条
-f 动态查看
/bin/bash就是为了让容器在后台有一个运行程序,保证容器不会退出
-d:表示后台守护运行,时间一长,容器可能会自动掉
/bin/bash就是容器的标准输出,docker logs捕获的是cmd 和 entrypoint的标准输出。/bin/bash和捕获日志会冲突