介绍
- docker有一个默认网络docker0, 容器之间默认使用docke0 网络
- 每一个 docker容器是相互隔离的,容器之间、容器与宿主机之间是在同一子网,使用 ip 可通信
- 容器之间可使用
link
互联- 自定义网络
- 不同容器之间通信
查看本地网络
ifconfig
宿主机与容器通信
#安装tomcat9527
docker run -d -P --name tomcat9527 tomcat:8.0
#查看tomcat ip
docker exec -it 69185a4c3004 ip addr
- tomcat9527网络查看
docker network inspect af3d4a96068e
tomcat9527 网关是docker0 ip地址,容器与宿主机在同一子网可以ping 通
容器之间通信
#安装tomcat9528
docker run -d -P --name tomcat9527 tomcat:8.0
# 进入容器
docker exec -it 9c03cb6a8bef /bin/bash
# 查看ip
ip add
# tomcat9528-> ping tomcat9527
ping 172.17.0.2
# 组合命令 (只能ping通容器ip,容器名称ping不通)
docker exec 69185a4c3004 ping 172.17.0.2
容器之间通信依赖于宿主机docker0 网路,同一个主机下,docker 容器使用ip 可以实现通信。
实际运用中,ip可能会发生变化,尤其是分布式中,只能通过容器名访问,容器之间互联可以使用 -link
实现互联
容器互连
# 启动一个tomcat9529
docker run -d -P --name tomcat9529 --link tomcat9527 tomcat:8.0
# tomcat9529 ping -> tomcat9527
docker exec tomcat9529 ping tomcat9527
--link
是单项连接
- 网络配置
[root@localhost ~]# docker exec tomcat9529 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat9527 69185a4c3004
172.17.0.4 220f9c19d4ce
[root@localhost ~]#
[root@localhost ~]# docker exec tomcat9527 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 69185a4c3004
[root@localhost ~]#
实际 tomcat9529 配置了tomcat9527地址
使用--link
可实现容器互联,使用容器名通信,但是是单项的,在分布式中,使用link 会吐血 珍爱生命,远离link
除了 link 之网络通信,可以创建一个新的网络, 先了解下docker 网络类型
自定义网络
- Docker 网络类型
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | -net=host | 容器和宿主机共享Network namespace。主机! |
container模式 | -net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | -net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。自己设置 |
bridge模式 | -net=bridge | (默认为该模式) 路由器,自动划分ip! |
- 创建网络
docker network create --driver bridge \
--subnet 192.168.0.0/16 \
--gateway 192.168.0.1 \
ikang-network
- 查看
[root@localhost ~]docker network ls
[root@localhost ~]# docker network inspect ikang-network
[
{
"Name": "ikang-network",
"Id": "5cfb420c6e4e325063356134b7c48058590f296aa95209f7a1e8a725b7049c28",
"Created": "2020-06-13T16:55:19.784400814+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": {
"851cf3527af39d82f0f4edfb054f73a02fec68d245a727afb1ffa25f75b9ef69": {
"Name": "tomcat-ikang02",
"EndpointID": "c95eb2eab805e011fdd32ba0593a11283cf9ee453e6f2649eef1b6c6af4ef1cd",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"d82234131a953dd1dae7bc5e9d321c43bcbd3f24734af4c67ccb020e3b624c60": {
"Name": "tomcat-ikang01",
"EndpointID": "e3fc9e78420d857c7bba01d934115ae918a38cad355405d79f5e3e908a947328",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
- 创建tomcat-ikang01 连接自定义网络
docker run -d -P --name tomcat-ikang01 --net ikang-network tomcat:8.0
- 创建tomcat-ikang02 连接自定义网络,使用容器名和IP分别访问tomcat-ikang01
- 使用自定义网络,创建容器,容器可相互访问
- 自定义网络比docker0 更智能,不只限于IP 访问
容器互通
- 梳理
网络 | 服务 | 说明 |
---|---|---|
docker0 | tomcat9527、tomcat9528、tomcat9529 | 三个服务都连接到docker0,tomcat9529 与tomcat9527 link连接 |
ikang-network | tomcat-ikang01、 tomcat-ikang02 | 服务与ikang-network互联 |
- 配置
tomcat01 连接到ikang-network, 与ikang-network 网络下设备通信
docker network connect ikang-network tomcat9527
docker exec tomcat9527 ping tomcat-ikang01
实现docker0 下tomcat9527 与 ikang-network 网络下设备通信,tomcat9527 使用双网卡