我们每启动一个docker容器,docker就会给docker容器分配一个IP,
我们只要安装了docker,主机上就会有一个网卡叫docker0——网络模式为桥接模式,使用的技术是evth-pair技术
有了docker0,主机可以ping通容器内部
容器内部可以ping通主机
容器与容器之间也可以ping通
docker0在这里面充当路由器
创建一个容器,docker就会创建两个网卡
evth-pair 就是一对虚拟设备接口,一段连着协议,一段彼此相连,evth-pair 正是有这个特性,才能充当一个桥梁,连接各种虚拟网络设备
Docker网络使用的是Liunx桥接,主机中有一个Docker容器的网桥——docker0
docker0有一个缺点,就是网络连接只能通过IP,不能通过容器名
通过 --link 解决了能通过容器名进行网络连接
eg: docker run -d -P --name tomcat01 --link tomcat02 tomcat
这样 tomcat01 容器内部就可以通过容器名 tomcat02 ping 通tomcat02容器(反向是不可以 ping 通的,即tomcat02 ping不通tomcat01 )
--link 原理:其实就是在/etc/hosts内配置主机映射
虽然有了 --link 来实现能用容器名来进行网络连接,但Docker容器之间的网络通信主要还是使用——————自定义网络
自定义网络:
--driver bridge #网络类型
--subnet 192.168.0.0/16 #子网
--gateway 192.168.0.1 #网关
mynet #自定义网络名
eg:docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
了解更多:
docker network --help
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b2c0e3df8d2a bridge bridge local
e1eba2df9aac host host local
819ac5ad129f mynet bridge local #自定义的网络mynet
bcb17568b28a none null local
[root@localhost ~]# docker network inspect 819ac5ad129f 查看mynet网络的元数据
[
{
"Name": "mynet",
"Id": "819ac5ad129ff5b92b4af4747d2985371eaff9040c493729c3118b9773439989",
"Created": "2021-11-09T09:16:55.317381402+08:00",
"Scope": "local",
"Driver": "bridge", #网络类型
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16", #子网
"Gateway": "192.168.0.1" #网关
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
自定义网络的使用:
docker run -d -P --name tomcat0-net-01 --net mynet tomcat
docker run -d -P --name tomcat0-net-02 --net mynet tomcat
测试:都是通的(自定义网络的docker都已经帮我们维护好了对应关系)
docker exec -it tomcat0-net-01 ping tomcat0-net-02
docker exec -it tomcat0-net-02 ping tomcat0-net-01
非 mynet 网络下的容器 tomcat01 想要连接 mynet 网络下的容器:
eg:docker network connect mynet tomcat01
连通之后就是将 tomcat01网络 放到了 mynet 网络下
测试:也是通的
docker exec -it tomcat01 ping tomcat0-net-01
小结:想要跨网络操作别人,就需要使用 docker network connect 连通
注意:我上面的 tomcat 镜像是自定义镜像,镜像里面是有安装 net-tools 工具的,官方 tomcat 镜像是没有 net-tools 工具的