容器间网络通信的难点
创建容器时,容器的ip 可能不在一个网段,导致无法通信。
尤其是通过docker-compose和docker命令创建启动容器时使用
bridge网络模式,当容器重启时,会按照顺序获取对应的IP地址,容器的IP地址可能会改变服务之间通过ip访问,比较繁琐,需要查看各个容器的ip
使用
host网络模式,使用宿主机的ip,没有上面问题,但绑定同一个端口的容器,只能启动一个,再启动就需要先改端口,比较繁琐创建容器时,加上参数
link,连接要通信的容器。不推荐
解决方法
创建 自定义网络,创建容器时使用该网络,容器启动后,可通过 容器名 通信
如果不想用容器名通信,创建容器时使用该网络,并指定 网络别名,可通过 网络别名 通信
自定义网络
创建bridge网络
docker network create mynetwork
ip网段由docker自行分配
创建bridge网络,指定ip段
docker network create --subnet=172.19.0.0/16 mynetwork
网络名、ip网段不能相同
查看网络信息
docker network inspect mynetwork
查看宿主机网络信息
ip a
可以查看到虚拟网卡
虚拟网卡 br-7e8631318f31,与 docker网络 是一致的
查看docker安装的网络
docker network ls
删除网络
docker network rm 网络名
创建容器(docker run)
指定网络
docker run -d --name tomcat1 --net mynetwork tomcat
docker run -d --name tomcat2 --net mynetwork tomcat
测试 通过容器名通信
docker exec -it tomcat1 ping tomcat2
指定网络、指定ip
docker run -d --name tomcat1 --net mynetwork --ip 172.19.0.100 tomcat
docker run -d --name tomcat2 --net mynetwork --ip 172.19.0.101 tomcat
测试 通过容器名通信
docker exec -it tomcat1 ping tomcat2
指定网络、指定网络别名
docker run -d --name tomcat1 --net mynetwork --network-alias t1 tomcat
docker run -d --name tomcat2 --net mynetwork --network-alias t2 tomcat
测试 通过容器名通信
docker exec -it tomcat1 ping t2
