[root@iz8vbd1ko98b0el6771a37z ~]# ip addr
# 本地
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
# 阿里云
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:16:14:7d brd ff:ff:ff:ff:ff:ff
inet 172.22.170.13/20 brd 172.22.175.255 scope global dynamic eth0
valid_lft 314250519sec preferred_lft 314250519sec
# docker
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:2f:31:6d:f9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
docker如何处理容器网络访问
[root@iz8vbd1ko98b0el6771a37z ~]# docker run -d -P --name tomcat01 tomcat
# 查看容器内部网络地址: ip addr,
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
# eth0@if39 ip地址,docker分配的
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 容器所在宿主机可以ping通容器
[root@iz8vbd1ko98b0el6771a37z ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.080 m
- 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有网卡docker0 桥接模式,使用的技术是evth-pair技术
[root@iz8vbd1ko98b0el6771a37z ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:16:14:7d brd ff:ff:ff:ff:ff:ff
inet 172.22.170.13/20 brd 172.22.175.255 scope global dynamic eth0
valid_lft 314249714sec preferred_lft 314249714sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:2f:31:6d:f9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
39: vethb811af7@if38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether aa:c3:9b:d5:a9:4c brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 容器带来的网卡都是一对对的
# evth-pair就是一对的虚拟设备接口,都是成对出现的,一段连着协议,一段彼此相连
# evth-pair充当一个桥梁,连接各种虚拟设备
- 容器和容器之间是可以ping通的
tomcat1、tomcat2是公用的一个路由器,docker0.所有的容器不指定网络的情况下,都是由docker0路由的,docker会给容器分配一个默认的可用IP
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.
Docker中的所有网络接口都是虚拟的,虚拟的转发效率高,只要容器删除,对应的网桥一对就没了
[root@iz8vbd1ko98b0el6771a37z ~]# docker run -d -P --name tomcat03 tomcat
f993c3cd26e7d291b4fb8555b73ae1a5112427b77fbcdc26139aba49b1e22a59
[root@iz8vbd1ko98b0el6771a37z ~]# docker run -d -P --name tomcat04 --link tomcat03 tomcat
d3e6174deeb96cbd53ce9a6baa1b9c0d74ac219fdf133e11a73ec0af5992628d
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat04 ping tomcat03
PING tomcat03 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat03 (172.17.0.2): icmp_seq=1 ttl=64 time=0.097 ms
# 反向ping不通
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat03 ping tomcat04
ping: tomcat04: Name or service not known
# tomcat04的hosts中有配置域名解析
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat04 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 tomcat03 f993c3cd26e7
172.17.0.3 d3e6174deeb9
[root@iz8vbd1ko98b0el6771a37z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8af985e6dc86 bridge bridge local
64fa12d055bf host host local
2bf14be33db0 none null local
[root@iz8vbd1ko98b0el6771a37z ~]# docker network inspect 8af985e6dc86
[
{
"Name": "bridge",
"Id": "8af985e6dc861c18425bfbc8e912120af0f10022033cb589dbf1bac8d44edd72",
"Created": "2021-06-20T23:22:41.159235158+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": {
"d3e6174deeb96cbd53ce9a6baa1b9c0d74ac219fdf133e11a73ec0af5992628d": {
"Name": "tomcat04",
"EndpointID": "1a811da6f02384e19957563a973f995c3a9696fdadfd14a1e2901121c1f78e16",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"f993c3cd26e7d291b4fb8555b73ae1a5112427b77fbcdc26139aba49b1e22a59": {
"Name": "tomcat03",
"EndpointID": "3f8e6f8d051cba8bf15cdea445629b2d431a705d10cee7fe240b0bfbae0dc138",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.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": {}
}
]
自定义网络
# 查看所有的docker网络
[root@iz8vbd1ko98b0el6771a37z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8af985e6dc86 bridge bridge local
64fa12d055bf host host local
2bf14be33db0 none null local
网络模式
- bridge: 桥接模式,桥接 docker 默认,自己创建的也是用bridge模式
- none: 不配置网络
- host: 和宿主机共享网络
- container:容器网络连通!(用的少, 局限很大)
测试
# 我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点,默认,容器名不能访问, --link可以打通连接!
# 我们可以自定义一个网络!
# --driver bridge
# --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
# 1. 创建网络
[root@iz8vbd1ko98b0el6771a37z ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
89fac21c26c6243b9e0ef9bcdc5c4db4f1f96a75acbc76d0d0e341d3d96cb0da
[root@iz8vbd1ko98b0el6771a37z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8af985e6dc86 bridge bridge local
64fa12d055bf host host local
89fac21c26c6 mynet bridge local
2bf14be33db0 none null local
# 2. 查看网络信息
[root@iz8vbd1ko98b0el6771a37z ~]# docker network inspect 89fac21c26c6
[
{
"Name": "mynet",
"Id": "89fac21c26c6243b9e0ef9bcdc5c4db4f1f96a75acbc76d0d0e341d3d96cb0da",
"Created": "2021-07-03T22:16:13.746307644+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": {}
}
]
# 3. 创建容器并指定网络
[root@iz8vbd1ko98b0el6771a37z ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
a51a87cafb2dadebea6f7090f508beb87ea060782d100ea98210c08768a56320
[root@iz8vbd1ko98b0el6771a37z ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
6e04467d633af4b6f2beff7ea6dfdad7293d4ba192987cf8116e2402ccbce473
[root@iz8vbd1ko98b0el6771a37z ~]# docker network inspect 89fac21c26c6
[
{
"Name": "mynet",
"Id": "89fac21c26c6243b9e0ef9bcdc5c4db4f1f96a75acbc76d0d0e341d3d96cb0da",
"Created": "2021-07-03T22:16:13.746307644+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": {
"6e04467d633af4b6f2beff7ea6dfdad7293d4ba192987cf8116e2402ccbce473": {
"Name": "tomcat-net-02",
"EndpointID": "cc1c7f178cb9427e5fcb3919198bcfdb3d1e01e5fb311dcb5e798a06a23a35aa",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"a51a87cafb2dadebea6f7090f508beb87ea060782d100ea98210c08768a56320": {
"Name": "tomcat-net-01",
"EndpointID": "f1b3d132f94b6b8007cd8683a86e95362b9ce018039d9e894b0e0155fbf8c114",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 4. 测试容器之间的网络互通性
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat-net-02 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.097 ms
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.104 ms
好处
- redis 不同的集群使用不同的网络,保证集群时安全和健康的
- mysql 不同的集群使用不同的网络,保证集群时安全和健康的
网络连通
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat01 ping tomcat-net-02
ping: tomcat-net-02: Name or service not known
[root@iz8vbd1ko98b0el6771a37z ~]# docker network connect mynet tomcat01
[root@iz8vbd1ko98b0el6771a37z ~]# docker exec -it tomcat01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.119 ms
# 将tomcat01放到mynet网络下
[root@iz8vbd1ko98b0el6771a37z ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "89fac21c26c6243b9e0ef9bcdc5c4db4f1f96a75acbc76d0d0e341d3d96cb0da",
"Created": "2021-07-03T22:16:13.746307644+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": {
"6e04467d633af4b6f2beff7ea6dfdad7293d4ba192987cf8116e2402ccbce473": {
"Name": "tomcat-net-02",
"EndpointID": "cc1c7f178cb9427e5fcb3919198bcfdb3d1e01e5fb311dcb5e798a06a23a35aa",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"a51a87cafb2dadebea6f7090f508beb87ea060782d100ea98210c08768a56320": {
"Name": "tomcat-net-01",
"EndpointID": "f1b3d132f94b6b8007cd8683a86e95362b9ce018039d9e894b0e0155fbf8c114",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"bb3512e4c825f5983ed2b4d14a0c2dd687c1176035d6fdb589ae36c8f7887142": {
"Name": "tomcat01",
"EndpointID": "640088f5f77be08d1d406116ccdd4f9a77c3bf045fa7dbca2da6fff68c562589",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]