在之前的内容中,我们提到过懒猫微服采用三套独立的 Docker 环境来隔离系统组件、Playground Docker 与商店 App 的 Docker 实例。那么问题来了:如何让商店中上架的 App 操作 Playground 中的 Docker 引擎?
答案是:通过挂载 docker.sock 文件来实现跨容器控制。
所以我们可以在商店的 APP 中操作 playground docker,其实也就是 Docker 面板或者轻量 Docker 面板做的事情。
为什么不操作其他两个 Docker 引擎?
- 系统组件 Docker 无需干预,重启之后可以复原。
- 应用商店有自己的生命周期,也无需干预。
一、在 build.yml 中挂载 Playground 路径
首先,在打包配置 build.yml 中新增 services 字段,用于将宿主机中的 /data/playground 挂载到容器内部:
1 2 3 4 5 6 7 8 9 10 11 12 13
| manifest: ./lzc-manifest.yml
pkgout: ./ icon: ./logo.png
services: containly: volumes: - bind: create_host_path: true source: /data/playground target: /lzcapp/run/playground type: bind
|
打包后会生成一个名为 compose.override.yml 的文件。请注意:即使你手动创建了 compose.override.yml,也可能无法直接生效,必须通过打包流程自动生成。(此结论基于初步测试)
生成后的 compose.override.yml 内容如下:
1 2 3 4 5 6 7 8
| services: containly: volumes: - bind: create_host_path: true source: /data/playground target: /lzcapp/run/playground type: bind
|
二、修改 manifest.yml 实现 docker.sock 映射
为了让上架 App 操作 Docker,需要手动编辑 manifest.yml 文件,添加以下内容:
1 2 3 4 5
| binds: - /lzcapp/run/playground/docker.sock:/var/run/docker.sock environment: - DOCKGE_STACKS_DIR=/lzcapp/var/stacks - DOCKER_HOST=unix:///lzcapp/run/playground/docker.sock
|
这样,容器内的 Docker CLI 或管理面板就可以通过 DOCKER_HOST 环境变量,控制宿主机的 Docker 引擎。
三、完整的 manifest.yml 示例
以下是完整可运行的 manifest.yml 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| lzc-sdk-version: 0.1 package: xu.deploy.containly version: 0.0.2 name: Containly description: >- A fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager. license: https://choosealicense.com/licenses/mit/ homepage: https://github.com/cloudsmithy/Containly author: xu usage: >- 安装完成后,请重启懒猫微服以启用 Docker。
此应用将接管懒猫微服的独立 Docker 守护进程,可能存在安全风险。在授予容器 privileged 等权限之前,请确保容器是安全的,且不会执行危险操作。为了避免潜在风险,请确保:
1. 您了解容器的行为,并确认它们来自可信的源。 2. 容器中没有运行高危命令,且没有暴露不必要的端口或服务。
建议先查阅懒猫微服开发者手册,了解相关特性和限制,并根据手册中的安全建议配置容器。 application: subdomain: containly routes: - /=http://containly.xu.deploy.containly.lzcapp:5000/ services: containly: image: registry.lazycat.cloud/u04123229/cloudsmithy/containly:896f4251373d0ebe binds: - /lzcapp/run/playground/docker.sock:/var/run/docker.sock environment: - DOCKGE_STACKS_DIR=/lzcapp/var/stacks - DOCKER_HOST=unix:///lzcapp/run/playground/docker.sock
|
四、总结
通过挂载 docker.sock 文件和设置 DOCKER_HOST,我们可以让商店上架的 App 控制懒猫微服的 Playground Docker 实例。我用这个功能上架了自己写的 Docker 面板,一起来玩一玩嘛?
