1Panel Docker 镜像(DooD 方案)

English 中文(简体) GitHub Actions Status

1Panel Docker 镜像统计数据

Docker Pulls Docker Stars Docker Image Size

本仓库用于构建并发布 1Panel 的 Docker 镜像,采用 DooD(Docker-out-of-Docker)设计,复用宿主机 Docker 引擎,使用 supervisord 管理 1Panel 进程,避免在容器内运行 systemd 或使用 --privileged。

提示:本方案适合可信、单租户环境,生产环境使用需严格控制访问并做好防护策略(建议WAF+网络防火墙)。

目录

使用说明

特性与设计

支持系统与命名规范

快速开始

docker run

容器构建自动生成用户名、密码、端口,可启动后在容器内调整。这里假设面板默认端口为 8888。运行命令示例:

初始化(容器内):

重要的事情讲三遍!!!

首次部署务必修改用户名/密码/入口!

首次部署务必修改用户名/密码/入口!

首次部署务必修改用户名/密码/入口!

docker-compose

仓库内提供示例 docker-compose.yml(DooD 必要挂载已包含):

docker-compose.yml关键字段:

启动服务:

提示:

镜像拉取

将 {version} 替换为 2.0.0~2.0.15,{os} 替换为 ubuntu/centos/alpine。

目录结构

实现方案

systemctl 注释说明

 

涉及 systemctl 管理的服务

20250909 由GitHub copilot 生成

根据 1Panel-dev/1Panel 仓库代码,涉及 systemctl 管理的服务主要有以下几类。如果 systemctl 不可用(如 WSL、部分容器、极简发行版等),这些服务的启动/停止/重启/状态查询都将受到影响,面板功能也会有部分不可用或异常。

服务名称作用/描述systemctl不可用时影响代码依据/说明说明
1panel-core.service1Panel 核心服务无法启动/重启/查询状态,面板核心功能异常core/app/service/setting.go, common.go、core/app/service/upgrade.go、RestartService (common.go), UpdateBindInfo/UpdatePort/UpdateSSL (setting.go), UpgradeService.Upgrade面板配置、端口、SSL、主控服务、升级、回滚等重启
1panel-agent.service1Panel Agent服务(节点服务)无法启动/重启/查询状态,节点管理异常agent/utils/common.go, common.go、core/app/service/upgrade.go、RestartService (common.go), UpgradeService.Upgrade节点服务重启、升级后重启、节点异常恢复
docker.service, docker.socketDocker 守护进程容器管理、重启、停止等功能不可用agent/app/service/docker.go容器服务、应用容器管理、配置变更后重启
fail2ban.service防暴力破解服务(Fail2Ban)防护规则无法启停、重载或查询状态agent/utils/toolbox/fail2ban.go防护规则启停、重载、状态查询
clamav/clamd/freshclam病毒扫描服务(ClamAV)杀毒、病毒库更新相关功能不可用agent/app/service/clam.go杀毒服务启停、查杀操作、病毒库更新
ssh/sshd.serviceSSH 服务远程管理、SSH配置功能异常agent/app/service/ssh.goSSH服务启停、配置变更、安全加固
supervisor/supervisord进程守护服务(Supervisor)守护进程管理功能不可用前端文案、脚本管理相关守护进程启停、自动化任务、脚本运行

代码说明

  1. 所有涉及 systemctl 的服务都依赖 systemd

    • 代码中通过 systemctl 命令(如 restart, start, stop, status, is-active, is-enabled)管理服务。

    • 如 systemctl 不可用,这些命令将执行失败,服务无法被面板控制。

  2. Docker、SSH、Fail2Ban、ClamAV、Supervisor 这些常用服务都通过 systemctl 集成

    • 面板会自动调用 systemctl 重启、检测状态,如果命令失败则功能不可用或报错。

    • 部分服务有 snap 或其它方式检测

    • 代码如 agent/utils/systemctl/systemctl.go 有 snap 服务的检测和操作,但依赖 snap 环境,非 systemctl 的通用替代。

  3. 面板自身服务(core/agent)也通过 systemctl 管理

    • 面板自身无法自我重启/恢复,也无法远程管理节点。


