Docker平台架构图
素材来源于网络@NET
docker 网络是什么?
当我们的docker没有启动时(出现如下:):
我们直接查看虚拟机网络(发现只有三个ens33,lo,virbr0):
我们启动docker之后:
多出了一个docker0虚拟网桥:Docker 网络是一种灵活、可定制的网络配置方式,可以帮助用户管理容器之间的通信和连接,同时实现网络的隔离和安全性。这个就是docker网络!
常用命令
查看命令:
docker network --help
docker network ls
查看docker网络情况(bridge,host,none):
docker network create aa_net
创建网络(默认的就是bridge模式):
docker network rm aa_net
删除网络:
docker network inspect bridge
查看具体网络信息(出现很多信息):
能干吗?
1.容器之间的通信:Docker 网络允许容器之间进行通信,可以在同一主机上的容器之间建立本地网络,也可以在不同主机上的容器之间建立远程网络。包括端口映射!
2.连接外部网络:Docker 网络可以连接到外部网络,例如互联网,局域网等,使容器可以访问外部资源。
3.安全性:Docker 网络提供网络隔离功能,可以为容器设置网络权限,限制容器之间的通信,保护容器的安全性。
4.扩展性:Docker 网络具有灵活的扩展性,可以根据需求添加、删除、修改网络配置,满足不同应用场景的需求。
网络模式(重点)
一共是五种模式:
1.bridge桥接模式
1.Bridge:为每一个容器分配并设置IP,将容器连接到一个docker0的虚拟网桥上(默认的模式):使用的命令指定是:--network bridge;通过网桥让主机和容器,容器和容器之间互相通信!(网桥就是docker0)每个容器内部都有一个网卡,每个接口就是eth0,并且docker0上面的每一个veth匹配容器中的eth0进行配对(记住容器之间是独立的但是都连接再同一个交换机上那么就能通过docker0进行互通)
如图:
接下来验证两两匹配机制:
我们启动两台tomcat验证:
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
启动之后查看 ip addr(发现多出了这两个网络地址):
这里记住23:veth....@if22和25:veth....@if24注意对应关系这是宿主机上的veth, 接下来进入一台容器:docker exec -it tomcat81 bash(查看网络地址发现有一个网 络地址对应关系是:22:eth0@if23):刚好符合上面的对应关系这里是在容器中是 eth0
另外一台同样可以自己尝试一下!
演示:docker run -itd --name u1 ubuntu bash和docker run -itd --name u2 ubuntu bash创建两个容器分别查看两个容器的网络:
docker inspect u1 | tail -n 20
docker inspect u2 | tail -n 20
我们看到两个容器的网络IP分别是:172.17.0.5和172.17.0.6说明这是两个容器分别配置了IP;
我们再看:我们把u1停掉:docker stop u1重新开启一个u3容器:docker run -itd --name u3 ubuntu bash再查看IP:
发现u3的IP变成了172.17.0.5 说明他们的IP是变化的,也就是说IP不能写死如果有容器宕机就会造成IP变动
所以要改变这种问题就要设计网络通过服务名来调用(见下方的自定义模式解决问题)
2.Host主机模式
2.Host:容器不会虚拟出自己的网卡,也不会配置自己的IP,使用宿主机的IP和端口和素质及公用:使用命令:--network host;
容器不会获得一个独立的network namespace,也不会虚拟出自己的网卡eth0就是他的大哥。
如图:
案例演示(指令:):
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
出现一个警告:
意思就是:使用主机模式的网络端口映射是不起作用的,端口和宿主机共用一个此时你访问8083端口是访问不到的可以通过8080宿主机端口访问:
我们发现并没有PORTS映射;
此时我们查看宿主机ip addr是没有分配新的匹配的;我们查看83容器网络情况:docker inspect tomcat83: 网络模式是host,IP是空的网关也是空的
进入83容器docker exec -it tomcat83 bash查看,ip addr:
和宿主机的网络情况几乎一样!
解决方法就是改成bridge模式或者直接无视警告!
3.None模式
3.None:容器有独立的Network namespace,但是没有进行任何的网络配置,没有分配veth pair和网桥链接以及IP端口使用命令:--network none;(几乎不会用)
禁用网络功能只有lo:
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
直接查看:docker inspect tomcat84 | tail -n 20:
发现IP和网关都是空的,其他项也是空的,就是没有网络的模式;
进入容器查看:docker exec -it tomcat84 bash
也只有一个lo
4.Container基于容器模式
4.Container:新创建的容器不会创建自己的网卡和配置自己的网络IP而是和一个指定的容器共用一个IP和端口范围。使用指令:--network container:NAME或者是容器的ID;
如图(不是和主机共享而是和一个指定容器共用,容器还是隔离的):
案例演示(坑):
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8085:8080 --network container:tomcat85 --name tomcat85 billygoo/tomcat8-jdk8
这个就是借用IP和端口但是:
Error:端口冲突!
所以我们更换容器不能用tomcat了!Tomcat不能用这种网络模式!
Alpine Linux 是一款倾向于安全型,简单性和资源效率的一款轻量级Linux麻雀虽 小五脏俱全:
先拉一个:
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
这样就可以了:
进入alpine1查看网络地址(注意对应关系28:eth0@if29 IP:172.17.0.2):
在进入alpine2查看网络地址(发现对应关系是一样的和alpine1):
如果停掉alpine1那么alpine2的网络也就没有了只剩下lo网络回环了:
docker stop alpine1:
这就是基于容器的网络配置!
5.自定义模式:
为了解决桥接模式的网络Ip变动问题:
容器IP变动时候可以通过服务名直接网络通信而不受到影响:
我们再次启动:
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
并且分别进入容器:
docker exec -it tomcat81 bash:注意看IP:172.17.0.2
docker exec -it tomcat82 bash:注意看IP:172.17.0.3
我们用8082去ping 8081(正常):
我们用8081去ping 8082(正常):
但是IP波动要使用服务名去ping:
都是ping不通的!
解决问题:
自定义桥接网络:docker network create alibaixiu_network
把8081和8082都加入到自定义的网络中:
docker run -d -p 8081:8080 --network alibaixiu_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network alibaixiu_network --name tomcat82 billygoo/tomcat8-jdk8
ok了!继续ping:81 ping 82
82 ping 81:
都是通的!!!(多台服务器常常使用自定义网络!!!)
在操作过程中遇到任何问题欢迎在评论区留言!!!
很快会发布compose容器编排,关注不迷路!!!