文章目录
Docker
一、Docker网络
1. Docker0网络
启动docker后,输入命令 ip addr
,可以看到docker0地址:
docker0就是安装docker后,docker的网卡。
2. 测试
- 启动一个tomcat容器,然后查看容器内部网络地址:
docker exec -it tomcat01 ip addr
:
我们可以看到两个IP地址: lo 和eth0@,这个eth0就是docker为我们分配的,我们尝试用linux主机去ping容器内部,看能否ping通?
发现是可以ping通的!我们看到 docker0的ip地址为:172.17.0.1 ,启动的tomcat01容器分配的地址为:172.17.0.3,这两个ip在同一网段。
- 再输入 ip addr 可以发现多了一对网卡和上面启动的tomcat01容器相对应
- 我们只要安装了docker,就会有一个网卡(docker0),网络模式为桥接模式,使用的是 evth-pair技术;
- 每启动一个容器docker就会为它分配一个IP地址,对应的也会多一对网卡!
- 容器和linux主机可以ping通,而且每个容器之间也可以通过ip地址ping通。
- evth-pair 技术
docker容器带来的网卡都是一对一对的,evth-pair 就是一对的虚拟设备接口,都是成对出现的,一段连着协议,一段彼此连接,evth-pair 就像一个桥梁,连接各种虚拟网络设备。
两个tomcat容器怎么通信的?(桥接+evth-pair)
两个容器公用一个路由器(docker0),所有容器不指定网络时,都是由docker0路由的,它会为容器分配一个默认的ip地址,当容器删除时,对应的一对网桥就消失了。
二、容器互联(–link)
1. --link
- 问题:不使用ip地址ping,容器之间可不可以通过容器名来ping通?
这里我们启动两个tomcat容器 (tomcat01、tomcat02),通过容器名ping:
我们发现时ping不通的,docker提供了 --link命令
docker run -d -P --name tomcat02 --link tomcat01 tomcat
这时我们再通过容器名去ping:
发现可以ping通了!反向ping可以通吗?
不能反向ping!因为我们是用 tomcat02 --link tomcat01。
- –link本质
我们查看tomcat02的网络配置文件,可以发现它与tomcat01的关联:
所以docker 的–link命令,其实就是在hosts文件中增加了一个映射!
2. docker network [可选参数]命令
# 可选参数
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
- docker network ls
网络列表
2. docker network NETWORK ID
检查一个或多个网络上的显示详细信息
[root@localhost ~]# docker network inspect 6b6cc70f95a7
[
{
"Name": "bridge",
"Id": "6b6cc70f95a716a340a5207191d635d2f23c9bff1ad7900a136a0b8a12a7664d",
"Created": "2020-08-24T12:36:18.053334885+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"29704d74f807143d212b8ba19922c6d36244bb54ceefc053fc2daa3857fa5b9a": {
"Name": "pedantic_curie",
"EndpointID": "ec79480d7b5e5c58467dd06a2e5118805c6faa2f4a5b2836b728e7bd84ab64d4",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"7a8de64c401bc05fe680b4898febb9eb6993756e1776616a7d0b8dbbbb29e480": {
"Name": "tomcat01",
"EndpointID": "378f41577b6822e91ae6d64b8513d113eca2dc0f57aa260ab0afb6df8a5fbdc4",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"8d5c45c413e8e3cb3eff0f6d28af9ab7bd053935bf633fe8ae7a37d67708513d": {
"Name": "tomcat02",
"EndpointID": "d34fc2f33dd98cb488ada1a5de02ddd0d1d111e790d90e01ac7075fb1e04e5ed",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
三、自定义网络
- docker network ls
网络列表
bridge:桥接模式(docker默认)
host:和宿主机共享网络
none:不配置网络
- 我们上面启动容器通过
docker run -d -P --name tomcat01 tomcat
启动的,实际上docker默认为docker run -d -P --name tomcat01 --net bridge tomcat
,容器之间不能通过域名访问,只能使用 --link打通,这里我们自定义网络! - 自定义网络
docker network create
# docker network create --driver bridge:桥接模式 --subnet:子网 --gateway:网关 mynet:网络名
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
查看自定义网络信息:
我们启动两个tomcat容器,走我们自定义的网络:
docker run -d -P --name tomcat01-net --net mynet tomcat
docker run -d -P --name tomcat02-net --net mynet tomcat
查看自定义网络情况:docker network inspect mynet
测试:
我们发现将容器映射到自定义的网络上,容器之间不论是通过ip还是名字,不论正向还是反向都能互相ping通!!
四、网络连通
我们假象在不同网卡上的容器间能否直连?
显然这样是不可能的!
我们可以使用docker network connect连接,连接一个容器到一个网络,从而实现!
测试:
# 将docker0下的tomcat01连接到mynet网卡上
docker network connect mynet tomcat01
查看mynet信息:
我们发现,通过docker network connect命令,成功将tomcat01连接到mynet上,这样一个容器就拥有两个IP地址!!
此时两个容器就可以ping通了:
//下篇再见…谢谢