下面我将详细讲解(容器网络命名空间限速)的持久化配置步骤,确保在飞牛OS重启后自动生效。请严格按照顺序执行以下操作:
🛠️ 完整持久化配置教程(带详细解释)
步骤1:确认容器魔方名称
确认容器名称(如上例的 wxedge),后续步骤将用到这个名称。容器魔方的名字默认wxedge
步骤2:创建限速脚本
| |
| sudo mkdir -p /opt/scripts |
| |
| |
| sudo nano /opt/scripts/limit_container_traffic.sh |
在编辑器中粘贴以下内容(记得替换 YOUR_CONTAINER_NAME 为你的实际容器名称):容器魔方的名字为wxedge
eth0是网卡名称,可以在飞牛OS中的网络设置中查看自己的网卡名称,替换自己的使用网卡即可
| #!/bin/bash |
| |
| CONTAINER_NAME="wxedge" |
| |
| |
| echo "等待容器启动..." |
| while ! docker inspect --format='{{.State.Running}}' $CONTAINER_NAME | grep -q "true"; do |
| sleep 3 |
| done |
| |
| |
| sleep 5 |
| |
| |
| PID=$(docker inspect -f '{{.State.Pid}}' "$CONTAINER_NAME") |
| |
| if [ -z "$PID" ]; then |
| echo "错误:无法获取容器 $CONTAINER_NAME 的PID" |
| exit 1 |
| fi |
| |
| |
| |
| |
| VETH_INDEX=$(nsenter -t $PID -n cat /sys/class/net/eth0/iflink) |
| VETH_NAME=$(ip -o link | grep "if$VETH_INDEX" | awk -F': ' '{print $2}' | sed 's/@.*//') |
| |
| if [ -z "$VETH_NAME" ]; then |
| echo "错误:无法找到容器对应的veth接口" |
| exit 1 |
| fi |
| |
| |
| echo "为容器 $CONTAINER_NAME (veth:$VETH_NAME) 设置上行带宽限制..." |
| tc qdisc replace dev $VETH_NAME root tbf \ |
| rate 20mbit \ |
| burst 320kbit \ |
| latency 400ms |
| |
| |
| |
| if [ $? -eq 0 ]; then |
| echo "成功设置上行带宽限制:20Mbps" |
| else |
| echo "限速设置失败!" |
| exit 2 |
| fi |
按 Ctrl+O 保存文件,然后 Ctrl+X 退出编辑器。
给脚本添加可执行权限:
| sudo chmod +x /opt/scripts/limit_container_traffic.sh |
步骤3:创建Systemd服务单元
| |
| sudo nano /etc/systemd/system/container-bandwidth.service |
粘贴以下内容:
| [Unit] |
| Description=Container Bandwidth Limiter for Magic Container |
| After=docker.service |
| Requires=docker.service |
| |
| [Service] |
| Type=simple |
| ExecStart=/opt/scripts/limit_container_traffic.sh |
| Restart=on-failure |
| RestartSec=30 |
| StartLimitInterval=0 |
| |
| [Install] |
| WantedBy=multi-user.target |
保存并退出(Ctrl+O → Enter → Ctrl+X)
步骤4:启用并启动服务
| |
| sudo systemctl daemon-reload |
| |
| |
| sudo systemctl enable container-bandwidth.service |
| |
| |
| sudo systemctl start container-bandwidth.service |
| |
步骤5:验证服务状态
| |
| sudo systemctl status container-bandwidth.service |
| |
| |
| |
| journalctl -u container-bandwidth.service -n 50 --no-pager |
日志中应看到类似:
| 等待容器启动... |
| 为容器 container_magic (PID:12345) 设置上行带宽限制... |
| 成功设置上行带宽限制:20Mbps |
步骤6:测试限速效果,理论上如果容器魔方正在上传,不需要测试,直接看效果,立竿见影。
飞牛OS系统中的UI界面有网速,看那个即可。比如之前是7Mb/s,限制完上传后变为了2.4Mb/s,速度根据自己需求调整
- 在容器内安装测试工具:
| |
| docker exec -it YOUR_CONTAINER_NAME /bin/bash |
| |
| |
| apt-get update && apt-get install -y speedtest-cli |
| |
| |
- 运行上行速度测试:
| |
| speedtest --simple |
| |
| |
| curl -T /dev/zero http://speedtest.ftp.otenet.gr/files/test10Mb.db |
| |
步骤7:重启验证持久化
| |
| sudo reboot |
| |
| |
| sudo systemctl status container-bandwidth.service |
| docker exec YOUR_CONTAINER_NAME tc qdisc show dev eth0 |
应看到类似:
| qdisc tbf 800d: root refcnt 2 rate 20Mbit burst 32Kb lat 400.0ms |
🚨 排错指南
问题现象 | 解决方案 |
---|
"无法获取容器PID" | 检查容器名称是否正确、容器是否正常运行 |
"No such file or directory" | 确认已创建 /opt/scripts/limit_container_traffic.sh 并有执行权限 |
"RTNETLINK answers: File exists" | 添加 replace 关键字:tc qdisc replace... |
网卡名称不是eth0 | 修改脚本中的 dev eth0 → 使用 docker exec 容器名 ip addr 查看正确网卡名 |
限速不精确 | 调整 burst 值:burst = rate/8 * 1.5 |
服务启动过早 | 增加脚本中的 sleep 时间 |
🔄 更新限速配置
如需修改带宽限制(例如改为30Mbps):
编辑脚本文件:
| sudo nano /opt/scripts/limit_container_traffic.sh |
修改 rate 20mbit → rate 30mbit
修改 burst 320kbit → burst 480kbit (30÷8×1.5=5.625,约480kbit)
重启服务:
| sudo systemctl restart container-bandwidth.service |
| |
💡 此方案通过Systemd在宿主机层面自动管理,避免修改容器内部,确保每次重启飞牛OS后自动生效且不影响容器魔方的正常功能。
原创作者: JacobX
转载于: https://www.cnblogs.com/JacobX/p/18908334