Docker 网络Network

2023年 9月 12日 71.7k 0

一、简介

Docker的网络结构来源于一种容器网络模型(CNM)的方案,核心部分是Libnetwork,Libnetwork是对CNM的一种实现,在GitHub上有开源libnetwork: networking,Libnetwork提供了Docker的核心网络结构的全部功能,还提供了本地服务发现和基础容器的负载均衡

Docker网络结构组成

Docker的网络结构由3部分:

  • CNM:设计标准,规定了Docker网络架构的基础组成要素
  • Libnetwork:基础组件,控制管理层,Docker采用的CNM的具体实现,用Go语言编写
  • 驱动:网络数据层,通过实现特定网络拓扑的方式来拓展模型网络能力

CNM

CNM中规定了Docker网络的基础组成要素,其中定义个3个基本要素:沙盒(Sandbox)、终端(Endpoint)和网络(Network)

沙盒:是一个独立的网络栈、其中包括以太网接口、端口、路由表以及DNS配置

终端:虚拟网络接口、可以理解为普通网络接口一样,主要负责创建连接。在CNM中,终端负责将沙盒的网络与外部网络联通

网络:就是网络!类似于交换机的软件实现

3个组件连接方式:

image.png

Docker容器是环境中最小的调度单位,容器间的网络连接大致,如下图:

容器A只有一个网络接口连接到了网络1,容器B有2个网络接口,分别连接到了网络1和网络2。容器A和容器B都链接了网络1所以互相通信的,但是容器B中的2个EP没有第三层架构,所以不能相互通信。

image.png

二、基本概念

是什么?

是 Docker 对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。

为什么需要?

  • 容器间的网络隔离
  • 实现部分容器之间的网络共享
  • 管理多个子网下容器的 ip

能干什么?

  • 提供了多种模式,可以定制化的为每个容器置顶不同的网络

  • 自定义网络模式,划分不同的子网以及网关、dns等配置

  • 网络互通

    • 实现不同子网之间的网络互通
    • 基于容器名(主机名)的方式在网络内访问

三、网络模式

Docker的网路模式一共有4中:

  • Bridge
  • none
  • host
  • Container
Docker网络模式 配置 说明
host模式 –net=host 容器和宿主机共享Network namespace。
container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
bridge模式 –net=bridge (默认为该模式)

当我们安装Docker时,就自动装上了3种网络模式:Bridge、none、host

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
89ec3f4e7254   bridge    bridge    local
d7c9c94fa497   host      host      local
cf539b4d3a68   none      null      local

创建容器时,默认使用的是Bridge模式

1、bridge 桥接模式

在主机中创建一个 Docker0 的虚拟网桥,在 Ddocker0 创建一对虚拟网卡,有一半在主机上 vethxxx,还有一半在容器内 eth0

image.png

2、host 主机模式

容器不再拥有自己的网络空间,而是直接与主机共享网络空间,那么基于该模式创建的容器对应的 ip 实际就是与主机同一个子网,同一个网段。

缺点:直接把容器的网络暴露出去

image.png

3、none

Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息,意味着,当前容器处于不联网状态。

特点:完全隔离,与外部任何机器都无网络访问,只有自己的 lo 本地网络 127.0.0.1

image.png

4、container

image.png

就是不会创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等

image.png

5、自定义模式

不适用 Docker 自带的网络模式,而是自己去定制化自己特有的网络模式。

命令:

docker network COMMAND

docker 网络管理命令

[root@iZwz936bbexlrZ ~]# docker network 
​
Usage:  docker network COMMAND
​
Manage networks
​
Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
​
Run 'docker network COMMAND --help' for more information on a command.

创建网络的帮助文档

[root@iZwz936bbexlrZ ~]# docker network create --help
​
Usage:  docker network create [OPTIONS] NETWORK
​
Create a network
​
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment
[root@iZwz936thmcmvxsgbbexlrZ ~]# 

桥接模式的容器互联

image.png

跨网络通信

image.png

不同容器的网络模式不同,如何使两个容器连接起来

连接方式

image.png

将容器的也连接到自定模式上

docker network connect liuqingxu net1

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论