Docker中的网络

文章目录

  • 网络
    • 网桥(bridge)
    • 创建网桥接口
    • host
    • none
    • container
    • overlay
    • overlay底层原理

Docker中的网络_第1张图片

网络

Docker中的网络_第2张图片

网桥(bridge)

在Docker中,网桥(Bridge)是一种网络驱动,用于实现Docker容器之间和容器与宿主机之间的通信。Docker中的网桥工作原理可以简要概括如下:

  1. Docker0网桥

    • 当Docker引擎启动时,会自动创建一个名为docker0的虚拟网络接口,它是默认的Docker网桥。这个网桥的主要作用是连接所有Docker容器和宿主机的网络。
  2. 容器连接到网桥

    • 当用户启动一个新的Docker容器时,Docker会在docker0网桥上创建一个新的虚拟网络接口,并将容器连接到该网桥。每个容器都可以通过docker0网桥和其他容器以及宿主机进行通信。
  3. 容器之间的通信

    • 当多个容器连接到同一个docker0网桥时,它们可以直接相互通信。Docker通过使用Linux内核的veth设备对来自不同容器的数据流进行转发。这些数据流会通过docker0网桥进行桥接,从而实现容器之间的直接通信。
  4. 容器与宿主机的通信

    • 连接到docker0网桥的容器也可以与宿主机进行通信。Docker会在宿主机上创建一对虚拟网络接口:veth设备和veth-peer设备。这对虚拟网络接口的一个端口连接到docker0网桥,另一个端口连接到容器。这样,容器和宿主机可以通过这对虚拟网络接口进行通信。
  5. 端口映射

    • 为了使外部网络能够访问容器中运行的服务,Docker支持端口映射。通过端口映射,可以将容器内的服务端口映射到宿主机的端口上。这样,外部网络就可以通过宿主机的IP地址和映射的端口来访问容器中的服务。

总结来说,Docker中的网桥工作原理是通过创建虚拟网络接口并连接到docker0网桥来实现容器之间和容器与宿主机之间的通信。容器通过网桥实现相互通信,并通过端口映射使外部网络能够访问容器中的服务。这种网络配置使得Docker容器能够在同一个宿主机上创建独立的网络环境,并实现容器之间的隔离和互联。

宿主机的ip

[root@docker ~]# ip add
...
3: docker0:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:f3:a5:85:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:f3ff:fea5:8503/64 scope link 
       valid_lft forever preferred_lft forever
29: veth774987e@if28:  mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 16:84:ce:26:90:d0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::1484:ceff:fe26:90d0/64 scope link 
       valid_lft forever preferred_lft forever
31: veth94d7539@if30:  mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 76:d6:a8:62:a7:32 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::74d6:a8ff:fe62:a732/64 scope link 
       valid_lft forever preferred_lft forever

容器ip

[root@docker ~]# docker exec box1 ip a
1: lo:  mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
28: eth0@if29:  mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@docker ~]# docker exec box2 ip a
1: lo:  mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
30: eth0@if31:  mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

查看bridge的信息

