Docker网络原理及案例详解

文章目录

      • 简介
      • Docker网络产生的过程
      • Docker network的作用
      • 网络模式
        • 网络模式---bridge
        • 网络模式---host
        • 网络模式---none
      • 自定义网络

简介

Docker网络实现容器之间通信和连接外部网络的功能,主要的网络连接方式有桥接网络(Bridge Network、主机网络(Host Network)、none网络。

Docker网络产生的过程

1.首先我们查看docker不启动的时候 宿主机默认网络情况
Docker网络原理及案例详解_第1张图片
网卡详解:
在安装 Linux 操作系统时,常见的网络接口命名可能包括 ens33、lo 和 virbr0。以下是每个网络接口的简要介绍:

ens33:ens33 是一种命名约定,用于表示以太网接口的网络接口。在不同的系统和配置中,以太网接口的名称可能会有所不同。ens33
通常是物理网卡(例如以太网卡)的默认命名方式,如第三个以太网接口。它用于连接网络,并提供通过以太网进行通信的功能。

lo:lo 是一个特殊的网络接口,代表本地回环接口(Loopback
Interface)。本地回环接口是一个虚拟接口,用于在计算机内部进行数据通信,实现网络上的通信循环。通过 lo
接口发送的数据将在计算机内部回环,不会实际通过网络传输。

virbr0:virbr0 是一种虚拟桥接接口,通常与虚拟化技术(如KVM、VirtualBox等)相关。它是为虚拟机提供网络连接而创建的虚拟网桥。虚拟机可以通过该接口与宿主机和其他虚拟机进行网络通信。virbr0 接口是由主机上的虚拟化软件自动创建和配置的。 这些网络接口在 Linux 操作系统中具有不同的作用,ens33 用于物理网络连接和通信,lo 用于本地回环通信,而 virbr0 是与虚拟机相关的虚拟桥接接口。如安装图形化桌面就会出现virbr0,可以通过yum removelibvirt-libs.x86_64 将其卸载。

  1. Docker启动后,网络情况
    命令:systemctl start docker
    docker启动会产生一个名为docker0的虚拟网桥
    Docker网络原理及案例详解_第2张图片

Docker0的原理和作用如下:

  1. 虚拟网络桥接器:docker0是一个虚拟网络桥接器,它充当主机和Docker容器之间的通信桥梁。它通过将主机上的物理网络接口(如eth0)与容器中的虚拟以太网桥接在一起,使得容器能够通过主机进行网络连接,以及容器之间的网络通信。

  2. IP地址分配:docker0接口将分配给它一个IP地址,通常是172.17.0.1。这个IP地址是用作docker0接口所在的子网网关,容器将通过这个网关访问主机和外部网络。

  3. 默认桥接网络:docker0接口是Docker默认桥接网络的一部分。当你创建一个新的桥接网络时,Docker会自动在主机上创建一个虚拟以太网桥,并将其与docker0接口连接起来。这允许容器通过docker0和其他容器进行通信。

  4. 容器互联:docker0接口还充当了容器互联的中介。容器通过与docker0接口连接,可以实现容器之间的通信。Docker在创建容器时会为每个容器分配一个独立的IP地址,并将其添加到docker0接口中。

总而言之,docker0是一个虚拟网络桥接器,在Docker中起到了连接主机和容器、实现容器间通信的关键作用。通过docker0接口,容器能够访问主机和外部网络,并且容器之间可以通过docker0接口进行通信。

Docker network的作用

  1. 容器间通信:Docker网络允许在同一宿主机上的不同容器之间建立网络连接,容器可以通过网络进行通信和交互。这种容器间的通信可以通过容器名称或IP地址进行。

  2. 与其他服务通信:Docker容器可以与主机上的其他服务(如数据库、缓存等)以及外部网络中的服务进行通信。通过使用Docker网络,容器可以通过网络连接到外部服务,实现与其他服务的交互。

  3. 网络隔离:Docker网络提供了隔离和分割容器的网络环境的机制。每个网络由一个独立的网桥或虚拟网络设备管理,使得容器之间的网络通信与主机或其他容器的网络隔离开来,提供更安全的环境。

说明:
· 容器间的互联和通信以及端口映射
· 容器IP变动时候可以通过服务名直接网络通信而不受到影响
当微服务容器需要访问Mysql容器的时候,如果写死IP访问会有可能会导致微服务连不上数据库因为容器重启、宕机有可能IP会发生变化
Docker网络原理及案例详解_第3张图片

网络模式

常用命令

  1. docker network create:创建一个新的Docker网络。可以指定网络驱动程序、子网、网关等选项进行自定义网络配置。

  2. docker network ls:列出已创建的Docker网络。它将显示网络的ID、名称、驱动程序和作用域。

  3. docker network inspect:检查特定Docker网络的详细信息。可以提供网络的名称或ID作为参数,返回与网络相关的配置和连接信息。

  4. docker network connect:将容器连接到现有的Docker网络。需要指定容器和网络的名称或ID。连接后,容器可以通过网络与其他容器进行通信。

  5. docker network disconnect:断开容器与特定Docker网络的连接。需要指定容器和网络的名称或ID。断开连接后,容器将无法通过该网络与其他容器通信。

  6. docker network rm:删除不再使用的Docker网络。需要指定网络的名称或ID。删除网络前,必须确保没有容器连接到该网络。

  7. docker network prune:清理没有容器连接的所有未使用的Docker网络。可以一次性删除所有未被使用的网络,注意此操作是不可恢复的。

也可以通过docker network --help进行查看
Docker网络原理及案例详解_第4张图片

默认3大网络模式
命令
docker network ls
Docker网络原理及案例详解_第5张图片
Docker网络在容器之间实现通信和连接外部网络的功能。下面是一些常见的Docker网络概念和驱动程序:

  1. 桥接网络(Bridge Network):这是Docker默认的网络模式。每创建一个容器,Docker会在主机上创建一个虚拟网络接口,并为容器分配一个独立的IP地址。
    桥接网络使得容器之间可以通过IP地址进行通信,将容器连接到一个docker0

  2. 主机网络(Host Network):在主机网络模式下,容器与主机共享同一个网络接口。容器可以直接使用主机的IP地址和端口,使得容器的网络性能更高,但也失去了网络隔离的优势。

  3. 没有网络(none):容器独立的Network namespace空间,没有对网络进行设置,如分配veth pair和网络桥接、IP等。容器在此网络中没有网络连接,与宿主机和其他容器完全隔离。它通常用于一些特殊的场景和需求,不适合需要进行网络通信的应用程序。

使用说明

  • bridge模式:使用–network bridge指定,默认使用docker0 ·
  • host模式:使用–networkhost指定 ·
  • none模式:使用–network none指定 · container模式:使用–network
    container:NAME或者容器ID指定
网络模式—bridge

查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name
在这里插入图片描述
ifconfig
在这里插入图片描述

Bridge网络原理解析:

  1. Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
    因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

  2. docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。

  3. 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。

3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth
pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。 通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

Docker网络原理及案例详解_第6张图片

两两匹配验证及容器实例内默认网络IP生产规则
案例:启动两个centos实例centos1 centos2
命令

docker run -it -d --name centos1 centos bash
docker run -it -d --name centos2 centos bash

Docker网络原理及案例详解_第7张图片

两两匹配验证
查看宿主机的网卡信息
ip a |tail -n 8
在这里插入图片描述

进入centos1容器查看网络信息
在这里插入图片描述

进入centos2容器查看网络信息
Docker网络原理及案例详解_第8张图片
结论:docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一 一匹配。

容器实例内默认网络IP生产规则:
通过docker inspect进行查看centos1、centos2
命令

docker inspect centos1 |grep -A 20 "Networks" 
docker inspect centos2 |grep -A 20 "Networks"

centos1 容器网络信息
网络模式:bridge
Ip:172.17.0.3
Docker网络原理及案例详解_第9张图片
centos12 容器网络信息
网络模式:bridge
Ip:172.17.04
Docker网络原理及案例详解_第10张图片
结论:容器创建时,不指定参数,默认使用bridge网络模式、IP会按顺序分配一个。

网络模式—host

它与默认的桥接(bridge)模式不同,在主机模式下,容器使用与宿主机相同的网络接口和IP地址,因此它们可以直接访问宿主机的网络。

说明
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
Docker网络原理及案例详解_第11张图片

案例
运行一个centos容器命名为centos2.1
docker run -d --network host --name centis:2.1 centos

看容器实例内部

docker inspect centos:2.1|tail -n 20

Docker网络原理及案例详解_第12张图片
查看宿主机的网卡信息
Docker网络原理及案例详解_第13张图片
查看centos2.1容器的网络信息
Docker网络原理及案例详解_第14张图片
结论:容器使用与宿主机相同的网络接口和IP地址。

网络模式—none

在 Docker 中,None 网络是一种特殊类型的网络,它表示一个容器没有与其他容器或主机进行网络连接。容器可以通过 None 网络与外部环境通信,但不能与其他容器进行通信。

当使用 None 网络时,容器将完全隔离于网络,并没有网络接口。这意味着容器无法通过网络访问其他容器或外部网络。

使用 None 网络可以实现一些特定的需求,例如:

  1. 隔离容器:如果你希望某个容器与其他容器完全隔离,不涉及任何网络通信,你可以将它连接到 None 网络。

  2. 简化网络配置:当你只需要容器与宿主机进行通信,而无需与其他容器互联时,None 网络是一种简单的方式。容器与宿主机之间的通信在网络层面上正常进行,而容器之间的网络通信则被隔离。

要创建一个使用 None 网络的容器,可以在创建容器时使用 --network=none 参数,示例如下:

docker run --network=none

这将创建一个网络隔离的容器,它没有与其他容器或主机连接的网络接口。

自定义网络

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

创建步骤

1.查看当前的网络模式信息

> docker network ls

2.创建自定义网络:使用 docker network create 命令创建一个自定义网络。

docker network create

3.运行容器并连接到自定义网络:在创建容器时,使用 --network 参数将容器连接到自定义网络。

docker run --network=

示例:
创建一个网络名为bridge-test的网络 并指定bridge-test参数运行两个容器分别是centos1 centos2。

docker network create bridge-test
在这里插入图片描述

查看是否创建成功
在这里插入图片描述

创建容器centos1 、centos2 并指定网络 bridge-test运行

docker run -d -it --network bridge-test --name centos1 centos docker
run -d -it --network bridge-test --name centos2 centos

在这里插入图片描述
测试:
两个容器之间网络是否能够通信

分别进入容器互相ping
Docker网络原理及案例详解_第15张图片
结论:自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

你可能感兴趣的:(容器,docker,docker,网络,容器)