把 LuCI 装入 docker 容器

2021-11-17 13:24:25 13点赞 53收藏 11评论

缘起

自从使用了 Docker,已经很少在服务器上装应用了,基本都是起个容器跑应用,在使用 Docker 容器的过程中,很多容器的配置文件需要管理,使用过程中不少人对命令行及配置文件不熟悉,而且配置文件管理起来也太麻烦。

一直想找一个 web 前端来管理配置文件,看来看去还是回到了 openwrt 的 LuCI,而且 LuCI 上有很多 app 可以移(chao)植(xi),所以一口气将 LuCI 装入容器,配合 luci-lib-docker 以进行 Docker 容器的配置文件管理。

LuCI in Docker

早期 luci 是支持独立于 openwrt 运行的,不过近年了与 openwrt 的耦合度越来越高,特别是 ubus 相关的 api,由于我们移植 LuCI 的目的就是用于配置文件管理,所以就用不到 ubus,移植 LuCI 最关键的就是剥离 ubus。

过程就不缀诉了,移植过程中恰逢 LuCI 大版本从18.06 升级至 19.07,两个版本天差地别,19.07 明显前端化,使用 javascript 编写插件。硬着头皮将 18.06 移植完成之后,又顺路移植了 19.07,所有源码都在 https://github.com/lisaac/luci-in-docker

安装 LuCI

首先你需要有 Docker 环境,目前 luci-in-docker 只还支持 x86/arm64 两种架构,安装方法:

docker run -d

--name luci

--restart unless-stopped

-p 80:80

-p 7682:7682

-e TZ=Asia/Shanghai

-v $HOME/pods/luci:/external

-v /var/run/docker.sock:/var/run/docker.sock

lisaac/luci:latest

稍等启动之后,就可以使用浏览器访问 80 端口打开 LuCI 了,在 LuCI 容器中,已经内置了 luci-app-dockerman, 可以用来管理 Docker,再也不需要难用的 portainer 了。

把 LuCI 装入 docker 容器

从 LuCI 容器的启动命令可以看到映射了/external目录,/external/cfg.d目录是用来存放将来的配置文件的,而/external目录也是用来存放插件的,所以只要保存好这个目录,就能保存所有配置信息。

One Container One Service

没错,一个容器只提供一种服务,这是政治问题!!这很 Linux!!

所以,强烈不建议在 LuCI 容器中运行其他服务,别忘了我们的初衷是把 LuCI 拿过来管理其他容器的配置文件的,接下来管理各个容器配置文件是由各个插件完成的。

所以,如果你想要使用 LuCI 管理一个服务,你需要一个容器和一个插件。

把 LuCI 装入 docker 容器

LuCI 插件

LuCI 插件有别于 Openwrt 的安装包,不直接兼容 Openwrt 的 ipk,插件是一个目录,目录结构如下:

|-luci-app-podclash # 插件名,会忽略以 _ 开头的目录,方便调试,插件结构如下:

|-Makefile # 判定有效插件目录标志,并不按照Makefile执行

|-root # 插件所需的 root 目录

|-luasrc # 插件所需的 lua 文件目录

|-htdocs # 插件所需的 html 文件目录

|-po # 插件所需的 po 文件目录

|-depends.lst # 插件所需要 alpine 依赖列表文件, 依赖用空格隔开, 只用来存放 alpine 依赖

|-preinst # 插件所需的初始化脚本(合并前)

|-postinst # 插件所需的初始化脚本(合并后), 若没有此脚本, 会尝试执行 /root/etc/uci-defaults/ 下的插件初始化脚本

  • LuCI 容器每次启动都会遍历/external目录中的插件,合并到 LuCI 中

  • 插件安装时不会执行按照 Makefile 编译,插件内必须是 lua/js 源码 + 二进制文件

  • 插件中依赖文件 depends.lst 为 alpine 依赖,并非 openwrt 中的依赖

  • 插件中的 preinst及 postinst 是插件合并前及合并后分别执行的钩子,PS:可能执行 preinst 及 postinst 存在依赖其他插件的情况,可以将插件目录开头的加上数字,来确定遍历顺序

  • 插件目录名若以 _ 开头,则会跳过此插件

可以看出 LuCI 插件与 ipk 解压后 data 目录中的内容相似,在 LuCI 菜单中 「系统--插件」 中可以对 LuCI 插件进行管理,新增插件只需要填入 LuCI 插件的仓库地址即可。

把 LuCI 装入 docker 容器

Docker API(For Developer)

由于现在 LuCI 19.07+ 大量使用 js,此前的 luci-lib-docker 是 lua 后端库,在使用 js 访问的时候挺麻烦。

于是就有了 luci-socket-forwarder,目前已经集成在 luci-in-docker中,可以使用Docker 原生 api 的方式请求,例如:

GET http://host/socket/containers/json

headers:{

socket_path: "/var/run/docker.sock"

cookie: "sysauth=xxxxxxxxxxxxxxxxxxxx"

}

展开 收起
11评论

  • 精彩
  • 最新
  • 这个太强了。有个问题,lisaac/luci第一次安装的时候要装很多依赖,docker是每执行一个命令就会生成一个文件层吧,会不会导致读写效率低?不能在生成镜像的时候先安装好依赖吗

    校验提示文案

    提交
    感谢捧场,首先并不会安装很多依赖,如果不安装 diskman 插件的话就一个 git,其次 docker 是基于 overlayfs/AUFS 等文件系统,你担忧的性能问题基本是多余的。最后一个问题,「安装好依赖的镜像」其实与「后安装」的效果其实是一样的,因为 image 也是分层的,最终都是 overlay 整合成 rootfs 。再补充一下,显然在生成镜像的时候是无法做到安装好「所有需要的依赖」的,因为你永远不知道下一个「新插件」需要什么样的依赖,这也是选用 alpine 作为 base image 的原因:可以随时增减依赖。

    校验提示文案

    提交
    另外并非「docker是每执行一个命令就会生成一个文件层」,这句话是在 Dockerfile 中才成立

    校验提示文案

    提交
    收起所有回复
  • 我看dockerman的配置里面是可以连接远程docker api的,如果能支持同时连接本地和多个远程docker(包括TLS连接支持),集中管理就好了,就可以完全抛弃portainer了

    校验提示文案

    提交
    迫切需要的时候加进去 [皱眉]

    校验提示文案

    提交
    收起所有回复
  • 露西到底是谁?

    校验提示文案

    提交
    你的露西,不,是我的露西

    校验提示文案

    提交
    收起所有回复
  • 你好,直接装的latest,硬盘管理提示错误呢?
    其他openwrt的插件有办法装这个上面吗?

    校验提示文案

    提交
    磁盘管理在某些系统中的确无法使用
    其他插件的话需要进行移植

    校验提示文案

    提交
    收起所有回复
  • 嚯嚯,果然不愧是拿棍子的牛顿,牛背雷霆,强迫症小白光是搞清楚portainer的版本就要晕了,打开看那堆框更晕,有熟悉的界面来管docker是幸福,感谢

    校验提示文案

    提交
  • 好强,周末试试

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
53
扫一下,分享更方便,购买更轻松