目录
一 查看宿主机网络
ip addr
二 容器网络原理
1. 运行容器
docker run -d --name tomcat01 tomcat
2. 查看容器ip
1. 方式1 docker exec -it 容器名或id ip addr
docker exec -it d667c0d4681b ip addr
注意:
如果ip addr如果不能执行,请进入容器执行命令:apt update && apt install -y iproute2
2. 方式2
docker inspect 容器ID或容器名 | grep IPAddress
3. 其他方式 自行百度
4. 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if551 ip地址,docker分配!
3. 测试宿主机和容器之间ip发现网络是否相通的
4. 在运行一个容器
docker run -d --name tomcat02 tomcat
5. 查看宿主机网络发现此时又多了一对网卡 (多的就是刚才tomcat02容器的)
6. 总结
1. 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker, 就会有一个docker0桥接模式,使用的技术是veth-pair技术!
2. 我们发现这个容器带来网卡,都是一对对的 veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的 OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
7. 两个容器:tomcat01和tomcat02 ip互相可以ping的通
docker-tomcat docker exec -it tomcat02 ping 172.17.0.2
7.1 为什么他们是通的呢,看下图
7.2 结论
**结论**:
1. tomcat01和tomcat02公用一个路由器,docker0。 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用 ip
2. Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)只要容器删除,对应的网桥一对就没了!
7.3 Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
三 link
1. 作用
使得两个容器之间可以,通过容器名进行互相通信。docker官方已不推荐使用docker run --link来链接2个容器互相通信,随后的版本中会删除--link。
2. 示例
1. 两个容器通过ip可以互通,但是通过名字就不可以
docker exec -it tomcat02 ping tomca01 # ping不通 ping: tomca01: Name or service not known
2. 新建一个容器tomcat03。关联容器tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
3. 用tomcat03 ping tomcat02 可以ping通
docker exec -it tomcat03 ping tomcat02
4. 用tomcat02 ping tomcat03 ping不通
docker exec -it tomcat02 ping tomcat03
3. 分析
3.1 列出docker的所有网络
docker network ls
网络模式
详情见Docker容器原理剖析:https://blog.csdn.net/qq_41822345/article/details/115229833
bridge :桥接 docker(默认,自己创建也是用bridge模式)。
none :不配置网络,安全性高。使用场景较少。
host :和所主机共享网络。
container :容器网络连通(用得少!局限很大)。
3.2 查看某个网络内部信心
docker network inspect test-network 网络id或网络名
[root@VM-0-4-centos ~]# docker network inspect f51c68840024
[
{
"Name": "bridge",
"Id": "f51c688400249b686e1823ff12064bfb455d20ab23d76297f2147bcf8b8e58b8",
"Created": "2022-03-17T15:11:33.103676398+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { # 这里都是容器的网络信息
"4dd7bf6861ba03d7c4ef9fc28e532967d88b4d13e1ffbc4a98815bc202f548e8": {
"Name": "tomcat02",
"EndpointID": "2ea0d23836931d104527197f2dedcab483bd74a160423a41ef8753c5b1c04e7c",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"d667c0d4681b1a62d0089dc381fae9bdce00fe62b38c4d992546460c4d76835c": {
"Name": "tomcat01",
"EndpointID": "095385e371f36bf74ecafd27c8861df596a616a8e646946e8dc9eb6f09edf767",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/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": {}
}
]
[root@VM-0-4-centos ~]#
总结
# 我们直接启动的命令 --net bridge,而这个就是我们得docker0
# bridge就是docker0
$ docker run -d -P --name tomcat01 tomcat
等价于 => docker run -d -P --name tomcat01 --net bridge tomcat
# docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!
# 我们可以 自定义一个网络
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet