• 云原生 | Docker - [Network]


    §1 Docker 的网络

    §1.1 初识

    docker 的网络和虚拟机的网络类似

    • 每个 docker 容器 (类比与虚拟机) 都会配置自己的网络设置
    • docker 的网络可以在容器外单独创建,但最终需要连接到容器
      例如:启动 docker 服务后,会出现下面网络
      在这里插入图片描述
      docker0 就是 Docker 默认网络模式 (bridge) 的默认网络
      默认启动的容器若不针对网络进行设置就会自动连接到这个 docker network 上

    §1.2 用途
    • 用于将不同容器加入同一网段,以保证容器间通讯、端口映射
    • 容器 IP 变动时通过服务名进行网络通讯
      容器 IP 变动的影响,如下图,查看当前运行的 ubuntu 容器
      在这里插入图片描述
      可见IP地址如下
      在这里插入图片描述
      删除并重新运行另一个容器,为了区分,这里干脆换了个容器,再查看容器信息
      在这里插入图片描述
      在这里插入图片描述
      上面过程简单模拟了实际使用场景下各种容器的创灭变动,可以看到 IP 是随着这个过程在不同容器上来回飘的
      在不进行相关配置的前提下,这可能会导致下面场景
      容器 A容器 B 通信
      容器 B 挂了
      容器 C 创建,Docker 将去世的 容器 B 的 IP 分给了它,且这俩容器不是同一个镜像
      容器 A 因为是通过 IP 连接的,所以现在和 容器 C 通信了
      容器 D 作为 容器 B 的转世复活了,但已经被 容器 C NTR了
    §1.3 网络模式 / 网络驱动

    bridge

    • 类似虚拟机的 NAT 模式
    • 默认 网络模式,同时也适用于绝大多数场景
    • 每个容器都生成自己的虚拟网卡
    • 具有独立的 IP
    • 容器自动连接到一个 docker0

    bridge 网络的模型

    随便进入一个 bridge 网络的容器,通过 yum -y install net-tools 安装 ifconfig 指令并使用,可见 容器网络 eth0
    在这里插入图片描述
    退出容器,在主机上查看 ifconfig,可见 主机网络 ens33默认网桥 docker0 以及两个 主机上容器虚拟网络 veth
    在这里插入图片描述
    veth 网络有两个,因为现在有两个容器在运行
    在这里插入图片描述
    主机网络 ens33、网桥 docker0 、主机上容器虚拟网络 veth 和 容器网络 eth0 之间关系如下图
    在这里插入图片描述

    • docker0 相当于一个交换机,与主机的网络 ens33 相连
    • veth 与 容器内的 eth0 两两配对,可以用 ip addr 指令各网络前的序号对照二者的对应关系
    • 容器 A 的网络 eth0 通过对应的 veth 再经过 docker0 与主机 ens33 实现网络通讯
    • 容器 A 的网络 eth0 通过对应的 veth 再经过 docker0,经由容器 B 的 veth 在经过容器 B 的 etho0 实现容器间的网络通讯

    host

    • 类似虚拟机的 BRIDGE 模式
    • 容器不生成自己的虚拟网卡
    • 使用主机的 IP 和端口

    host 网络的模型
    容器不再通过 容器内的 eth0 (host 模式下就压根没有 eth0) 与主机上的 虚拟网络 veth 匹配而达成通信
    host 模式下的容器会直接使用主机的 IP 和端口,假设:
    主机 IP 是 192.168.3.11,容器的 Dockerfile 中 EXPOSE 8080
    则容器直接通过 192.168.3.11:8080 访问,若主机 8080 端口占用,顺次 +1
    在这里插入图片描述
    需要注意:host 网络模式下 docker run-p 参数是失效的,伴随如下提示,如下例

    WARNING: Published ports are discarded when using host network mode
    
    • 1

    在这里插入图片描述

    none

    • 容器有独立的 Network namespace
    • 不进行任何网络设置(分配 veth pair、网桥连接、IP 等)

    container

    • 容器不生成自己的虚拟网卡
    • 容器不配置自己的 IP
    • 与另一个指定的容器共享 IP 和端口
    • 当被共享的容器停止或变更网络时,当前容器会丢失网络或同步变更网络

    container 网络的模型
    在这里插入图片描述

    §1.4 指定网络模式

    docker run 时通过下面参数指定
    --network bridge 连接到网桥,默认使用 docker0
    --network host
    --network none
    --network container:容器名或 ID

    §2 网络指令

    查看 docker 网络命令

    docker network COMMAND

    在这里插入图片描述
    docker 容器连接到网络

    docker network connect

    创建 docker 网络

    docker network ls

    docker 容器断开网络连接

    docker network disconnect

    查看 docker 网络细节

    显示网络的详细信息 (可以显示一个或多个)
    docker network inspect

    查看 docker 网络模式

    docker network ls

    在这里插入图片描述
    docker 裁剪

    删除所有不用的网络
    docker network prune
    不用的网络是指 一次也没有被链接 的网络

    删除 docker 网络

    docker network rm

    §3 自定义网络

    解决问题

    §1.2 用途

    步骤
    新建网络
    在这里插入图片描述
    通过新建的网络启动容器
    docker run -d -p 8081:8080 --network net_tomcat_01 --name tom tomcat
    docker run -d -p 8080:8080 --network net_tomcat_01 --name tom1 tomcat
    在这里插入图片描述
    tom ping tom1
    docker exec -it tom /bin/bash
    ping tom1
    在这里插入图片描述

    自定义 bridge 网络 与默认 bridge 的区别
    各个网络(其实就是虚拟网卡)如下图所示
    在这里插入图片描述

    自定义的网络 net_tomcat_01 是一个 bridge 网络,使用的虚拟网卡是 br-57865823eeb8
    但 docker 本身有一个默认的 bridge 网络,就叫 bridge,使用的虚拟网卡是 docker0
    使两个容器都指定默认的 bridge 网络是否可以达成上例中的效果?

    docker run -d -p 8080:8080 --network bridge --name tom1 tomcat
    docker run -d -p 8081:8080 --network bridge --name tom2 tomcat

    在这里插入图片描述
    在这里插入图片描述

    比较四个 tomcat 的网络,未找到明显区别
    因此只能理解为 默认的 bridge 网络中没有 DNS

  • 相关阅读:
    优先级队列(堆)
    喵 ~ 小程序搭建记录
    数据结构介绍
    介绍一种在Vue 3.0 下封装第三方插件的方法
    LeetCode刷题系列 -- 652. 寻找重复的子树
    BS4网络提取selenium.chrome.WebDriver类的方法及属性
    使用图片制作3D背景
    【电力电子技术】电力电子器件:概述
    Ubuntu Server 20.04 LTS 环境下搭建vim 编辑器Python IDE
    C++ 一些错误的解决方案汇编
  • 原文地址:https://blog.csdn.net/ZEUS00456/article/details/126411015