-
Notifications
You must be signed in to change notification settings - Fork 11
在 Mikrotik RB4011 上运行 Smartdns
自从 Mikrotik 7.1rc 增加了 docker 功能后就备受关注。前几天更新到 7.5rc1 修复了若干 bug 后,Mikrotik 的 docker 终于达到了堪用的程度。由于官方文档还存在不少错误,致使我走了许多弯路。特此把测试过程记录以备以后参考。
- 构建 arm 架构的镜像文件
经过亿点点测试,RB4011 的 arm 需要 linux/arm/v6 或 linux/arm/v7 架构的镜像文件。在 x86 架构的系统中需要交叉编译和多架构构建
1.1. 安装buildx
mkdir -pv ~/.docker/cli-plugins/
wget -O ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx install
1.2. 安装qemu-docker
apt-get install -y qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
1.3. 构建
docker buildx build --no-cache --platform linux/arm/v6 -t /smartdns:1.20220824-1 -f Dockerfile.alpine .
1.4. 导出
docker save smartdns > smartdns.20220824-1.tar
- 启用 docker 功能
首先从官网下载额外包 container-7.5rc1-arm.npk 并安装。为了确保安全,安装后需要亿点点操作来启用 docker 功能:
打开终端,键入命令 /system/device-mode/update container=yes
,然后根据提示在5分钟内按下设备上的 reset 键或 mode 键。待设备重启后 docker 功能即正式启用。
- 新增 container 需要的虚网卡
在 interface 中点击“+”,添加一个VETH,并配置其中的 ip 地址和网关为容器内部的 ip 地址和网关。Mikrotik 的容器同样支持主机网络和桥接网络,此处为了方便我直接配置 ip 地址为 lan 段的地址,然后将此接口添加到 lan bridge中。
需注意,veth 的 ip 在建立容器时生效,此后改 ip 须重建容器才能生效。
根据官方文档,也可为容器单独起一个 bridge 并配置相关 ip,通过 NAT 的方式使容器连接到网络。
- 建立并运行容器
将第一步构建的镜像文件压缩包和 smartdns 相关配置文件复制到 Mikrotik 中,然后在 Container 的 Mounts 标签下添加一条文件夹映射。其中 src 指 mikrotik 的文件夹路径,dst 指容器内的路径,注意容器镜像中该文件夹必须存在。
在 Container 的 Container 标签下点击“+”添加容器。其中 file 选择上传的镜像文件压缩包,interface 选择刚才建立的 veth,mounts 选择刚才建立的文件夹映射,其他可不填写。
点击“ok”后不久 status 即由 extracting 变为 stopped,表示容器已经准备好,可以运行。
如果在建立容器时勾选了 logging,容器运行时可在 mikrotik 的日志中看到容器的控制台输出。