


Docker 自定义网络
1) 使用docker network 查看网络相关的帮助命令。如图所示
docker network --help
可以看到网络相关的命令有connect、create、inspect、rm等。
2) 查看创建网络的帮助命令。如图所示
docker network create --help
常用的有—driver指定网络模式、—gateway指定网关、—subnet指定子网。
3) 使用命令查看一下目前docker内部的默认网络。如图所示
docker network ls
可以看到里边的默认网络有很多,其中桥接模式有三个。
4) 我们查看一下几个桥接网络的详情
查看一下名称叫bride的网络详情,如图所示
docker network inspect bridge
可以看到其中的子网是172.17.0.0/16,网关是172.17.0.1
查看一下名称叫docker_gwbridge的网络详情,如图所示
可以看到其中的子网是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
我们看到我们的自定义网络已经创建成功了。我们使用了—driver指定了网络模式、使用—gateway指定了网关、使用了—subnet指定了子网。当然也可以不用指定网关与子网它会自动识别。
自定义网络成功创建后,我们就可以在启动容器的时候使用我们创建的自定义网络了。
还有要注意一下,创建自定义网络指定网关,子网这些的时候要看一下自己的机器的网络环境,最好参考一下当前默认网络使用的子网和网关这些,否者可能会导致自定义网络影响宿主机的远程连接。比如我们这里的环境是虚拟机,远程连接使用的网段是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
其中网络模式、网关、子网等关键信息都可以在上面看到。
Docker自定义网络实现容器互联
1) 使用自定义网络创建一个服务, 如图所示。
docker run -itd --name nginx-net-01 --net mynet -p 9100:80 nginx
使用命令查看一下网络详情,可以看到刚跑的容器网络配置加进来了,ip地址也分配了,是整个网段的第二个地址,如图所示。
当然直接访问是肯定没有问题的,如图所示。
我们如果把刚刚创建的容器删除掉,在查看一下网络详情,会发现容器相关的也自动被删除掉了,如图所示。
2) 使用自定义网络在创建一个服务, 如图所示。
docker run -itd --name nginx-net-02 --net mynet -p 9101:80 nginx
使用命令查看一下网络详情,可以看到刚跑的容器网络配置加进来了,ip地址也分配了,是整个网段的第三个地址,如图所示。
我们可以看到我们刚刚跑的两个容器,ip地址属于同一个网段那么他们应该就可以进行相互通信,下一步我们进行容器之间的网络互联测试。
3) 测试容器之间的互联
先进入其中一个容器
docker run -itd --name nginx-net-02 --net mynet -p 9101:80 nginx
然后执行ping命令,执行ping命令的时候可能会出现docker 容器内部无法使用ping命令的错误。报错ping command not found,如图所示。
解决办法,使用如下命令解决
apt-get update
apt install iputils-ping
//这个可装可不装
apt install net-tools
安装之后在执行ping命令进行测试,通过容器2的ip进行ping测试,如图所示。
ping 172.22.0.3
通过容器2的容器名进行ping测试,如图所示。
ping nginx-net-02
可以看到不管通过容器2的ip地址还是容器名称都可以实现连接的,这在微服务的环境下是非常方便的。
测试的时候还可以使用如下命令进行测试,如图所示。
docker exec -it nginx-net-01 ping nginx-net-02
使用容器名称或者ip地址都可以。
如果不使用自定义网络,所有的容器在不指定网络情况下,都是由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查看一下详情,主要是找到网络相关的信息,如图所示。
可以发现和我们前面创建的2个容器不在一个网段上面,我们进行ping测试
docker exec -it nginx-net-01 ping nginx-net-03
docker exec -it nginx-net-01 ping 172.17.0.2
可以看到不管是进行容器名或者是容器的ip通信都是无法连通的,如图所示。
不同Docker网络之间的容器想要连接的话,需要把该容器注册到另一个容器所在的网络上,使用docker connect命令。
docker network connect mynet nginx-net-03
设置成功之后我们使用命令查看一下我们自定义网络的详情,如图所示。
docker network inspect mynet
可以看到我们刚刚连接的网络已经被注入进来了,也分配了ip地址。
重新执行命令进行容器之间的互联,如图所示。可以看到现在进行容器互联是完全没问题的。
我们再次查看容器nginx-net-03的详情,看看网络情况,如图所示。
我们可以看到容器nginx-net-03被分配了两个网络,默认的bridge与mynet,其实它能够和容器nginx-net-02与容器nginx-net-01通信,还是因为他们都使用了mynet这个自定义网络,让它们在同一个网段。
视频地址:
链接: https://pan.baidu.com/s/1Uvq7yoP5LN6ihuWtd4Rmdg?pwd=kdzf 提取码: kdzf 复制这段内容后打开百度网盘手机App,操作更方便哦
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
默认昵称
不同宿主机器上的docker能够访问通信吗?主机之间互通,运行在各个主机上的docker访问