网络
由于应用被隔离在不同的容器中,因此网络 几乎是 容器间进行通讯的唯一手段。 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。
首先创建一个网络:
docker network create flat_network
然后在 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 中的流量。