[root@docker ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242f3a58503	no		veth774987e
							veth94d7539

docker network inspect bridge

Docker中的网络_第3张图片

创建网桥接口

创建网桥

docker network create -d bride ydh

查看信息

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
555b043af3ec   bridge    bridge    local
ebf78f0dd27f   host      host      local
3b7c9e498144   none      null      local
baa150161000   ydh       bridge    local

在宿主机上查看

8: br-baa150161000:  mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:b0:17:de:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-baa150161000
       valid_lft forever preferred_lft forever

查看详细信息

[root@localhost ~]# docker network inspect ydh
[
    {
        "Name": "ydh",
        "Id": "baa15016100019f40011d2602d18a19a4fae7fedf73e0dbb32c5ffec229db0a2",
        "Created": "2023-07-25T19:44:06.91098922+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

创建运行容器指定网桥

[root@localhost ~]# docker run -d --name ynginx -p 8808:80 --network ydh nginx:latest 
2d605d921cac009de338dd45df255dfc0e9552aa264c8bfecd583dd78b723132

host

在Docker中,Host网络模式是一种网络配置选项,它允许Docker容器与宿主机共享同一个网络栈,即它们使用宿主机的网络命名空间和IP地址。这意味着容器与宿主机之间没有网络隔离,它们可以直接使用宿主机的网络接口进行通信,无需进行NAT(Network Address Translation)。

以下是Host网络模式的详细介绍:

  1. 网络共享: 在Host网络模式下,Docker容器和宿主机共享同一个网络栈,它们使用相同的网络接口和IP地址。这使得容器可以直接访问宿主机的网络接口,并且无需进行网络地址转换(NAT)或端口映射。

  2. IP地址和端口: 由于容器与宿主机共享网络栈,所以它们使用宿主机的IP地址和端口。在Host网络模式下,容器无需绑定或映射端口,因为它们直接使用宿主机的端口。

  3. 网络隔离: Host网络模式下的容器与宿主机之间没有网络隔离。这意味着容器可以访问宿主机上的所有网络服务,并且宿主机上的其他网络资源也可以直接访问容器。

  4. 性能: Host网络模式可以提高容器的网络性能,因为容器直接使用宿主机的网络接口,无需经过额外的网络地址转换。

  5. 适用场景: Host网络模式适用于一些特定的应用场景,例如:

    • 当容器需要与宿主机上的其他服务进行高性能的网络通信时。
    • 当容器需要绑定宿主机的特定网络接口,例如某个物理网卡。
    • 当容器需要访问宿主机上的网络服务,而不需要进行端口映射。
  6. 注意事项: 使用Host网络模式会导致容器与宿主机之间没有网络隔离,这可能会增加安全风险。容器与宿主机共享网络栈,所以容器的网络配置会影响到宿主机的网络配置,需要注意避免网络冲突和端口占用问题。

Docker中的网络_第4张图片

使用Host网络模式时,您需要明确了解容器与宿主机共享网络栈的特点,以及可能带来的安全风险和性能影响。Host网络模式适用于特定的使用场景,例如高性能网络通信或特定网络绑定需求。对于一般应用,通常建议使用桥接网络模式,以保持容器之间的网络隔离。

none

在Docker中,"none"网络模式是一种特殊的网络模式,容器在该模式下没有网络连接。这意味着容器内的进程无法与外部网络或其他容器通信。在"none"网络模式中,Docker容器不分配任何网络接口,也没有默认的网络配置。以下是"none"网络模式的详细介绍:

1. 没有网络接口: 在"none"网络模式下,Docker容器不会分配任何网络接口,这意味着容器内部没有网络可用。因此,容器内的进程无法访问外部网络,也无法通过网络与其他容器进行通信。

2. 与宿主机隔离: 在"none"网络模式下,容器与宿主机之间是隔离的,容器内的进程无法直接访问宿主机的网络接口和资源。这种隔离保护了宿主机的网络安全,确保容器内部的进程不能直接访问宿主机上的网络和服务。

3. 适用场景: "none"网络模式适用于一些特殊场景,例如在安全敏感的环境中运行容器时,您可能希望容器完全隔离网络,从而防止容器内的应用程序与外部网络进行通信。

4. 容器内部通信: 在"none"网络模式下,容器内部的进程仍然可以通过进程间通信(IPC)机制与其他容器或宿主机进行通信。IPC机制允许容器内的进程使用管道、共享内存等方式进行通信,而无需经过网络。

5. 自定义网络配置: 虽然容器在"none"网络模式下没有网络连接,但是您仍然可以手动配置容器内部的网络,例如通过添加虚拟网络接口或设置本地环回地址。这种情况下,您需要手动设置容器的网络配置,容器才能在"none"网络模式下进行一些局域网的通信。

总结来说,"none"网络模式在Docker中用于将容器完全隔离网络,容器内的进程无法与外部网络通信。这种模式适用于一些特殊场景,例如在需要完全隔离网络的安全环境下运行容器。然而,要注意在"none"网络模式下,容器内的进程之间仍然可以通过IPC机制进行通信,因此局域网内的一些进程间通信仍然是可行的。

container

在Docker中,网络容器(Network Container)是一种特殊的容器,它专门用于管理和提供网络功能,而不运行应用程序。网络容器不是运行应用程序的容器,而是通过Docker的网络驱动程序创建的专门用于网络隔离和连接的容器。以下是网络容器的详细介绍:

1. 网络功能提供: 网络容器的主要目的是提供网络功能,例如实现网络隔离、网络连接、路由和防火墙等。它们可以用于创建自定义网络环境,或者实现特定网络配置,以满足复杂的网络需求。

2. 不运行应用程序: 不同于普通的应用程序容器,网络容器不运行任何应用程序。它们的唯一任务是处理网络功能,并为其他应用程序容器提供网络连接。

3. 容器之间通信: 网络容器可以与其他应用程序容器或其他网络容器进行通信。它们可以在不同的网络环境中运行,提供不同的网络服务,但能够通过Docker的网络功能实现彼此之间的通信。

4. 自定义网络环境: 通过使用网络容器,您可以创建自定义的网络环境,实现更高级的网络配置。例如,您可以创建一个网络容器来实现虚拟私有网络(VPN)功能,将不同的应用程序容器连接到该VPN网络中,从而实现安全的网络通信。

5. 网络隔离: 网络容器通过Docker网络功能提供了网络隔离。这意味着网络容器与其他容器和宿主机之间具有独立的网络命名空间,它们之间的网络不会相互干扰。

6. 网络驱动程序: 网络容器使用Docker的网络驱动程序来实现网络功能。这些网络驱动程序可以是桥接网络、覆盖网络、Macvlan网络等,通过选择不同的网络驱动程序,您可以实现不同的网络配置。

7. 轻量级: 网络容器通常是轻量级的,因为它们不需要运行应用程序,只需专注于网络功能。这使得它们更高效,不会占用过多的系统资源。
Docker中的网络_第5张图片

总体来说,网络容器是一种专门用于管理和提供网络功能的容器。它们不运行应用程序,而是专注于网络隔离、连接和配置。通过使用网络容器,您可以实现复杂的网络环境和定制化的网络配置,从而满足不同的网络需求。

overlay

Docker中的Overlay网络是一种用于跨多个Docker主机创建共享虚拟网络的网络驱动程序。它是Docker Swarm集群的核心组件之一,允许容器在不同的主机上透明地通信,实现容器之间的透明网络连接。以下是Overlay网络的详细信息:

1. 跨主机通信: Overlay网络允许在Docker Swarm集群中的多个主机上创建一个共享的虚拟网络。这使得在不同主机上运行的容器可以直接通信,而无需进行额外的配置。

2. 网络隔离: 每个Overlay网络都有独立的命名空间,使得不同的Overlay网络之间具有网络隔离。这意味着在不同的Overlay网络中的容器无法直接通信,除非通过相应的网络配置。

3. 路由和覆盖: Overlay网络使用覆盖(Overlay)技术,通过在底层网络之上构建虚拟网络,实现容器之间的透明通信。每个容器都被分配一个虚拟IP地址,它们之间的通信通过Overlay网络驱动程序进行路由。

4. 透明性: 对于应用程序容器而言,Overlay网络是透明的,它们感知不到跨主机的网络连接。容器可以使用标准的网络配置(IP地址、端口等),就像在单个主机上运行一样。

5. 网络驱动程序: Overlay网络是Docker的一种网络驱动程序。要启用Overlay网络,您需要在Docker Swarm模式下创建一个Overlay网络,然后将需要在Overlay网络中通信的服务或容器加入到该网络中。

6. 安全性: Overlay网络使用加密和安全机制来保护跨主机的通信,确保数据在传输过程中是安全的。这为容器之间的安全通信提供了保障。

7. 负载均衡: Overlay网络集成了内置的负载均衡机制,可以自动在多个容器之间分配请求,实现负载均衡,提高应用程序的可用性和性能。

8. 多主机部署: Overlay网络特别适用于在多个Docker主机上部署应用程序。通过将容器分布在不同的主机上,Overlay网络可以实现高可用性和横向扩展。

总结来说,Overlay网络是一种在Docker Swarm集群中创建共享虚拟网络的网络驱动程序。它允许在不同主机上的容器透明地通信,实现容器之间的透明网络连接。通过Overlay网络,您可以在多主机环境中构建高可用性、横向扩展的应用程序。

overlay底层原理

Docker中的Overlay网络是一种非常强大的网络驱动程序,它允许在多个Docker主机上创建一个共享的虚拟网络。通过Overlay网络,您可以在不同的主机上运行容器,并使这些容器能够直接通信,而无需进行端口映射。下面是Overlay网络的底层原理的详细信息:

  1. VXLAN技术: Overlay网络的底层原理使用了VXLAN(Virtual Extensible LAN)技术。VXLAN是一种网络虚拟化技术,它通过在现有网络上创建逻辑隧道,将数据包封装在UDP数据包中,从而在不同网络之间传输数据。

  2. 虚拟网络隧道: 在Overlay网络中,每个Docker主机上的容器都属于一个虚拟网络,这些虚拟网络之间通过虚拟网络隧道进行通信。每个虚拟网络都有一个唯一的VXLAN网络标识(VNI,VXLAN Network Identifier),用于在底层区分不同的虚拟网络。

  3. VXLAN头: 在Overlay网络中,VXLAN头是在传输数据包时添加到原始数据包之前的一部分。VXLAN头包含了虚拟网络标识(VNI),用于识别数据包所属的虚拟网络。这样,当数据包在Overlay网络中传输时,Docker主机可以根据VNI将数据包正确地路由到目标虚拟网络。

  4. 网络广播: 在Overlay网络中,Docker主机使用广播机制来发现其他主机上的容器和虚拟网络。当新的容器加入或离开虚拟网络时,主机之间会进行广播通信,以更新虚拟网络中的拓扑结构。

  5. 数据包转发: 在Overlay网络中,Docker主机会根据VXLAN头中的VNI信息,将数据包转发到相应的虚拟网络。这样,即使容器位于不同的Docker主机上,它们也可以直接通信,就像它们在同一主机上一样。

  6. 控制平面和数据平面: Overlay网络通常由控制平面和数据平面组成。控制平面用于管理虚拟网络的拓扑结构和路由信息,而数据平面负责实际的数据包转发和通信。

Docker中的网络_第6张图片

总结来说,Overlay网络通过VXLAN技术创建虚拟网络隧道,使得分布在不同Docker主机上的容器能够直接通信。VXLAN头中的VNI标识用于将数据包正确路由到目标虚拟网络。Overlay网络的底层原理允许容器在不同主机之间建立透明的网络连接,从而实现高效的分布式应用部署。

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