Docker 自定义网络。Docker自定义网络实现容器互联 电脑版发表于:2022/9/4 23:20 ## Docker 自定义网络 ### 1) 使用docker network 查看网络相关的帮助命令。如图所示 ``` docker network --help ``` ![](https://img.tnblog.net/arcimg/aojiancc2/62c5ac298251495b930bce5bbc83b5a7.png) 可以看到网络相关的命令有connect、create、inspect、rm等。 ###2) 查看创建网络的帮助命令。如图所示 ``` docker network create --help ``` ![](https://img.tnblog.net/arcimg/aojiancc2/060f119080314a8783e259c321ee7f21.png) 常用的有—driver指定网络模式、--gateway指定网关、--subnet指定子网。 ### 3) 使用命令查看一下目前docker内部的默认网络。如图所示 ``` docker network ls ``` ![](https://img.tnblog.net/arcimg/aojiancc2/cc72d5ad40654fc4bb0bab94c689314b.png) 可以看到里边的默认网络有很多,其中桥接模式有三个。 ### 4) 我们查看一下几个桥接网络的详情 查看一下名称叫bride的网络详情,如图所示 ``` docker network inspect bridge ``` ![](https://img.tnblog.net/arcimg/aojiancc2/78ff26db91624f6aa07247216d1d4773.png) 可以看到其中的子网是172.17.0.0/16,网关是172.17.0.1 **查看一下名称叫docker\_gwbridge的网络详情,如图所示** ![](https://img.tnblog.net/arcimg/aojiancc2/807d67f1a93c49ce8302ba1c49e52dc1.png) 可以看到其中的子网是172.19.0.0/16,网关是172.19.0.1。 **还有另外一个桥接网络root_default,我们也可以看一下它的返回情况。** ``` [ { "Name": "root_default", "Id": "741b51653fac904c07a8457cd4f50971ef4de179a10082fe3329ec84fdb5edbd", "Created": "2022-08-22T09:37:24.69441739+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "root", "com.docker.compose.version": "1.29.2" } } ] ``` 可以看到其中的子网是172.18.0.0/16,网关是172.18.0.1。 我们了解了目前桥接网络所使用的子网和网关这些,我们也可以来自定义一个桥接网络。要注意网段不要冲突了。我们可以考虑使用172.22.0.1这个网络 ### 5) 使用命令创建自定义网络。如图所示 ``` docker network create --driver bridge --subnet 172.22.0.0/16 --gateway 172.22.0.1 mynet ``` ![](https://img.tnblog.net/arcimg/aojiancc2/8ee1fc4871754b2bac9a8f87575f2261.png) 我们看到我们的自定义网络已经创建成功了。我们使用了—driver指定了网络模式、使用--gateway指定了网关、使用了--subnet指定了子网。当然也可以不用指定网关与子网它会自动识别。 自定义网络成功创建后,我们就可以在启动容器的时候使用我们创建的自定义网络了。 tn2>还有要注意一下,创建自定义网络指定网关,子网这些的时候要看一下自己的机器的网络环境,最好参考一下当前默认网络使用的子网和网关这些,否者可能会导致自定义网络影响宿主机的远程连接。比如我们这里的环境是虚拟机,远程连接使用的网段是192.168.6.xxx,如果我们自定义网络的时候也使用了192.168这类的特殊地址,就会造成远程连接失效。使用的docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet命令创建就会造成远程连接失效,应该这类地址范围太广了,而且太特殊了,和我们本地环境网络冲突,造成无法连接。 ### 6) 查看一下我们创建的网络的详情,如图所示。 ``` docker network inspect mynet ``` ![](https://img.tnblog.net/arcimg/aojiancc2/fcfd7c2c38134a7e879ff6db39b97bad.png) 其中网络模式、网关、子网等关键信息都可以在上面看到。 ## Docker自定义网络实现容器互联 ### 1) 使用自定义网络创建一个服务, 如图所示。 ``` docker run -itd --name nginx-net-01 --net mynet -p 9100:80 nginx ``` ![](https://img.tnblog.net/arcimg/aojiancc2/ed890661774c461d9fdd69e93d05b61f.png) 使用命令查看一下网络详情,可以看到刚跑的容器网络配置加进来了,ip地址也分配了,是整个网段的第二个地址,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/ac65fd9de1dc4f7896afc416f117f14f.png) 当然直接访问是肯定没有问题的,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/85ed75ba9cbe45e1a6f509e68a6422c4.png) 我们如果把刚刚创建的容器删除掉,在查看一下网络详情,会发现容器相关的也自动被删除掉了,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/201c05b1418a4260a8aaba8df22f27f9.png) ### 2) 使用自定义网络在创建一个服务, 如图所示。 ``` docker run -itd --name nginx-net-02 --net mynet -p 9101:80 nginx ``` ![](https://img.tnblog.net/arcimg/aojiancc2/0bcdaddc77114e92bda043a93c4d96cf.png) 使用命令查看一下网络详情,可以看到刚跑的容器网络配置加进来了,ip地址也分配了,是整个网段的第三个地址,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/12ef9ebcb5524239a192a154c9ab0d20.png) 我们可以看到我们刚刚跑的两个容器,ip地址属于同一个网段那么他们应该就可以进行相互通信,下一步我们进行容器之间的网络互联测试。 ### 3) 测试容器之间的互联 先进入其中一个容器 ``` docker run -itd --name nginx-net-02 --net mynet -p 9101:80 nginx ``` 然后执行ping命令,执行ping命令的时候可能会出现docker 容器内部无法使用ping命令的错误。报错ping command not found,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/b2c3dacca9764798bfe3763a4729021a.png) 解决办法,使用如下命令解决 ``` apt-get update apt install iputils-ping //这个可装可不装 apt install net-tools ``` 安装之后在执行ping命令进行测试,通过容器2的ip进行ping测试,如图所示。 ``` ping 172.22.0.3 ``` ![](https://img.tnblog.net/arcimg/aojiancc2/da27bee5d1454d8db59919e39c6fb88b.png) 通过容器2的容器名进行ping测试,如图所示。 ``` ping nginx-net-02 ``` ![](https://img.tnblog.net/arcimg/aojiancc2/9da32400da94410cba9ee80ae1bf302d.png) 可以看到不管通过容器2的ip地址还是容器名称都可以实现连接的,这在微服务的环境下是非常方便的。 测试的时候还可以使用如下命令进行测试,如图所示。 ``` docker exec -it nginx-net-01 ping nginx-net-02 ``` ![](https://img.tnblog.net/arcimg/aojiancc2/ae713dbb40554e87b4baa8d1ef19725c.png) 使用容器名称或者ip地址都可以。 tn2>如果不使用自定义网络,所有的容器在不指定网络情况下,都是由docker0路由的,Docker会给我们容器默认分配一个随机的可用IP地址,这些IP地址之间是可以进行网络交互的,但是无法通过容器名称来连接。这在微服务场景下就不是很科学了,因为在微服务部署的场景下,注册中心是使用服务名来唯一识别微服务的,而我们上线部署的时候微服务对应的IP地址可能会改动,所以我们需要使用容器名来配置容器间的网络连接,但是默认网络就不能使用容器名称来连接,虽然可以使用指定–link来实现容器名称进行连接,但是是单向的反过来就不行,所以我们还是推荐使用自定义网络。 ### 4) 实现不同网络间的容器互联 在没有使用connect命令的情况下,不同网络间的容器是无法进行网络连接的。我们下面进行详细的测试。 我们重新创建一个容器,不指定网络 ``` docker run -itd --name nginx-net-02 --net mynet -p 9101:80 nginx ``` 然后我们执行docker inspect nginx-net-03查看一下详情,主要是找到网络相关的信息,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/890e6831f5f24eae84b6576c9da1480c.png) 可以发现和我们前面创建的2个容器不在一个网段上面,我们进行ping测试 ``` docker exec -it nginx-net-01 ping nginx-net-03 docker exec -it nginx-net-01 ping 172.17.0.2 ``` 可以看到不管是进行容器名或者是容器的ip通信都是无法连通的,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/afd0335527c543cea21ef39a8ecdda64.png) 不同Docker网络之间的容器想要连接的话,需要把该容器注册到另一个容器所在的网络上,使用docker connect命令。 ``` docker network connect mynet nginx-net-03 ``` 设置成功之后我们使用命令查看一下我们自定义网络的详情,如图所示。 ``` docker network inspect mynet ``` ![](https://img.tnblog.net/arcimg/aojiancc2/538b5aac099b42e98dd4d1fc1f45360e.png) 可以看到我们刚刚连接的网络已经被注入进来了,也分配了ip地址。 重新执行命令进行容器之间的互联,如图所示。可以看到现在进行容器互联是完全没问题的。 ![](https://img.tnblog.net/arcimg/aojiancc2/c3e09599e6e14f798840a2d37dcb7bdf.png) 我们再次查看容器nginx-net-03的详情,看看网络情况,如图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/5df72b647dc6451190296dda1a510956.png) 我们可以看到容器nginx-net-03被分配了两个网络,默认的bridge与mynet,其实它能够和容器nginx-net-02与容器nginx-net-01通信,还是因为他们都使用了mynet这个自定义网络,让它们在同一个网段。 **视频地址:** 链接: https://pan.baidu.com/s/1Uvq7yoP5LN6ihuWtd4Rmdg?pwd=kdzf 提取码: kdzf 复制这段内容后打开百度网盘手机App,操作更方便哦