debian怎么配置静态ip地址
279
2022-10-18
云原生时代必须具备的核心技能之Docker高级篇(Docker网络详解)
前面给大家项目的介绍了Docker的基础内容Docker基础篇 接下来给大家系统的介绍下Docker高级篇的内容:网络核心、Docker实战、DockerCompose、Harbor以及Swarm。欢迎关注收藏哦
Docker网络介绍
Docker是基于Linux Kernel的namespace,CGroups,UnionFileSystem等技术封装成的一种自定义容器格式,从而提供了一套虚拟运行环境。
namespace: 用来做隔离的,比如 pid[进程]、net【网络】、mnt【挂载点】CGroups:Controller Groups 用来做资源限制,比如内存和CPU等Union File Systems:用来做Image和Container分层
1.计算机网络模型
Docker网络官网:System Interconnect)
TCP/IP:传输控制协议/网际协议(Transmission Control/Internet Protocol),是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
2 Liunx中网卡
2.1 查看网卡信息
查看网卡的命令:ip a
[vagrant@localhost ~]$ ip a1: lo:
通过ip a 可以看到当前的centos中有的4个网卡信息作用分别是
名称 | 作用 |
lo | 本地网卡【lo 是 loopback 的缩写,也就是环回的意思,linux系统默认会有一块名为 lo 的环回网络接口】 |
eth0 | 连接网络的网卡 |
eth1 | 和宿主机通信的网卡 |
docker0 | docker的网卡 |
ip link show:
[vagrant@localhost ~]$ ip link show1: lo:
以文件的形式查看网卡:ls /sys/class/net
[vagrant@localhost ~]$ ls /sys/class/netdocker0 eth0 eth1 lo
2.2 配置文件
在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可,存放的路径
[vagrant@localhost network-scripts]$ cd /etc/sysconfig/network-scripts/[vagrant@localhost network-scripts]$ lsifcfg-eth0 ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6ifcfg-eth1 ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnelifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wirelessifdown ifdown-isdn ifdown-Team ifup-bnep ifup-plip ifup-sit init.ipv6-globalifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
2.3 网卡操作
网卡中增加ip地址
[root@localhost ~]# ip addr add 192.168.100.120/24 dev eth0[root@localhost ~]# ip a1: lo:
删除IP地址: ip addr delete 192.168.100.120/24 dev eth0
[root@localhost ~]# ip addr delete 192.168.100.120/24 dev eth0[root@localhost ~]# ip a1: lo:
2.4 网卡信息解析
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
3 Network Namespace
Network Namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。
3.1 Network Namespce 实战
添加一个namespace
ip netns add ns1
查看当前具有的namespace
ip netns list
[root@localhost ~]# ip netns add ns1[root@localhost ~]# ip netns listns1
删除namespace
ip netns delete ns1
[root@localhost ~]# ip netns add ns1[root@localhost ~]# ip netns listns1[root@localhost ~]# ip netns delete ns1[root@localhost ~]# ip netns list[root@localhost ~]#
查看namespace【ns1】的网卡情况
ip netns exec ns1 ip a
[root@localhost ~]# ip netns exec ns1 ip a1: lo:
ip netns exec ns1 ifup lo
[root@localhost ~]# ip netns exec ns1 ip link show1: lo:
关掉网络状态
[root@localhost ~]# ip netns exec ns1 ifdown lo[root@localhost ~]# ip netns exec ns1 ip a1: lo:
还可以通过 link 来设置状态
[root@localhost ~]# ip netns exec ns1 ip link set lo up[root@localhost ~]# ip netns exec ns1 ip a1: lo:
再次添加一个namespace【ns2】
[root@localhost ~]# ip netns add ns2[root@localhost ~]# ip netns list ns2ns1
veth pair:Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
ip link add veth-ns1 type veth peer name veth-ns2
然后在宿主机中就会多出一对网卡信息
ip link set veth-ns1 netns ns1ip link set veth-ns2 netns ns2
[root@localhost ~]# ip netns exec ns1 ip link1: lo:
此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
[root@localhost ~]# ip netns exec ns1 ip link set veth-ns1 up[root@localhost ~]# ip netns exec ns2 ip link set veth-ns2 up
ip netns exec ns1 ping 192.168.0.12 ip netns exec ns2 ping 192.168.0.11
3.2 Container的NameSpace
按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入到容器中进行验证
创建两个Tomcat容器
docker run -d --name tomcat01 -p 8081:8080 tomcatdocker run -d --name tomcat02 -p 8082:8080 tomcat
进入到两个容器中,查看ip
docker exec -it tomcat01 ip adocker exec -it tomcat02 ip a
问题:此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的? 有些小伙伴可能会想,不就跟上面的namespace实战一样吗?注意这里并没有veth-pair技术
4 深入分析container网络-Bridge
4.1 Docker默认Bridge
首先我们通过ip a可以查看当前宿主机的网络情况
[root@localhost tomcat]# ip a1: lo:
然后查看 tomcat01中的网络: docker exec -it tomcat01 ip a可以发现
[root@localhost tomcat]# docker exec -it tomcat01 ip a1: lo:
我们发现在宿主机中是可以ping通Tomcat01的网络的。
[root@localhost tomcat]# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.038 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.038 ms^C--- 172.17.0.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
yum install bridge-utilsbrctl show
执行
[root@localhost tomcat]# brctl showbridge name bridge id STP enabled interfacesdocker0 8000.024252d40a9f no veth78a90d0 vetha2bfbf4
[root@localhost tomcat]# docker network ls NETWORK ID NAME DRIVER SCOPE92242fc0f805 bridge bridge local96b999d7fcc2 host host local17b86f9caa33 none null local
不妨检查一下bridge:docker network inspect bridge
"Containers": { "4b3500fed6b99c00b3ed1ae46bd6bc33040c77efdab343175363f32fbcf42e63": { "Name": "tomcat01", "EndpointID": "40fc0925fcb59c9bb002779580107ab9601640188bf157fa57b1c2de9478053a", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "92d2ff3e9be523099ac4b45058c5bf4652a77a27b7053a9115ea565ab43f9ab0": { "Name": "tomcat02", "EndpointID": "1d6c3bd73e3727dd368edf3cc74d2f01b5c458223f844d6188486cb26ea255bc", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }
4.2 自定义NetWork
创建一个network,类型为 Bridge
docker network create tomcat-net或者docker network create tomcat-net --subnet=172.18.0.0/24 tomcat-net
查看已有的NetWork: docker network ls
[root@localhost ~]# docker network create tomcat-net43915cba1f9204751b48896d7d28b83b4b6cf35f06fac6ff158ced5fb9ddb5b3[root@localhost ~]# docker network lsNETWORK ID NAME DRIVER SCOPEb5c9cfbc0410 bridge bridge local96b999d7fcc2 host host local17b86f9caa33 none null local43915cba1f92 tomcat-net bridge local
查看tomcat-net详情信息:docker network inspect tomcat-net
[root@localhost ~]# docker network inspect tomcat-net[ { "Name": "tomcat-net", "Id": "43915cba1f9204751b48896d7d28b83b4b6cf35f06fac6ff158ced5fb9ddb5b3", "Created": "2021-10-11T12:10:19.543766962Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} }]
删除network:docker network rm tomcat-net
创建tomcat容器,并指定使用tomcat-net
[root@localhost ~]# docker run -d --name custom-net-tomcat --network tomcat-net tomcat-ip:1.0264b3901f8f12fd7f4cc69810be6a24de48f82402b1e5b0df364bd1ee72d8f0e
查看custom-net-tomcat的网络信息:截取了关键信息
12: br-43915cba1f92:
查看网卡接口信息
[root@localhost ~]# brctl showbridge name bridge id STP enabled interfacesbr-43915cba1f92 8000.024271a667c7 no veth282a555docker0 8000.02423964f095 no veth4526c0c vethaa2f6f4 vethc6ad4c2
此时在custom-net-tomcat容器中ping一些tomcat01发现是ping不通的
[root@localhost ~]# docker exec -it custom-net-tomcat ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.^C--- 172.17.0.2 ping statistics ---3 packets transmitted, 0 received, 100% packet loss, time 2000ms
此时如果tomcat01容器能够连接上tomcat-net上应该就可以了
docker network connect tomcat-net tomcat01
[root@localhost ~]# docker exec -it tomcat01 ping custom-net-tomcatPING custom-net-tomcat (172.18.0.2) 56(84) bytes of data.64 bytes from custom-net-tomcat.tomcat-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.138 ms^C--- custom-net-tomcat ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.138/0.138/0.138/0.000 ms[root@localhost ~]# docker exec -it custom-net-tomcat ping tomcat01PING tomcat01 (172.18.0.3) 56(84) bytes of data.64 bytes from tomcat01.tomcat-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.031 ms
5 深入分析 Container网络-Host&None
5.1 Host
Host模式下,容器将共享主机的网络堆栈,并且主机的所有接口都可供容器使用.容器的主机名将与主机系统上的主机名匹配
创建一个容器,并指定网络为host
docker run -d --name my-tomcat-host --network host tomcat-ip:1.0
查看ip地址
docker exec -it my-tomcat-host ip a
检查host网络
docker network inspect host
"Containers": { "f495a6892d422e61daab01e3fcfa4abb515753e5f9390af44c93cae376ca7464": { "Name": "my-tomcat-host", "EndpointID": "77012b1ac5d15bde3105d2eb2fe0e58a5ef78fb44a88dc8b655d373d36cde5da", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }
5.2 None
None模式不会为容器配置任何IP,也不能访问外部网络以及其他容器.它具有环回地址,可用于运行批处理作业.
创建一个tomcat容器,并指定网络为none
docker run -d --name my-tomcat-none --network none tomcat-ip:1.0
查看ip地址
docker exec -it my-tomcat-none
检查none网络
docker network inspect none
"Containers": { "c957b61dae93fbb9275acf73c370e5df1aaf44a986579ee43ab751f790220807": { "Name": "my-tomcat-none", "EndpointID": "16bf30fb7328ceb433b55574dc071bf346efa58e2eb92b6f40d7a902ddc94293", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }
6 端口映射
创建一个tomcat容器,名称为port-tomcat
docker run -d --name port-tomcat tomcat-ip:1.0
思考如何访问tomcat的服务
docker exec -it port-tomcat bashcurl localhost:8080
如果要载centos7上访问呢
docker exec -it port-tomcat ip acurl 172.17.0.4:8080
如果我们需要在centos中通过localhost来访问呢?这时我们就需要将port-tomcat中的8080端口映射到centos上了
docker rm -f port-tomcatdocker run -d --name port-tomcat -p 8090:8080 tomcat-ip:1.0curl localhost:8090
centos7是运行在win10上的虚拟机,如果想要在win10上通过ip:port方式访问呢?
#此时需要centos和win网络在同一个网段,所以在Vagrantfile文件中#这种方式等同于桥接网络。也可以给该网络指定使用物理机哪一块网卡,比如#config.vm.network"public_network",:bridge=>'en1: Wi-Fi (AirPort)' config.vm.network"public_network"centos7: ip a --->192.168.8.118 win10:浏览器访问 192.168.8.118:9080
7 多机之间通信
具体深入介绍会在 Docker Swarm 中详聊,本节简单介绍。
ps:掌握了Docker的网络,其实也就掌握整个技术的核心了,如果文章有帮助欢迎关注点赞收藏哦 下篇:Docker实现
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~