Docker学习笔记 —— Docker 网络

系列文章目录

Docker学习笔记 —— Docker 介绍
Docker学习笔记 —— Docker 安装
Docker学习笔记 —— Docker 常用命令
Docker学习笔记 —— Docker 存储
Docker学习笔记 —— Docker 网络
Docker学习笔记 —— Dockerfile


文章目录

  • 系列文章目录
  • 一、docker 网络
    • 1.1 原理
    • 1.2 网络驱动(Network drivers)
      • 1.2.1 网络驱动总结
      • 1.2.2 网络模式
    • 1.3 host 模式
    • 1.4 container 模式
    • 1.5 none 模式
    • 1.6 bridge
      • 1.3.1 默认 bridge
      • 1.3.2 自定义 bridge
      • 1.3.3 默认网桥和自定义网桥区别


一、docker 网络

1.1 原理

  • Docker 使用 Linux 桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动容器时会根据Docker网桥的网段分配给容器一个IP地址,成为Container-IP,同时Docker网桥是每个容器的默认网关;
  • 因为在同一宿主机的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP直接通信;
  • Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络无法寻址到,这意味着外部网络无法直接通过 Container-IP访问到容器;
  • 如果容器希望外部访问能够访问到,可以通过映射通勤端口到宿主机;

1.2 网络驱动(Network drivers)

  • 默认存在多个驱动程序,并提供核心网络功能;

    • bridge

      • 默认的网络驱动程序,当应用程序在需要通信的独立网络中运行时,通常会使用桥接网络
    • host

      • 对于独立容器,去掉容器和主机的网络隔离,直接使用主机的网络;
    • overlay

      • overlay网络将多个Docker守护进程链接在一起,并使用 swam 服务能够相互通信;
    • macvlan

      • macvlan网络允许将MAC地址分配给容器,使其显示为网络上的物理设备;
      • Docker 守护进程通过容器的MAC地址将流量路由到容器;
    • none

      • 对于此容器,禁用所有网络,通常与自定义网络驱动程序结合使用;
    • Network plugins

1.2.1 网络驱动总结

  • 当需要多个容器在同一Docker主机上进行通信时,用户自定义的桥接网络是最佳选择;
  • 当网络堆栈不应与Docker主机隔离,但是容器的其他方面需要隔离时,主机网络是最佳选择;
  • 当需要在不同Docker主机上运行的容器进行通信时或多个应用程序使用 swarm 服务协同工作时,overlay 网络是最佳选择;
  • 当从 VM 设置迁移或需要容器看起来像网络上的物理主机时, Macvlan 网络是最佳选择,每个主机都有唯一的 MAC 地址;
  • 第三方网络插件允许将 Docker 与咱们的网络堆栈集成;

1.2.2 网络模式

网络 配置 描述
none 模式 --net=none 不配置网络,用户可以稍后进入容器,自行配置;
bridge 模式(默认) --net=bridge 默认值,在Docker网桥docker0上为容器创建新的网络栈;
host 模式 --net=container:name/id 容器和宿主机共享 Network namespace;
container 模式 --net=host 容器和另外一个容器共享Network namespace;
k8s中的pod就是多个容器共享一个 Network namespace;
自定义网络 --net=自定义网络 用户自己使用Network 相关命令定义网络;
创建容器的时候可以指定为自定义网络;

1.3 host 模式

  • 将网络设置为host后,容器将共享主机的网络堆栈,并且来自主机的所有接口将可用于容器,容器的主机名与主机系统的主机名称匹配;
  • host模式下容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用主机的IP和端口,但是容器的其他方面比如文件系统、进程列表等还是和宿主机隔离的;
  • host模式下容器可以使用宿主机的IP地址和外界通信,容器内部的读物端口也可以使用宿主机的端口,不再需要进行NAT转换;
  • host模式最大的好处是网络性能比较好,但是Docker主机上已经使用的端口就不能再用了,网络的隔离性不好;

Docker学习笔记 —— Docker 网络_第1张图片

1.4 container 模式

  • 这个模式指定新创的容器和已经存在的一个容器共享一个 Network namespace,而不是和宿主机共享;
  • 新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等;
  • 同样,两个容器除了网络方面,其他方面如文件系统,进程列表还是隔离的;

Docker学习笔记 —— Docker 网络_第2张图片

1.5 none 模式

  • none模式,Docker容器拥有自己的 Network namespace ,但是,并不为Docker 容器进行任何网络配置;
  • none模式可以在容器创建时通过--Network=none来指定,这种类型的网络没办法联网,封闭的网络能很好的保证容器的安全性;

Docker学习笔记 —— Docker 网络_第3张图片

1.6 bridge

1.3.1 默认 bridge

  • Docker 进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥下面;

Docker学习笔记 —— Docker 网络_第4张图片

  • 容器创建时从doker0子网中分配一个IP给容器使用,并设置docker0的IP为容器的默认网关,在主机上创建一堆虚拟网卡 veth pair 设备,Docker将 veth pair 设备的一段放在新创建的容器中,并命名为 eth0(容器网卡),另一端放在主机中,以 vethxxxx这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中;

Docker学习笔记 —— Docker 网络_第5张图片

  • bridge模式是docker默认网络模式,不写 --net参数就是bridge模式;

1.3.2 自定义 bridge

  • 使用 docker network create命令创建用户定义的桥接网络;
  • 建议使用自定义网桥来控制那些容器可以相互通信,还可以自动DNS解析容器名称到IP地址;

Docker学习笔记 —— Docker 网络_第6张图片

  • 使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看;

Docker学习笔记 —— Docker 网络_第7张图片

1.3.3 默认网桥和自定义网桥区别

  • ①、用户自定义的网桥在容器之间提供自动DNS解析;

    • 默认网桥上的容器只能通过IP地址像话访问,除非使用--link,自定义网桥上,容器可以通过名称或别名相互解析;

Docker学习笔记 —— Docker 网络_第8张图片

  • 如果您在默认桥接网络上运行相同的应用程序堆栈,则需要手动创建容器之间的链接(--link 标志)。这些链接需要在两个方向上创建,因此您可以看到这对于需要通信的两个以上容器变得复杂;

Docker学习笔记 —— Docker 网络_第9张图片

  • ②、用户自定义网桥提供更好的隔离;

    • 在默认的网桥上,不相关的应用堆栈、服务、容器可以相互通信,这是一个风险,使用用户自定义的网络提供一个网络范围,只有连接到该网络的容器才能进行通信;

Docker学习笔记 —— Docker 网络_第10张图片

  • 使用connect互通;

Docker学习笔记 —— Docker 网络_第11张图片

  • ③、容器可以在运行中从用户定义的网络连接和分离;

    • 在容器的生命周期内,可以动态的将其与用户的网络连接或断开连接。但要从默认网桥中删除容器,需要停止容器并使用不同的网络选项重新创建它;
  • ④、每个用户定义网络都会创建一个可配置的网桥;

    • 对默认桥接网络,对其进行配置,则对所有容器都是用相同的设置,且修改配置需要重启Docker;
    • 用户定义桥接网络使用docker network create,如果不同的应用程序组有不同的网络要求,可以在创建时单独配置每个用户定义的网桥;
  • ⑤、默认网桥网络上连接容器共享环境变量;

修改配置需要重启Docker;

  • 用户定义桥接网络使用docker network create,如果不同的应用程序组有不同的网络要求,可以在创建时单独配置每个用户定义的网桥;
  • ⑤、默认网桥网络上连接容器共享环境变量;

你可能感兴趣的:(Docker,docker,运维,linux)