Docker网络实现容器之间通信和连接外部网络的功能,主要的网络连接方式有桥接网络(Bridge Network、主机网络(Host Network)、none网络。
1.首先我们查看docker不启动的时候 宿主机默认网络情况
网卡详解:
在安装 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 将其卸载。
Docker0的原理和作用如下:
虚拟网络桥接器:docker0是一个虚拟网络桥接器,它充当主机和Docker容器之间的通信桥梁。它通过将主机上的物理网络接口(如eth0)与容器中的虚拟以太网桥接在一起,使得容器能够通过主机进行网络连接,以及容器之间的网络通信。
IP地址分配:docker0接口将分配给它一个IP地址,通常是172.17.0.1。这个IP地址是用作docker0接口所在的子网网关,容器将通过这个网关访问主机和外部网络。
默认桥接网络:docker0接口是Docker默认桥接网络的一部分。当你创建一个新的桥接网络时,Docker会自动在主机上创建一个虚拟以太网桥,并将其与docker0接口连接起来。这允许容器通过docker0和其他容器进行通信。
容器互联:docker0接口还充当了容器互联的中介。容器通过与docker0接口连接,可以实现容器之间的通信。Docker在创建容器时会为每个容器分配一个独立的IP地址,并将其添加到docker0接口中。
总而言之,docker0是一个虚拟网络桥接器,在Docker中起到了连接主机和容器、实现容器间通信的关键作用。通过docker0接口,容器能够访问主机和外部网络,并且容器之间可以通过docker0接口进行通信。
容器间通信:Docker网络允许在同一宿主机上的不同容器之间建立网络连接,容器可以通过网络进行通信和交互。这种容器间的通信可以通过容器名称或IP地址进行。
与其他服务通信:Docker容器可以与主机上的其他服务(如数据库、缓存等)以及外部网络中的服务进行通信。通过使用Docker网络,容器可以通过网络连接到外部服务,实现与其他服务的交互。
网络隔离:Docker网络提供了隔离和分割容器的网络环境的机制。每个网络由一个独立的网桥或虚拟网络设备管理,使得容器之间的网络通信与主机或其他容器的网络隔离开来,提供更安全的环境。
说明:
· 容器间的互联和通信以及端口映射
· 容器IP变动时候可以通过服务名直接网络通信而不受到影响
当微服务容器需要访问Mysql容器的时候,如果写死IP访问会有可能会导致微服务连不上数据库因为容器重启、宕机有可能IP会发生变化
常用命令
docker network create:创建一个新的Docker网络。可以指定网络驱动程序、子网、网关等选项进行自定义网络配置。
docker network ls:列出已创建的Docker网络。它将显示网络的ID、名称、驱动程序和作用域。
docker network inspect:检查特定Docker网络的详细信息。可以提供网络的名称或ID作为参数,返回与网络相关的配置和连接信息。
docker network connect:将容器连接到现有的Docker网络。需要指定容器和网络的名称或ID。连接后,容器可以通过网络与其他容器进行通信。
docker network disconnect:断开容器与特定Docker网络的连接。需要指定容器和网络的名称或ID。断开连接后,容器将无法通过该网络与其他容器通信。
docker network rm:删除不再使用的Docker网络。需要指定网络的名称或ID。删除网络前,必须确保没有容器连接到该网络。
docker network prune:清理没有容器连接的所有未使用的Docker网络。可以一次性删除所有未被使用的网络,注意此操作是不可恢复的。
也可以通过docker network --help进行查看
默认3大网络模式
命令
docker network ls
Docker网络在容器之间实现通信和连接外部网络的功能。下面是一些常见的Docker网络概念和驱动程序:
桥接网络(Bridge Network):这是Docker默认的网络模式。每创建一个容器,Docker会在主机上创建一个虚拟网络接口,并为容器分配一个独立的IP地址。
桥接网络使得容器之间可以通过IP地址进行通信,将容器连接到一个docker0
主机网络(Host Network):在主机网络模式下,容器与主机共享同一个网络接口。容器可以直接使用主机的IP地址和端口,使得容器的网络性能更高,但也失去了网络隔离的优势。
没有网络(none):容器独立的Network namespace空间,没有对网络进行设置,如分配veth pair和网络桥接、IP等。容器在此网络中没有网络连接,与宿主机和其他容器完全隔离。它通常用于一些特殊的场景和需求,不适合需要进行网络通信的应用程序。
使用说明:
查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name
ifconfig
Bridge网络原理解析:
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。
网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth
pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。 通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。
两两匹配验证及容器实例内默认网络IP生产规则
案例:启动两个centos实例centos1 centos2
命令
docker run -it -d --name centos1 centos bash
docker run -it -d --name centos2 centos bash
两两匹配验证
查看宿主机的网卡信息
ip a |tail -n 8
进入centos2容器查看网络信息
结论: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
centos12 容器网络信息
网络模式:bridge
Ip:172.17.04
结论:容器创建时,不指定参数,默认使用bridge网络模式、IP会按顺序分配一个。
它与默认的桥接(bridge)模式不同,在主机模式下,容器使用与宿主机相同的网络接口和IP地址,因此它们可以直接访问宿主机的网络。
说明
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
案例:
运行一个centos容器命名为centos2.1
docker run -d --network host --name centis:2.1 centos
看容器实例内部
docker inspect centos:2.1|tail -n 20
查看宿主机的网卡信息
查看centos2.1容器的网络信息
结论:容器使用与宿主机相同的网络接口和IP地址。
在 Docker 中,None 网络是一种特殊类型的网络,它表示一个容器没有与其他容器或主机进行网络连接。容器可以通过 None 网络与外部环境通信,但不能与其他容器进行通信。
当使用 None 网络时,容器将完全隔离于网络,并没有网络接口。这意味着容器无法通过网络访问其他容器或外部网络。
使用 None 网络可以实现一些特定的需求,例如:
隔离容器:如果你希望某个容器与其他容器完全隔离,不涉及任何网络通信,你可以将它连接到 None 网络。
简化网络配置:当你只需要容器与宿主机进行通信,而无需与其他容器互联时,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。
创建容器centos1 、centos2 并指定网络 bridge-test运行
docker run -d -it --network bridge-test --name centos1 centos docker
run -d -it --network bridge-test --name centos2 centos