本教程将介绍如何使用 macvlan 和 tc(Traffic Control)对容器魔方进行带宽限制,而不影响其他进程。
过程包括创建一个 macvlan 网络,配置 Compose 文件以及带宽限制规则。
步骤 1: 找到物理网卡及其子网和网关
首先,需要找到宿主机的物理网卡及其子网和网关。使用以下命令查看网络接口信息:
ip addr show
在输出中,找到包含宿主机内网 IP 的网卡。
例如,宿主机的内网 IP 是 192.168.1.100,对应的网卡是 enp2s0。记下该网卡的名称、子网和网关。
步骤 2: 创建 macvlan 网络
接下来,创建一个 macvlan 网络。以下命令将创建一个 macvlan 网络,IPv4 子网和网关与物理网卡相同,IPv6 使用内部地址,无需修改。
如果路由器和光猫支持,将能够自动获取公网 IPv6 地址。
sudo docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--ipv6 \
--subnet=fd0d:7eb5:2afd::/64 \
--gateway=fd0d:7eb5:2afd::1 \
-o parent=enp2s0 \
macvlan
步骤 3: 配置 Docker Compose 文件
在 Docker Compose 文件中,配置服务使用 macvlan 网络,并指定容器的 IPv4 地址。请确保配置的内网 IP 不要与现有设备冲突。
services:
wxedge:
image: images-cluster.xycloud.com/wxedge/wxedge:latest
container_name: wxedge
restart: unless-stopped
privileged: true
volumes:
- ./storage:/storage:rw
environment:
- LISTEN_ADDR=:18888
networks:
macvlan:
ipv4_address: 192.168.1.11
networks:
macvlan:
external: true
这里访问扫码页使用 http://192.168.1.11:18888,访问不了看下面。
步骤 4: 使宿主机能够访问容器魔方
宿主机默认不能访问 macvlan 地址,局域网其他主机可以。为了使宿主机能够访问,我们需要创建一个 macvlan 接口,并添加相应的路由。
# 创建macvlan接口
sudo ip link add macvlan0 link enp2s0 type macvlan mode bridge
# 为macvlan接口分配IP地址
sudo ip addr add 192.168.1.254/24 dev macvlan0
# 启用macvlan接口
sudo ip link set macvlan0 up
# 添加路由
sudo ip route add 192.168.1.11 dev macvlan0
# 删除路由的命令
sudo ip route del 192.168.1.11 dev macvlan0
macvlan 接口在重启后失效,可以通过创建一个服务来实现开机自启
1. 创建 setup_macvlan.sh
脚本
确保你的脚本 /home/ManJieqi/setup_macvlan.sh
存在并具有执行权限:
#!/bin/bash
sudo ip link add macvlan0 link enp2s0 type macvlan mode bridge
sudo ip addr add 192.168.1.254/24 dev macvlan0
sudo ip link set macvlan0 up
sudo ip route add 192.168.1.11 dev macvlan0
echo "Script finished at: $(date)"
赋予执行权限:
sudo chmod +x /home/ManJieqi/setup_macvlan.sh
2. 创建 systemd
服务单元文件
创建一个新的 systemd
服务单元文件,例如 /etc/systemd/system/setup_macvlan.service
:
sudo nano /etc/systemd/system/setup_macvlan.service
在文件中添加以下内容:
[Unit]
Description=Setup macvlan interface
Before=docker.service
Wants=network-online.target
After=network.target
[Service]
Type=oneshot
ExecStart=/home/ManJieqi/setup_macvlan.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
服务单元文件的解释
[Unit] 部分:
- Description
:对服务的简短描述。
- Before=docker.service
:确保这个服务在 docker.service
之前运行。
- Wants=network-online.target
和 After=network.target
:确保网络服务已启动并在线。
[Service] 部分:
- Type=oneshot
:表示这个服务是一次性任务,执行完 ExecStart
后即退出。
- ExecStart
:要执行的命令,即你的脚本路径。
- RemainAfterExit=yes
:服务在脚本执行完毕后仍被认为是活动状态。
[Install] 部分:
- WantedBy=multi-user.target
:表示这个服务在多用户模式下启动。
3. 启用并启动服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用服务,使其在系统启动时自动运行
sudo systemctl enable setup_macvlan.service
# 立即启动服务
sudo systemctl start setup_macvlan.service
# 检查服务,确保它正常运行
sudo systemctl status setup_macvlan.service
步骤 5: 配置带宽限制
建议直接使用光猫或者路由器的限速功能对特定IP的容器进行限制,也可以使用下面的方法。
使用 tc(Traffic Control)配置带宽限制规则。首先是显示当前的 qdisc、class 和 filter 配置的一些命令。
sudo tc qdisc show dev enp2s0
sudo tc class show dev enp2s0
sudo tc filter show dev enp2s0
删除现有的 qdisc 配置,并添加新的带宽限制规则。
sudo tc qdisc del dev enp2s0 root
sudo tc qdisc add dev enp2s0 root handle 1: htb default 10
sudo tc class add dev enp2s0 parent 1: classid 1:1 htb rate 24mbit ceil 32mbit quantum 1500
sudo tc qdisc add dev enp2s0 parent 1:1 handle 10: fq_codel
sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.11 flowid 1:1
sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.11 flowid 1:1
带宽限制规则的说明
- sudo tc qdisc del dev enp2s0 root
:
删除现有的 qdisc 配置。使用此命令可以复原配置。
- sudo tc qdisc add dev enp2s0 root handle 1: htb default 10
:
添加一个新的 HTB(Hierarchical Token Bucket) qdisc,默认类 ID 为 10。
- sudo tc class add dev enp2s0 parent 1: classid 1:1 htb rate 24mbit ceil 32mbit
:
在 HTB qdisc 下添加一个类,保证带宽为 24mbit,最大带宽为 32mbit,量子为 1500 字节。
- sudo tc qdisc add dev enp2s0 parent 1:1 handle 10: fq_codel
:
在类 1:1 下添加一个 fq_codel(Fair Queuing Controlled Delay) qdisc。
- sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.11 flowid 1:1
:
添加一个过滤器,匹配源 IP 为 192.168.1.11 的流量,流量 ID 为 1:1。
- sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.11 flowid 1:1
:
添加一个过滤器,匹配目标 IP 为 192.168.1.11 的流量,流量 ID 为 1:1。
注意:限速设置在系统重启后失效,可以写脚本来实现开机后自动运行
评论区