用docker默认的网络 docker0 创建的容器,容器之间只能使用容器 ip 相互ping得通,使用容器名字ping不通。
使用docker自定义的网络创建的容器,各容器之间既可以通过 ip 相互ping得通,也可以使用容器名相互ping得通。
【1】创建自定义网络mynet
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
参数说明:
--driver bridge #表示桥接模式
--subnet 192.168.0.0/16 #16表示最多支持65535个ip,可以分配192.168.0.2到192.168.255.255,如果没有指定--subnet参数默认网段为172.17.0.0/16,默认网关为172.17.0.1;
--subnet 192.168.0.0/24 #24表示最多支持254个ip,可以分配192.168..0.2到192.168.0.255
--gateway #表示docker容器的网关
mynet表示网络名
查看自定义网络mynet的信息:
【2】创建容器
创建3个tomcat容器到默认网络(docker0)
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat02 tomcat
docker run -d -P --name tomcat03 tomcat
创建3个tomcat容器到自定义网络(mynet)
docker run -d -P --name my-tomcat01 --net mynet tomcat
docker run -d -P --name my-tomcat02 --net mynet tomcat
docker run -d -P --name my-tomcat03 --net mynet tomcat
查看默认网络 docker0 的信息
docker network inspect bridge
查看自定义网络 myne 的信息:
docker network inspect mynet
【3】测试ping容器名以及ip地址
分别用my-demo01容器ping my-demo02容器的ip及容器名,看是否ping得通。
docker exec -it my-demo01 ping 192.168.0.3
docker exec -it my-demo01 ping my-demo02
使用ping命令如果报下面的错误:
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
这是因为容器只有基础命令,没有网络命令导致,就先进入容器并且安装网络工具:
docker exec -it my-tomcat01 /bin/bash
apt update && apt install -y iproute2 && apt install -y net-tools && apt install -y iputils-ping
看图信息,说明my--tomcat01无论是ping my-tomcat02的ip还是容器名都可以通。
【4】将不同网段的容器互通
首先,mynet 网络还未跟 tomcat01 容器连通,我们用mynet中的容器 my-tomcat01来ping一下docker0网络中的 tomcat01 容器试试:
docker exec -it my-tomcat01 ping tomcat01
会出现 ping: tomcat01: Name or service not known 错误。
然后,将自定义网络 mynet 跟默认网络 docker0 中的某个容器(比如:tomcat01)连通。
docker network connect mynet tomcat01
查看一下mynet网格信息:
docker network inspect mynet
此时,tomcat01容器加入到mynet网络中来了。再来 ping 一下加进来的容器:
docker exec -it my-tomcat01 ping tomcat01
这次ping通了。