Docker 网络Network

一、简介

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个组件连接方式:

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

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

二、基本概念

是什么?

是 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

sql 复制代码
# 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

2、host 主机模式

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

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

3、none

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

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

4、container

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

5、自定义模式

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

命令:

docker network COMMAND

docker 网络管理命令

sql 复制代码
[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.

创建网络的帮助文档

sql 复制代码
[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 ~]# 

桥接模式的容器互联

跨网络通信

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

连接方式

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

arduino 复制代码
docker network connect liuqingxu net1
相关推荐
paopaokaka_luck1 分钟前
基于Spring Boot+Vue的多媒体素材管理系统的设计与实现
java·数据库·vue.js·spring boot·后端·算法
微刻时光4 分钟前
Docker部署Nginx
运维·nginx·docker·容器·经验
guoruijun_2012_48 分钟前
fastadmin多个表crud连表操作步骤
android·java·开发语言
Hello-Brand18 分钟前
Java核心知识体系10-线程管理
java·高并发·多线程·并发·多线程模型·线程管理
小安运维日记19 分钟前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
乐悠小码24 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.26 分钟前
Pod控制器
java·开发语言
陈小肚26 分钟前
k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
docker·容器·kubernetes
2的n次方_28 分钟前
二维费用背包问题
java·算法·动态规划
皮皮林55129 分钟前
警惕!List.of() vs Arrays.asList():这些隐藏差异可能让你的代码崩溃!
java