RouterOSv7.4beta5 Docker安装nginx
RouterOS在7.4beta4恢复了docker功能,但实际安装nginx测试中发现无法替换html下的文件,提示是权限不允许,RouterOS更新到7.4beta5后发现这个问题已经解决,测试设备为RB5009,配置如下:
Device-Mode
与之前的container部署不同,7.4beta4后要求设置container模式,由于新增了Device-mode,默认情况下是限制container使用。Device-mode是一种对设备功能限制属性,即限制对特定功能配置的访问。有两种模式: enterprise和home(企业模式和家庭模式)。所有设备默认都使用enterprise,该模式允许除container外的所有功能。
首先确认你的设备工作在enterprise,如果在home需要修改为enterprise
[admin@MikroTik] > system/device-mode/print mode: enterprise
当在enterprise模式下,更新container模式,启用container模式命令如下:
[admin@MikroTik] > /system/device-mode/update container=yes update: please activate by turning power off or pressing reset or mode button in 5m00s -- [Q quit|D dump|C-z pause]
在5分钟内,拔插电源重启设备(远程重启无效)或者按设备的reset按钮确认执行container模式,设备会重启生效进入container模式。如果在规定的时间内没有关机或按下reset按钮,则取消模式切换。如果同时运行另一个更新命令,则两个更新命令都将被取消。如果是CHR的虚拟机,需要强制关机。
例如PVE的RouterOS,使用shutdown无效,需要在PVE的控制台开启shell,执行qm stop id 强制关闭
重启之后,查看device-mode
[admin@MikroTik] /system> device-mode/print mode: enterprise container: yes [admin@MikroTik] /system>
创建Docker配置
熟悉RouterOS的朋友都知道RB设备(如hAP系列,hEX系列、RB4011和RB5009等),默认会除ether1口的其他端口作为LAN网络端口,加入到bridge,配置的IP地址段是192.168.88.1/24,
[admin@MikroTik] >/ip/address> print Flags: D - DYNAMIC Columns: ADDRESS, NETWORK, INTERFACE # ADDRESS NETWORK INTERFACE ;;; defconf 0 192.168.88.1/24 192.168.88.0 bridge 1 172.17.0.2/24 172.17.0.0 ether1 2 D 100.64.142.131/32 100.64.142.1 pppoe-out1
这个是我的RB5009当前bridge port成员
[admin@MikroTik] /interface/bridge/port> print Flags: I - INACTIVE; H - HW-OFFLOAD Columns: INTERFACE, BRIDGE, HW, PVID, PRIORITY, PATH-COST, INTERNA L-PATH-COST, HORIZON # INTERFACE BRIDGE HW PVID PRIORITY PA IN HORIZON ;;; defconf 0 IH ether2 bridge yes 1 0x80 10 10 none ;;; defconf 1 IH ether3 bridge yes 1 0x80 10 10 none ;;; defconf 2 IH ether4 bridge yes 1 0x80 10 10 none ;;; defconf 3 H ether5 bridge yes 1 0x80 10 10 none ;;; defconf 4 IH ether6 bridge yes 1 0x80 10 10 none ;;; defconf 5 IH ether7 bridge yes 1 0x80 10 10 none ;;; defconf 6 H sfp-sfpplus1 bridge yes 1 0x80 10 10 none
为了让docker与RB路由器内网IP地址在相同段,配置地址为192.168.88.100,网关192.168.88.1,直接和veth的IP地址放到一个bridge下,即桥接模式。
创建veth接口配置:
[admin@MikroTik] >/interface/veth/add name=veth2 address=192.168.88.100 gateway=192.168.88.1
将veth2添加到bridge中
[admin@MikroTik] >/interface/bridge/port add bridge=bridge interface=veth2
设置registry-url,用于设置Docker的镜像站点,请确保RouterOS能正常连接网络和DNS解析
[admin@MikroTik] >/container/config/set registry-url=https://registry-1.docker.io
配置mount参数,设置nginx的log配置路径,如果使用默认参数,会提示error.log错误,需要单独指定nginx的log路径
/container mounts add dst=/var/log/nginx/ name=nginxlog src=”/disk1/nginx”
通过官方镜像站点获取nginx最新的镜像,并设置logging=yes有助于排查错误
/container/add remote-image=nginx:latest interface=veth2 root-dir=disk1/nginx mounts=nginxlog logging=yes
等待nginx从官方镜像站点下载,等status=stopped后,可以启动nginx
[admin@MikroTik] /container> print 0 name="daa13504-5b4a-43df-bd17-581ecd298483" tag="pihole/pihole:latest" os="linux" arch="arm64" interface=veth1 envlist="pihole_envs" root-dir=disk1/pihole mounts=dnsmasq_pihole,etc_pihole dns="" status=running 1 name="a7b0174c-934b-46fe-a352-90be295c0f60" tag="library/nginx:latest" os="linux" arch="arm64" interface=veth2 root-dir=disk1/nginx mounts=nginxlog dns="" logging=yes status=stopped
当前nginx的镜像是序列是1 ,使用start 1命令启动
[admin@MikroTik] /container> start 1
确认nginx的status=running
[admin@MikroTik] /container> print 0 name="daa13504-5b4a-43df-bd17-581ecd298483" tag="pihole/pihole:latest" os="linux" arch="arm64" interface=veth1 envlist="pihole_envs" root-dir=disk1/pihole mounts=dnsmasq_pihole,etc_pihole dns="" status=running 1 name="a7b0174c-934b-46fe-a352-90be295c0f60" tag="library/nginx:latest" os="linux" arch="arm64" interface=veth2 root-dir=disk1/nginx mounts=nginxlog dns="" logging=yes status=running
这是可以打开浏览器输入192.168.88.100,能正常访问到nginx的index页面
在Winbox中的file目录下无法看到container的配置文件,需要通过FTP登录查看
开启RouterOS的FTP登录,可以查看到docker配置文件,例如我的RouterOS网关是192168.88.1,输入ftp://192.168.88.1,输入登录账号和密码:
进入/disk1/nginx目录,能看到nginx配置文件
Nginx相关的配置路径如下:
Nginx配置文件default.conf在/disk1/nginx/etc/nginx/conf.d/
Nginx的html文件路径在/disk1/nginx/usr/share/nginx/html/
根据你的需要替换这些配置文件。
使用shell
使用shell命令可以进入内部终端控制台,如下面操作
[admin@MikroTik] /container> shell number: 0 root@MikroTik:/# ls access.log boot docker-entrypoint.d error.log home media opt root sbin sys usr bin dev docker-entrypoint.sh etc lib mnt proc run srv tmp var root@MikroTik:/# exit exit done [admin@MikroTik] /container>