Docker网络(精讲必会)

Docker平台架构图

3c604684880b4197a53cb3f223076787.png

1f2e291603d94dfea31bf9e752811441.png

素材来源于网络@NET


docker 网络是什么?

当我们的docker没有启动时(出现如下:):

3355079aacae4eb7bf88e5bf3bb2bf38.png

我们直接查看虚拟机网络(发现只有三个ens33,lo,virbr0):

79c7fbc0660a4e6fb2a688634986d18f.png

我们启动docker之后:

51ee8bcbd2ae4f28ac14d2b2ac03e19e.png

多出了一个docker0虚拟网桥:Docker 网络是一种灵活、可定制的网络配置方式,可以帮助用户管理容器之间的通信和连接,同时实现网络的隔离和安全性。这个就是docker网络!


常用命令

查看命令:

docker network --help

354eae25bc424560b1c5a5b9820fe3a4.png

docker network ls

查看docker网络情况(bridge,host,none):

4f0383d05d31424fb00a1885394a6223.png

docker network create aa_net

创建网络(默认的就是bridge模式):

e813e7d5e45840ae8d040a0d8dd53023.png

docker network rm aa_net

删除网络:

a2ae024d45654cf7b359190f4ba2e16d.png

docker network inspect bridge

查看具体网络信息(出现很多信息):

d6ad4d27bd9a47d0a50dab69e9710f57.png


能干吗?

1.容器之间的通信:Docker 网络允许容器之间进行通信,可以在同一主机上的容器之间建立本地网络,也可以在不同主机上的容器之间建立远程网络。包括端口映射!

2.连接外部网络:Docker 网络可以连接到外部网络,例如互联网,局域网等,使容器可以访问外部资源。

3.安全性:Docker 网络提供网络隔离功能,可以为容器设置网络权限,限制容器之间的通信,保护容器的安全性。

4.扩展性:Docker 网络具有灵活的扩展性,可以根据需求添加、删除、修改网络配置,满足不同应用场景的需求。


网络模式(重点)

一共是五种模式:

1.bridge桥接模式

1.Bridge:为每一个容器分配并设置IP,将容器连接到一个docker0的虚拟网桥上(默认的模式):使用的命令指定是:--network bridge;通过网桥让主机和容器,容器和容器之间互相通信!(网桥就是docker0)每个容器内部都有一个网卡,每个接口就是eth0,并且docker0上面的每一个veth匹配容器中的eth0进行配对(记住容器之间是独立的但是都连接再同一个交换机上那么就能通过docker0进行互通)

如图:

6b7f9e7a3739447289be0e2059686267.png

接下来验证两两匹配机制:

我们启动两台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(发现多出了这两个网络地址):

78af08813d554fc5abf30a8be5fc58ce.png

这里记住23:veth....@if22和25:veth....@if24注意对应关系这是宿主机上的veth, 接下来进入一台容器:docker exec -it tomcat81 bash(查看网络地址发现有一个网 络地址对应关系是:22:eth0@if23):刚好符合上面的对应关系这里是在容器中是 eth0

3cd3b32db8864f0f91340a7e692760a9.png

另外一台同样可以自己尝试一下!

演示:docker run -itd --name u1 ubuntu bash和docker run -itd --name u2 ubuntu bash创建两个容器分别查看两个容器的网络:

docker inspect u1 | tail -n 20

c7e75f65fee240c8adecde90f072bb06.png

docker inspect u2 | tail -n 20

16cda98dff264464b2989a53ed993481.png

我们看到两个容器的网络IP分别是:172.17.0.5和172.17.0.6说明这是两个容器分别配置了IP;

我们再看:我们把u1停掉:docker stop u1重新开启一个u3容器:docker run -itd --name u3 ubuntu bash再查看IP:

bd263255d94342df8f252444ab2a4737.png

发现u3的IP变成了172.17.0.5 说明他们的IP是变化的,也就是说IP不能写死如果有容器宕机就会造成IP变动

所以要改变这种问题就要设计网络通过服务名来调用(见下方的自定义模式解决问题)


2.Host主机模式

2.Host:容器不会虚拟出自己的网卡,也不会配置自己的IP,使用宿主机的IP和端口和素质及公用:使用命令:--network host;

容器不会获得一个独立的network namespace,也不会虚拟出自己的网卡eth0就是他的大哥。

如图:

be7234fb35bb41ce9f090a9539e049b3.png

案例演示(指令:):

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

出现一个警告:19427dfe4b6b42239ec2db75a5375ef6.png

意思就是:使用主机模式的网络端口映射是不起作用的,端口和宿主机共用一个此时你访问8083端口是访问不到的可以通过8080宿主机端口访问:

beaf41e23a414e0e9405c959cb0e1dec.png

我们发现并没有PORTS映射;

此时我们查看宿主机ip addr是没有分配新的匹配的;我们查看83容器网络情况:docker inspect tomcat83:   网络模式是host,IP是空的网关也是空的 1185d10d73bb4cf0abfc9bcc386f15cf.png

进入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:

aaec8c5dbe584f61847761378121e1f8.png

发现IP和网关都是空的,其他项也是空的,就是没有网络的模式;

进入容器查看:docker exec -it tomcat84 bash

16c8fc3578204b7580d41b1dd9892c16.png

也只有一个lo


4.Container基于容器模式

4.Container:新创建的容器不会创建自己的网卡和配置自己的网络IP而是和一个指定的容器共用一个IP和端口范围。使用指令:--network container:NAME或者是容器的ID;

如图(不是和主机共享而是和一个指定容器共用,容器还是隔离的):

d43e6d0951e54561a55c73d9efd6a3f2.png

案例演示(坑):

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和端口但是:

4e5da87de5c245e7b8f13d64cd00fe04.png

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):

7c55118dab664d3ab981f7df4361d426.png

在进入alpine2查看网络地址(发现对应关系是一样的和alpine1):05b39139215c4ee7a6efdcf2b158ec79.png

如果停掉alpine1那么alpine2的网络也就没有了只剩下lo网络回环了:

docker stop alpine1:

6d1f20413bd245588b3b954ab105181a.png

这就是基于容器的网络配置!


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

cf06c5d1c2ad407b9622d9b54c3f7951.png

docker exec -it tomcat82 bash:注意看IP:172.17.0.3

7176f1a1ec9048ddad7473650601674d.png

我们用8082去ping 8081(正常):

4df5b69fa34b4bab8f555fc54d42755f.png

我们用8081去ping 8082(正常):

1b9770e4932b47bca3e3a9e2f8d17195.png

但是IP波动要使用服务名去ping:

2f6cdc9fa40148a18106cf270fa21d36.png

b33a19aedf4748a98953765d701f1c16.png

都是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

6052c945aa7d49c19ed52f2694fe7d3a.png

82 ping 81:72b9e19e501f484790d75aedd1f85f98.png

都是通的!!!(多台服务器常常使用自定义网络!!!)

在操作过程中遇到任何问题欢迎在评论区留言!!!

很快会发布compose容器编排,关注不迷路!!!

5fe7f58b9bdf40be83ee1b33cdfb2207.png

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值