docker网络之macvlan实战

在使用docker中有一些容器对网络的依赖比较严重,配置也相对复杂,此时给这种容器一个单独的IP地址会极大的简化配置复杂程度,macvlan就可以给容器单独分配一个IP地址。

怎么创建Linux和配置必要环境就不写了,本文只介绍关键重点部分。


一、macvlan模式:

Bridge 模式 (默认模式):

  • 在这种模式下,macvlan 为每个容器创建一个虚拟网络接口,这些接口都连接到一个虚拟的 macvlan 桥接。
  • 容器可以直接与外部网络通信,但不能与同一宿主机上的其他 macvlan 接口通信,除非有外部路由器支持。
  • 这种模式适合于需要让容器直接暴露在外部网络上,但又不需要容器之间或容器与宿主机之间的直接通信的场景。

Private 模式:

  • 在 Private 模式下,每个容器可以访问外部网络,但无法与同一宿主机上的任何其他容器进行通信,包括那些没有使用 macvlan 的容器。
  • 这种模式提供了容器级别的网络隔离。

Vepa 模式 (Virtual Ethernet Port Aggregator):

  • 在 Vepa 模式下,容器无法直接与同一宿主机上的其他容器通信。所有通信都需要通过外部交换机。
  • 这种模式通常用于高度规范化的环境,比如数据中心。

Passthru 模式(直通模式):

  • 这种模式允许单个容器完全控制物理网络接口。
  • 这种模式适合于需要高度网络性能和最小化额外网络开销的场景,但牺牲了灵活性和容器之间的隔离。
  • 不同的模式适用于不同的使用场景,因此选择哪种模式取决于你的特定需求和网络架构。在选择模式时,需要权衡网络隔离、性能和灵活性。

二、创建macvlan网络

要想让docker容器单独分配到IP地址,必须先创建macvlan网络,然后再让容器加入到创建好的网络中来,才可以正常访问。

当然也可以直接在yaml文件中写好macvlan网络的设置和容器一起启动,这样做不够灵活,因此不推荐此操作。

创建macvlan命令如下:

docker network create \
  -d macvlan \
  --subnet=10.10.1.0/24 \
  --gateway=10.10.1.5 \
  -o parent=ens33 \
  macvlan_ens33

Tips:记得修改网卡名称为你机器实际的网卡名称,网段和网关需要设置正确。

三、部署docker

下面以PLEX为例子:

version: "3.8"
services:
  plex:
    image: lscr.io/linuxserver/plex:latest
    container_name: plex
    restart: always
    networks:
      macvlan_ens33:
        ipv4_address: 10.10.1.34
    dns:
      - 10.10.1.5
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
      - VERSION=docker
      - PLEX_CLAIM=claim-n_E7LCLEzKUgEgsAtZMh
    volumes:
      - /home/docker/plex/config:/config
      - /home/media/:/media

networks:
  macvlan_ens33:
    external: true

Tips:记得修改必要参数!


在macvlan中定义好网络怎么走,它就会直接把数据包转发过去,不会受到宿主机的设置影响。

完成!