小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
Docker 学习 丨 Docker 网络
理解 Docker0
获取当前 IP 地址 ip addr
[root@VM-8-10-centos xujiantong]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:4c:83:06 brd ff:ff:ff:ff:ff:ff
inet 10.0.8.10/22 brd 10.0.11.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe4c:8306/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:fc:84:98:fb 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
inet6 fe80::42:fcff:fe84:98fb/64 scope link
valid_lft forever preferred_lft forever
三个网络
lo 本机回环地址
本地回环地址,不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口
eth0 腾讯云内网地址
docker0 Docker 生成的网卡
问题: Docker 是如何处理容器网络访问的?
现有两个容器 tomcat 和 mysql , tomcat 容器中的Web 项目如何去访问 Mysql 呢?怎么做连接呢?
有几种方法?
# 1.启动 Tomcat
docker run -d -P --name tomcat01 tomcat
# 2.查看容器的内部网络地址
docker -it tomcat01 /bin/bash
# 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 f9621c7b667e
exit
ping 172.17.0.2 # 宿主机可以ping通 Docker 容器内部
# 那么容器之间可以 ping 通么?
docker 会(给容器)分配一个网卡 ` inet 172.17.0.1/16`
`容器 1` inet 172.17.0.2
`容器 2` inet 172.17.0.3
同一个网段可以 ping 通
# 每启动一个 docker 容器, docker 就会给 docker 容器分配一个 ip, 只要安装了 Docker 就会有一个网卡 Docker0 (桥接模式)
# 使用的技术是 veth-pair 技术
ip addr
# 结果增加了一个 15: vethe0ab784@if14
39: vethb3e5864@if38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ba:75:96:80:2a:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::b875:96ff:fe80:2af1/64 scope link
valid_lft forever preferred_lft forever
41: veth33009ba@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4e:ea:f5:f3:bc:4f brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::4cea:f5ff:fef3:bc4f/64 scope link
valid_lft forever preferred_lft forever
# 再次启动一个 tomcat 容器
docker run -d -P --name tomcat02 tomcat ip addr
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
41: veth33009ba@if40 与 40: eth0@if41 成对
# 我们发现这个容器带来的昂卡,都是一对一对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的, 一段连着协议, 一段彼此相连
# 正因为有这个特性,veth-pair 充当一个桥梁, 连接各种虚拟网络设备
# Openstac,Docker 容器之间的连接,OVS 的连接,都是使用 veth-pair 技术的
测试 Tomcat 01 和 Tomcat02 是否可以 PING 通
docker exec -it tomcat02 ping 172.17.0.2
# 结论 容器和容器之间是可以通信的
绘制网络模型图
结论
tomcat01 和 tomcat02是公用的一个路由, docker0
所有的容器不指定网络的情况下,都是 Docker0 路由的,docker会给我们的容器分配一个默认的可用 IP
255.255.0.1/16 域
Docker 使用的是Linux 的桥接
Docker 中所有的网络接口都是虚拟的。转发效率高
只要容器删除 对应的网桥(一对 Veth-Pair)就会删除