docker容器间的通信使用Linux网络命名空间实现,下面我通过一个实验模拟下这个过程
![f9f93612335ca1bb7fba698b14b60414.jpeg](https://i-blog.csdnimg.cn/blog_migrate/3425df985e68664bfebedbf772bc2fee.jpeg)
测试
下面我创建两个测试容器先做个实验
创建测试容器
docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"不需要关注busybox image的作用,只需要知道这个容器会一直循环,使用这个容器的目的只是为了测试两个容器间的通讯
查询测试容器ip
![5b7b97b3e1891e931011d986d4ac4aa3.png](https://i-blog.csdnimg.cn/blog_migrate/ab7dc605dcc6aa11e04552fa0cff5e22.png)
测试网络通信
这里我们测试下两个容器间的通信
![385f09d8ed01782a954e5bf003cdb896.jpeg](https://i-blog.csdnimg.cn/blog_migrate/6a3f35d81c8832140371e78ac38f7092.jpeg)
两容器通信正常,同主机下创建conrainer默认是可以通信的。
命名空间通信方式
创建两个网络命名空间
![e0cd3ea2795f88c60910a4aac503b46f.jpeg](https://i-blog.csdnimg.cn/blog_migrate/709b500cae4fd52d87316751f39d5c6f.jpeg)
查看网络命名空间网络状况
![7eae847487d0b0c574c764d54471a54a.png](https://i-blog.csdnimg.cn/blog_migrate/7d4217242e40ab272b6663bbf500540c.png)
连通两个命名空间
想要连通两个命名空间,我们需要引入虚拟设备接口veth-pair,veth-pair都是成对出现的,连接两端。我们在这里使用veth-pair做桥梁,连接两个namespace.
![309a9b1b04a008e70f065f35336a8223.jpeg](https://i-blog.csdnimg.cn/blog_migrate/22a13d8e64b0f8ce9d60f9f3adb4a03c.jpeg)
创建一对veth-pair veth0 veth1
ip l a veth0 type veth peer name veth1我们在创建前先行查看了宿主机的端口,现在可以看到多了两个端口
![a85bc641c23cc1253b8515dd45ee13fc.png](https://i-blog.csdnimg.cn/blog_migrate/93396ab9c9f7ced2a9099233945f60c6.png)
将端口加入test1 test2 命名空间
ip l s veth0 netns test1 #veth0 端口加到test1
ip l s veth1 netns test2 #veth1 端口加到test2
给veth0、veth1 配上IP 并启用
测试连通
![a67e75c73f31e792d33338b2acdcc286.jpeg](https://i-blog.csdnimg.cn/blog_migrate/baac054f1c5e710f78f7f068eb2f7ee9.jpeg)
docker容器间通信方式
有了上面直连两个命名空间的知识铺垫下面我们就可以来说说docker的容器通行方式了。在一台主机上的多个独立的容器,容器间会使用bridge模式。我们可以从图看,两个容器都连接到了docker0,连接方式就是veth-pair,docker0相当于一台交换机使得两容器间可以通信。
![d8037121659b36477069ddc29092e8c1.jpeg](https://i-blog.csdnimg.cn/blog_migrate/9ed96bbf7834be5e646b10ee168ae656.jpeg)
主机接口
通过ip a 我们可以查看当前用户主机的连接端口,前面是正常的接口我就不截图了我们主要关注下这两个接口,一个是docker0,另一个我们看名称是一个直连接口veth-pair,应该是与容器间的端口。
![cffb6c3b129f927b3888bc0f0fb3f634.png](https://i-blog.csdnimg.cn/blog_migrate/04f38edbd5026e73f5af98f88733b23b.png)
查询bridge连接
![9b8b6db3de6b07506c24e7d7fface78c.jpeg](https://i-blog.csdnimg.cn/blog_migrate/20be8ff3a25daf3234e33afc47d4816d.jpeg)
![aa35ff7d477aa1193d2ebdea85cef73e.png](https://i-blog.csdnimg.cn/blog_migrate/f0891422c0e30e3c8ca07c84a617e7dc.png)
查询容器接口
![f48fad9f28542a7cdec8ee4616b57151.png](https://i-blog.csdnimg.cn/blog_migrate/d9604faa375e822a8536987614d0edce.png)
我们可以看到test1有eth0@if8 端口,我们再创建一个容器看看主机端口是否有增加。
![cac662126461c5cce476e4044a99a7c5.png](https://i-blog.csdnimg.cn/blog_migrate/6350efe148489d77f0dd43bae5097dd2.png)
我们可以看到多了一个接口,这个接口就是新的容器与主机间的直连接口