Docker 学习 丨 Docker 网络

333 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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
# 结论 容器和容器之间是可以通信的

绘制网络模型图

image.png

结论

tomcat01 和 tomcat02是公用的一个路由, docker0

所有的容器不指定网络的情况下,都是 Docker0 路由的,docker会给我们的容器分配一个默认的可用 IP

255.255.0.1/16 域

Docker 使用的是Linux 的桥接

image.png

Docker 中所有的网络接口都是虚拟的。转发效率高

只要容器删除 对应的网桥(一对 Veth-Pair)就会删除