systemctl 不可用时影响的面板功能

详细参考:服务&功能限制

主要接口/函数举例

 

Upgrade 相关 systemctl 调用补全说明

supervisord 说明

为什么不使用systemd

运行一个 systemd ,通常需要这样设置:

核心风险点在于 --privileged + --cgroupns=host + --volume /sys/fs/cgroup

  1. 宿主机隔离被打破

    • --privileged 让容器有所有 Linux capabilities(cap_sys_admin、cap_net_admin 等),等同 root。

    • 可以直接操作宿主机设备文件、网络栈,甚至加载内核模块。

  2. cgroup 控制泄露

    • --cgroupns=host + 挂载 /sys/fs/cgroup → 容器能操作宿主机的 cgroups,修改 CPU/内存限制、杀死其他容器的进程。

  3. 宿主机提权/逃逸

    • 特权容器几乎等于在宿主机上直接跑 root,隔离形同虚设。

    • 如果攻击者拿到这个容器的 shell,就相当于拿到了宿主机 root。

结论

  1. 不要在生产环境使用 --privileged 参数。

  2. 现有阶段 docker 运行 systemd 不可行。

  3. 作为备用方案,可使用 supervisord 来服务管理。

参考版本库:

  1. https://github.com/trfore/docker-ubuntu2404-systemd

  2. https://github.com/antmelekhin/docker-systemd

  3. 建议只在开发环境使用。

DooD说明

本指南提供一种“非官方”的 1Panel Docker 部署方案:

  1. 所谓的 DooD,就是 Docker Out of Docker。简单来讲,就是在一个 docker 容器内部调用外部的 Docker。 最简单的实现方式,共享 Host docker 的 sock 和 volumes。

  2. 使用 DooD(Docker‑out‑of‑Docker)复用宿主机 Docker 引擎,配合 supervisord 管理进程,避免在容器内运行 systemd 与 --privileged。

  3. 请在可信/单租户场景谨慎使用。需单独配置安全规则,如 WAF、防火墙。

 

容器内需复用宿主机 Docker 以安装/编排应用,需挂载:

参考docker-compose.yml:

 

为什么选择DooD

方案选型:DooD vs DinD vs Sysbox

结论:

在当前条件下选用 DooD + supervisord,明确拒绝在生产环境用 --privileged 跑 systemd。

DooD vs DinD vs Sysbox对比

特性维度DooD (Docker-out-of-Docker)DinD (Docker-in-Docker)Sysbox
基本原理容器内挂载宿主机 Docker socket,直接复用宿主机 Docker 引擎在容器中运行独立的 Docker 引擎(DinD 镜像)使用 Sysbox 作为底层 runtime,容器内可安全运行 Docker / K8s 等系统级 workload
优点- 共享宿主机镜像缓存,构建速度快- 节省磁盘空间- 简单易用,官方有现成 DinD 镜像- 容器内外引擎隔离,避免直接操作宿主机容器- 无需 privileged 容器- 使用 Linux user namespace 提供强隔离- 支持系统级 workload(Docker/K8s)- 与 Docker/K8s 无缝集成,使用方式类似 runc
缺点- 安全风险极大:容器可直接控制宿主机 Docker,甚至删除宿主机所有容器- 不适合多租户环境- bind mount 限制,某些功能(如 volume 挂载)可能失效- 需要 privileged 权限运行,容器内 root = 宿主机 root- root 拥有全部 Linux capabilities,存在逃逸风险- 可直接访问宿主机设备和 /proc、/sys,能修改内核状态- 需要较新的 Linux 内核- 目前只支持部分 Linux 发行版- 仍在社区发展中,生态不如 Docker 官方成熟
安全风险高:容器内用户几乎等于宿主机 root 权限高:privileged 容器 = 宿主机 root + 全 capability,容易被利用相对低:用户隔离(userns)、procfs/sysfs 虚拟化、syscall 拦截,避免直接 root 映射
适用场景- 本地开发临时测试- 单人或可信环境- CI/CD 流水线需要独立 Docker 环境- 简单快速的沙箱环境- CI/CD 多租户 runner- 安全沙箱环境- 在容器中运行系统级 workload(如 Docker/K8s)
推荐程度✅ 推荐(需控制访问权限)⚠️ 谨慎使用(非生产安全场景)❌ 不推荐(配置复杂)

