Docker 容器独立 IP 配置指南 - Macvlan 与 Pipework 实践

详细解析 Docker 容器使用 Macvlan 网络驱动和 Pipework 工具实现独立 IP 分配的配置方法,包含 YAML 文件示例与网络调试注意事项。

这篇文章已发布 620 天,部分内容可能已过时。如有疑问,可在评论区留言。

Macvlan

📝 备注

Network drivers overview | Docker Docs

Macvlan network driver | Docker Docs

一些应用程序,尤其是旧版应用程序或监视网络流量的应用程序,希望直接连接到物理网络。在这种情况下,你可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。在这种情况下,你需要在Docker主机上指定一个物理接口用于Macvlan,并设置网络的子网和网关。你甚至可以使用不同的物理网络接口来隔离你的Macvlan网络。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cat <<EOF > docker_network_macvlan.yaml
name: docker_network_macvlan
services:
  docker_network_macvlan:
    image: busybox
    container_name: docker_network_macvlan
    networks:
      macvlan_net:
        ipv4_address: 192.168.142.234  # 配置静态 IP
    privileged: true
    cap_add:
      - NET_ADMIN  # 添加网络权限
    command: sleep infinity
    ports:
      - "17000:17000"

networks:
  macvlan_net:
    driver: macvlan  # 使用 macvlan 类型网络
    # Macvlan 网络允许你为容器分配一个MAC地址,使其在网络中像物理设备一样存在。
    # Docker 守护程序可以通过容器的 MAC 地址来路由流量。
    # 使用 macvlan 驱动器通常是处理那些期望直接连接到物理网络而不是通过 Docker 主机网络堆栈路由的旧应用程序时的最佳选择。
    driver_opts:
      parent: eno1  # 指定网卡
    ipam:
      config:
        - subnet: 192.168.142.0/24    # 子网
          ip_range: 192.168.142.0/24  # IP 范围
          gateway: 192.168.142.1      # 网关
EOF
1
docker-compose -f docker_network_macvlan.yaml up -d
📌 重要

该容器目前无法与使用 eno1 网卡的宿主机或其他容器通信。

Pipework

jpetazzo/pipework: Software-Defined Networking tools for LXC (LinuX Containers) (github.com)

1
sudo docker run -itd --name test ubuntu /bin/bash
1
sudo docker exec test ip addr show

宿主机网络为172.16.0.100,下面配置容器 test 的网络,并连接到网桥 br0 上,其中@后面是网关地址:

1
2
sudo pipework br0 test 172.16.0.156/24@172.16.0.1
# ip addr add 172.16.0.254/24 dev br0
1
2
3
4
5
sudo ip addr add 172.16.0.100/24 dev br0; \
    sudo ip addr del 172.16.0.100/24 dev enp1s0; \
    sudo brctl addif br0 enp1s0; \
    sudo ip route del default; \
    sudo ip route add default via 172.16.0.1 dev br0
面朝大海,春暖花开。
使用 Hugo 构建
主题 StackJimmy 设计