Docker 网络
进入自己写的tomcat
docker exec -it mytomcat /bin/bash
ip addr
查看容器网络地址,会发现容器的到一个eth0@if53
的ip地址,是docker 分配的
linux 虚拟机上ping tomcat容器
ping 172.17.0.3
linux 可以ping 通容器的ip地址
原理:
每启动一个docker容器,docker 就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡 docker0
通过桥接模式,使用的是veth-pair
技术。可以发现网卡成对出现,linux中查看的和进入tomcat中查看的网卡是一致的
veth-pair
就是一堆虚拟设备接口,成对出现,彼此相连,充当桥梁功能。因此容器之间也是可以连通的,但是容器只见哦通信都是通过docker0
来转发的。所有网络接口都是虚拟的,效率较高
容器间通信
–link
容器之间通过ip地址可以ping通
docker exec -it mytomcat02 ping 172.17.0.3
但是容器之间不可以通过容器名来ping
在生成mytomcat02
镜像时,加入--link 容器名
就可以通过容器名ping到另一个容器。但是方向连接从mytomcat
pingmytomcat02
是ping不通的
docker run -d --name mytomcat02 --link mytomcat -p 8091:8080 mytomcat
mytomcat02
直接在/etc/hosts
中配置了mytomcat
的IP地址,以及容器ID,但是已经不建议使用--link
过于笨重,目前使用自定义网络
自定义网络
查看所有的docker网络
docker network ls
网络模式:
- 桥接模式bridge:docker上搭桥,通过桥连接,自己的网络也适用桥接模式
- host:和宿主机共享网络
- none:不配置网络
- container:容器网络联通,较少使用
通过docker netowrk
创建自己的网络
docker network create 创建一个网络
docker network ls 列出所有网络
--subnet 子网掩码
-d driver 设置网络模式,默认是网桥
--gateway 网关名
创建自己的网络,网络模式是bridge
网桥,子网掩码192.168.0.0/16
,网关地址192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
运行新的容器,加入自己创建的网络
docker run -d -P --name tomcatMynet01 --net mynet tomcat
docker run -d -P --name tomcatMynet02 --net mynet tomcat
docker inspect mynet
可以看出网络中出现了新建的容器
自己构建的网络功能比较完备,可以直接相互之间ping通,不需要自己加host。docker0
是阉割版
网络连通
现在网络中有四个tomcat,mynet
中连接了tomcatMynet01
,tomcatMynet02
, docker0
中连接了mytomcat
和 mytomcat02
。
网络中的容器之间是不能直接ping通的,而mynet
和 docker0
也不能直接打通,只能通过容器和网卡
连通容器mytomcat
和 mynet
网络
docker network connect mynet mytomcat
mytomcat尝试ping tomcatMynet01
docker exec -it mytomcat ping tomcatMynet01
连通之后发现,mytomcat
可以 ping通mynet
中的容器tomcatMynet01
实际上就是将mytomcat
容器放到了mynet
网络中,也就是一个容器两个IP,类似阿里云的公网IP 和 私网IP