乐趣区

关于前端:Docker0网络及原理探究

个人观点:Docker 网络通信在容器编排、集群部署中具备无足轻重的位置,(玩 docker 不懂 docker0 那就 …… 玩不透哇👀)本篇剖析 Docker 网络,并通过启动几个容器来探索 Docker 网络及容器通信,帮忙读者了解一下😊。

1、Docker0

Docker 服务默认会创立一个 docker0 网桥(其上有一个 docker0 外部接口),它在内核层连通了其余的物理或虚构网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间能够通过网桥互相通信,它还给出了 MTU(接口容许接管的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上反对的默认值。这些值都能够在服务启动的时候进行配置。

2、清空所有镜像

如果是初学者,还不是很理解 docker0 的状况下,倡议清空所有镜像,发明一个比拟洁净的容器网络环境,更加清晰,有助于学习 docker0😃

# 1. 查看运行的容器
docker ps

# 2. 停掉所有正在运行的容器(否则删除不掉)
docker stop [containerID]   # docker stop $(docker container ls -q)

# 3. 执行删除
docker rmi -f $(docker images -aq)

# 4. 查看镜像
docker images

3、查看网卡信息

  1. 先理解一下 ip addr 命令
ip addr

lo        # 本机回环地址 127.0.0.1
eth0      # 阿里云内网地址 172.31.81.32
docker0   # docker 生成的网卡 172.17.0.1
  1. 获取以后网卡 ip 地址和 mac 地址
[root@--- ~]# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:0a:00:34 brd ff:ff:ff:ff:ff:ff
    inet 172.31.81.32/20 brd 172.31.95.255 scope global dynamic eth0
       valid_lft 291944112sec preferred_lft 291944112sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a4:2f:c5:62 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
[root@--- ~]# 

上面通过 docker 启动几个容器来探索一下 Docker 网络👇

4、运行容器之后,再次查看网卡信息

装置 Docker 时,它会 主动创立 三个网络,默认 bridge 网桥(创立容器默认连贯到此网络)、nonehost

4.1、运行 mysql01, centos01, centos02 容器

  • 启动时,docker 默认的 bridge 网桥,docker0 给容器服务主动调配 ip
docker run -it --name mysql01 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
docker run -it --name centos01  centos /bin/bash
docker run -it --name centos02  centos /bin/bash

4.2、查看 ip、mac 地址信息

  • 能够看到下面启动的三个容器服务的 mac 信息
$ 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:0a:00:34 brd ff:ff:ff:ff:ff:ff
    inet 172.31.81.32/20 brd 172.31.95.255 scope global dynamic eth0
       valid_lft 291916543sec preferred_lft 291916543sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:a4:2f:c5:62 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
140: br-799426d70aa2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:7f:01:1d:00 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-799426d70aa2
       valid_lft forever preferred_lft forever
154: vethe3da564@if153: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ea:84:fb:14:47:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
156: veth6477da5@if155: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 86:35:30:8d:14:85 brd ff:ff:ff:ff:ff:ff link-netnsid 1
158: veth17b2712@if157: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 72:76:f0:3c:17:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 2

4.3、查看 docker 网络

[root@--- ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
feafa30d4051   bridge    bridge    local
e8bf4fced9e2   host      host      local
6263db0933b9   none      null      local
[root@--- ~]# 

4.4、查看默认 bridge 网桥(docker0)

[root@--- ~]# docker network inspect feafa30d4051
[
    {
        "Name": "bridge",
        "Id": "feafa30d4051f24353508959bd420fd163ad0c98d6b30ec8ff13b59a59552bb1",
        "Created": "2021-09-26T15:10:27.167774553+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": {"29298987c51b777b546bf6626560020ce235e390e1d7fcfe188c6db228ca4edf": {"Name":"mysql01","EndpointID":"f6572c49234f74a6c0b652a379bb386f843ebd23b02abd59b1f6a9d1c9534b17","MacAddress":"02:42:ac:11:00:02","IPv4Address":"172.17.0.2/16",    # ✨容器的 IP✨"IPv6Address":""},
            "cb1922b95b9316d129b54f3545fad9729092926e10a1d5517f8928db42706151": {
                "Name": "centos01",
                "EndpointID": "ef6cfa74f56bfa4f49143aa08cf323812002236bc63f75204dee7c3ec1162250",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",    # ✨容器的 IP✨
                "IPv6Address": ""},"cc6f510b9765ba018dbafd416c9774ddf5fd3ff55fa992827f55516e8dc70b6a": {"Name":"centos02","EndpointID":"2f901aec8f8b455d1fb06112c9035a19f34cc597d8907f26f1b896f12d7eb7ba","MacAddress":"02:42:ac:11:00:04","IPv4Address":"172.17.0.4/16",    # ✨容器的 IP✨"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": {}}
]

4.5、测试容器通信

此时,进入 centos01 容器,ping mysql 容器的 ip 能够 ping 通,然而 ping 不通容器名 ❗

docker exec -it cb1922b95b93 /bin/bash
ping 172.17.0.2

# docker0 不反对容器名连贯拜访
ping mysql01
ping: mysql01: Name or service not known


docker run 启动镜像的时候 docker 都会调配一个网卡地址

#查看运行容器的 ip
docker inspect 容器 ID | grep IPAddress

如下图👇

5、容器通信原理

  • 只有咱们装置了 docker,就会有一个网卡 docker0(相当于一个路由器),每启动一个 docker 容器,docker 都会给 docker 容器调配一个 ip(连贯路由器的终端,同一网段下终端能够相互通信),
  • 通过 evth-pair 技术实现,evth-pair就是一对 虚构设施接口 ,他们都是成对呈现的,一端连着协定,一端彼此相连,evth-pair 充当一个桥梁,连贯各种虚构网络设备。
  • Docker 网络应用的是Linux 桥接,宿主机是 docker 容器的网桥,docker0,最多调配 65535 个
  • 删除容器之后,虚构网卡就主动隐没了。(虚构网卡传递效率高!

启动容器不设置网络,容器 ip 由 docker0 主动分配情况下,容器间的通信,要通过 evth-pair 技术实现,并不是直连的。(跟计算机网络通信相似,分层模型,TCP/IP 协定数据报封装解封装)

5.1、论断

  1. tomcat01,tomcat02是共用的一个路由器,docker0
  2. 所有的容器启动时,如果不指定网络的状况下,都是 docker0 路由的。65535

最初

下面 docker0 不反对容器名连贯拜访,容器通信只能够通过容器 ip 通信,docker 也无奈保障容器重启后的 IP 地址不变,所以更好的形式是 通过别名进行互联,下篇持续解说怎么通过别名进行容器通信,😊😊。


🌹 继续更文,关注我,你会发现一个虚浮致力的宝藏前端😊,让咱们一起学习,独特成长吧。

🎉 喜爱的小伙伴记得点赞关注珍藏哟,回看不迷路 😉

🎁 欢送大家评论交换, 蟹蟹😊

本文由 mdnice 多平台公布

退出移动版