参考链接:

  1. Docker-in-Docker: Containerized CI Workflows

构建说明

本地构建(Makefile)

依赖:Docker Desktop(含 buildx),已登录 DockerHub(如需推送)。

列出命令:

常用命令:

变量:

构建示例

命名规范:caijiamx/1panel:dood-{version}-{os}-cn

GitHub Actions 构建

工作流:.github/workflows/main.yml(“Build and Push 1Panel Images”)

升级说明

从 v2.0.0 -> v2.0.11升级为例,准备工作:

  1. 备份原始镜像,如 v2.0.0

  2. 备份挂载数据。

  3. 停止容器。

版本升级步骤

开始升级步骤:

  1. 构建/拉取新版本镜像(例如 2.0.11)

  2. 手动修改版本号

  3. 启动新服务。

手动修改版本号

官方安装会自动维护版本号;本镜像方案需手动同步版本号(示例使用 sqlite3):

更新镜像后重启容器(保留 /opt/ 数据卷)。

常见问题

服务&功能限制

  1. 面板->右下角更新->“立即升级”不可用。官方升级逻辑依赖 systemctl 停启服务。

  2. 面板->容器功能不可用。服务判定 docker 存活依赖 systemctl status,后续会优化不再依赖 systemctl。

  3. nginx_status 默认仅监听 127.0.0.1,需自行调整。参考:OpenResty 当前状态报错

  4. 部分应用安装时挂载路径出现异常,需按实际路径修正。

  5. 1panel-core&1panel-agent 运行用户为 root。指定用户 nobody 运行的话,服务 1panel-agent 会挂掉。

  6. 工具箱->进程守护、FTP、Fail2ban 不可用。

  7. v2.0.11 版本改进了 docker 服务判定逻辑,面板->容器功能基本可用(完整功能未全面测试)。

  8. v2.0.11 新增磁盘管理,不建议使用该功能。

  9. v2.0.12 - v2.0.15 待验证兼容性。

面板不可用功能表格如下:

功能是否可用备注
面板->立即升级(右下角) 
网站->网站->OpenResy设置->当前状态
网站->运行环境->php-fpm容器状态检查
 
工具箱->进程守护、FTP、Fail2ban、磁盘管理功能未测试
高级功能功能未测试

FAQ

安装应用报错 “Are you trying to mount a directory onto a file”

举例:

 

常用变量

 

OpenResty 当前状态报错

报错信息:

原因:健康检查 127.0.0.1 访问失败,容器内访问 127.0.0.1 会访问 1panel 监听80端口,而 openresty 是单独的容器,1panel -> openresty 可以走 http://openresty

处理:可为健康检查添加 host:server_name 127.0.0.1 openresty; 正确访问地址:http://openresty/nginx_status

彻底解决问题,需要修改官方实现代码:

 

反向代理配置

WebSocket/升级头

 

安全入口与账户信息

Cloudflare 常见端口

 

资源与超时

CPU 限额过低可能导致接口超时(偶尔 5xx/超时),建议 1.0~1.5 core。

 

安全提示

参考项目

  1. okxlin/docker-1paneltangger2000/1panel-dood(项目已归档)

  2. purainity/docker-1panel-v2dph5199278/docker-1panelXeath/1panel-in-docker

  3.  

维护者

 

返回首页