网络

由于应用被隔离在不同的容器中,因此网络 几乎是 容器间进行通讯的唯一手段。 Docker 的网络基于 容器网络模型 (Container Network Model)

容器网络模型实际上的从高层上描述容器的通讯方式,但是底层依然是互联网常用的桥接网络、覆盖网络等模式,这点与虚拟机是相同的。

容器网络模型

CNM 定义了容器网络的三个要素:

  • 沙盒 (Sandbox) :沙盒包含一个独立的、完整的网络栈。包含了以太网接口、端口、DNS 配置

  • 终端 (Endpoint) :终端就是网络接口

  • 网络 (Network) :网络是 802.1d (网桥)的软件实现

其具有以下特性:

  • 一个容器可以拥有多个终端

  • 一个终端只能加入一个网络

  • 不同网络之间的终端是相互隔离的

同一容器中的终端如果不在同一个网络下,那它们也是相互隔离的

网络驱动

网络驱动是 CNM 的底层实现,代表了其支持的网络类型,其一般包括以下几种:

  • 桥接 (bridge) 网络:桥接网络使容器能够访问宿主网络,反之则需要进行端口映射

  • 主机 (host) 网络:容器和主机之间无任何隔离

  • 覆盖 (overlay) 网络:覆盖网络使多个服务器之间的容器可以相互通信

  • macvlan 网络:容器直接连接到物理网络,不经过守护进程转发

  • 无 (none) 网络:不启用网络链接

  • 桥接网络

Docker Compose 中的网络

例如:

version: "3.9"

services:
wordpress:
   image: wordpress:latest
   networks:
      - external
   ports:
      - "8000:80"

networks:
external:
   name: backend

自定义网络

自定义网络亦是桥接网络的一种,但不同的是其中的容器可以以主机名代替 IP。

  1. 首先创建一个网络:

    docker network create flat_network
  2. 然后在 docker-compose 中引用:

    services:
       server:
          image: gitea/gitea:latest
          networks:
             - flat_network
    networks:
       flat_network:
          external: true

FirewallD

Docker 直接使用 iptables ,而 firewalld 使用 nftables 。因此 Docker 在一定程度上是脱离 firewalld 的掌控的,但是所幸的是 firewalld 新增了 policy 来管理 docker 中的流量。

Last moify: 2024-12-26 10:35:34
Build time:2025-07-18 09:41:42
Powered By asphinx