caijiamx/1panel
本仓库用于构建并发布 1Panel 的 Docker 镜像,采用 DooD(Docker-out-of-Docker)设计,复用宿主机 Docker 引擎,使用 supervisord 管理 1Panel 进程,避免在容器内运行 systemd 或使用 --privileged。
提示:本方案适合可信、单租户环境,生产环境使用需严格控制访问并做好防护策略(建议WAF+网络防火墙)。
构建时以 sed 将 {%OnePanel_Version%} 替换为具体版本(2.0.0~2.0.11)。RUN bash /1panel/quick_start.sh v{%OnePanel_Version%}
容器构建自动生成用户名、密码、端口,可启动后在容器内调整。这里假设面板默认端口为 8888。运行命令示例:
bashdocker run -d --name 1panel --restart unless-stopped \ -p 8888:8888 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ -v /1panel_app/data/:/opt/ \ caijiamx/1panel:dood-2.0.11-ubuntu-cn
初始化(容器内):
重要的事情讲三遍!!!
首次部署务必修改用户名/密码/入口!
首次部署务必修改用户名/密码/入口!
首次部署务必修改用户名/密码/入口!
bashdocker exec -it 1panel bash # 查看安全入口与当前配置 1panel user-info # 修改端口/用户/密码 1panel update port 1panel update username 1panel update password
仓库内提供示例 docker-compose.yml(DooD 必要挂载已包含):
yamlservices: one_panel: image: caijiamx/1panel:dood-2.0.11-ubuntu-cn container_name: 1panel restart: unless-stopped ports: - "8888:8888" volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes - /1panel_app/data/:/opt/
docker-compose.yml关键字段:
启动服务:
docker network create one_panel docker compose up -d
提示:
bash# Ubuntu docker pull caijiamx/1panel:dood-2.0.11-ubuntu-cn # CentOS docker pull caijiamx/1panel:dood-2.0.11-centos-cn # Alpine docker pull caijiamx/1panel:dood-2.0.11-alpine-cn
将 {version} 替换为 2.0.0~2.0.11,{os} 替换为 ubuntu/centos/alpine。
alpine/ # Alpine Dockerfile 模板 centos/ # CentOS Dockerfile 模板 ubuntu/ # Ubuntu Dockerfile 模板 hack/ # 安装与 systemctl 注释脚本、supervisord 配置 hack_cn/ # 安装与 systemctl 注释脚本、supervisord 配置 .github/workflows/main.yml # GitHub Action CI 多版本/多系统/多架构构建与推送 docker-compose.yml # 容器运行配置 Makefile # 本地构建/推送/矩阵任务
20250909 由GitHub copilot 生成
根据 1Panel-dev/1Panel 仓库代码,涉及 systemctl 管理的服务主要有以下几类。如果 systemctl 不可用(如 WSL、部分容器、极简发行版等),这些服务的启动/停止/重启/状态查询都将受到影响,面板功能也会有部分不可用或异常。
| 服务名称 | 作用/描述 | systemctl不可用时影响 | 代码依据/说明 | 说明 |
|---|---|---|---|---|
| 1panel-core.service | 1Panel 核心服务 | 无法启动/重启/查询状态,面板核心功能异常 | 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.service | 1Panel Agent服务(节点服务) | 无法启动/重启/查询状态,节点管理异常 | agent/utils/common.go, common.go、core/app/service/upgrade.go、RestartService (common.go), UpgradeService.Upgrade | 节点服务重启、升级后重启、节点异常恢复 |
| docker.service, docker.socket | Docker 守护进程 | 容器管理、重启、停止等功能不可用 | agent/app/service/docker.go | 容器服务、应用容器管理、配置变更后重启 |
| fail2ban.service | 防暴力破解服务(Fail2Ban) | 防护规则无法启停、重载或查询状态 | agent/utils/toolbox/fail2ban.go | 防护规则启停、重载、状态查询 |
| clamav/clamd/freshclam | 病毒扫描服务(ClamAV) | 杀毒、病毒库更新相关功能不可用 | agent/app/service/clam.go | 杀毒服务启停、查杀操作、病毒库更新 |
| ssh/sshd.service | SSH 服务 | 远程管理、SSH配置功能异常 | agent/app/service/ssh.go | SSH服务启停、配置变更、安全加固 |
| supervisor/supervisord | 进程守护服务(Supervisor) | 守护进程管理功能不可用 | 前端文案、脚本管理相关 | 守护进程启停、自动化任务、脚本运行 |
详细参考:服务&功能限制
/api/v1/setting/update_port —— 端口修改,涉及 RestartService 调用 systemctl 重启 core 服务/api/v1/setting/update_ssl —— SSL 配置修改后,涉及 systemctl 重启 core 服务/api/v1/upgrade/upgrade —— 升级接口,涉及 UpgradeService.Upgrade,systemctl 重启 core/agent 服务/api/v1/upgrade/rollback —— 回滚接口,涉及 UpgradeService.handleRollback,systemctl 重启 core/agent 服务/api/v1/docker/restart —— 容器管理,调用 OperateDocker,systemctl 重启 docker 服务/api/v1/agent/restart —— 节点管理,重启 agent 服务/api/v1/fail2ban/operate —— 安全防护策略启停/api/v1/clam/operate —— 病毒查杀服务启停/api/v1/ssh/operate —— SSH 服务启停与配置/api/v1/supervisor/operate —— 守护进程服务启停Upgrade 相关 systemctl 调用补全说明
core/app/service/upgrade.go 的 UpgradeService.Upgrade 实现,升级成功后会调用:
systemctl daemon-reloadsystemctl restart 1panel-agent.servicesystemctl restart 1panel-core.servicehandleRollback、handleBackup 也会调用 systemctl daemon-reload && systemctl restart 1panel.service。bashsupervisorctl status supervisorctl restart all supervisorctl reload
运行一个 systemd ,通常需要这样设置:
shelldocker run -d -it \ --name ubuntu2404-systemd \ --privileged \ --cgroupns=host \ --tmpfs=/run \ --tmpfs=/tmp \ --volume=/sys/fs/cgroup:/sys/fs/cgroup:rw \ trfore/docker-ubuntu2404-systemd:latest
核心风险点在于 --privileged + --cgroupns=host + --volume /sys/fs/cgroup:
宿主机隔离被打破
--privileged 让容器有所有 Linux capabilities(cap_sys_admin、cap_net_admin 等),等同 root。cgroup 控制泄露
--cgroupns=host + 挂载 /sys/fs/cgroup → 容器能操作宿主机的 cgroups,修改 CPU/内存限制、杀死其他容器的进程。宿主机提权/逃逸
--privileged 参数。参考版本库:
本指南提供一种“非官方”的 1Panel Docker 部署方案:
容器内需复用宿主机 Docker 以安装/编排应用,需挂载:
参考docker-compose.yml:
yml# 关键配置 volumes: # make docker out of docker work - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes - /1panel_app/data/:/opt/
结论:
在当前条件下选用 DooD + supervisord,明确拒绝在生产环境用 --privileged 跑 systemd。
| 特性维度 | 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) |
| 推荐程度 | ✅ 推荐(需控制访问权限) | ⚠️ 谨慎使用(非生产安全场景) | ❌ 不推荐(配置复杂) |
参考链接:
依赖:Docker Desktop(含 buildx),已登录 DockerHub(如需推送)。
列出命令:
bashmake help
常用命令:
变量:
构建示例
bash# 调试单个命令 make -n build OS=ubuntu VERSION=2.0.11 ONEPANEL_TYPE=cn # 构建单个镜像 make build OS=ubuntu VERSION=2.0.11 ONEPANEL_TYPE=cn
命名规范:caijiamx/1panel:dood-{version}-{os}-cn
工作流:.github/workflows/main.yml(“Build and Push 1Panel Images”)
从 v2.0.0 -> v2.0.11升级为例,准备工作:
开始升级步骤:
官方安装会自动维护版本号;本镜像方案需手动同步版本号(示例使用 sqlite3):
bashsudo apt-get update && apt-get install -y sqlite3 cp /opt/1panel/db/core.db /opt/1panel/db/core.db.bak cp /opt/1panel/db/agent.db /opt/1panel/db/agent.db.bak sqlite3 /opt/1panel/db/core.db "UPDATE settings SET value='v2.0.11' WHERE key='SystemVersion';" sqlite3 /opt/1panel/db/agent.db "UPDATE settings SET value='v2.0.11' WHERE key='SystemVersion';"
更新镜像后重启容器(保留 /opt/ 数据卷)。
面板不可用功能表格如下:
| 功能 | 是否可用 | 备注 |
|---|---|---|
| 面板->立即升级(右下角) | ❌ | |
| 网站->网站->OpenResy设置->当前状态 网站->运行环境->php-fpm容器状态检查 | ❌ | |
| 工具箱->进程守护、FTP、Fail2ban、磁盘管理 | ❌ | 功能未测试 |
| 高级功能 | ❌ | 功能未测试 |
举例:
yml# 容器内docker-compose.yml配置 - ${WEBSITE_DIR}:/www -> /1panel_app/data/1panel/www:/www # 容器内默认 1panel 项目目录:/opt/1panel
常用变量
# 1panel 使用变量,用于文件 docker-compose.yml ${CONTAINER_NAME} # 自定义容器名 ${IMAGE_NAME} # 自定义镜像名 ${PANEL_APP_PORT_HTTP} # 自定义端口 ${PANEL_WEBSITE_DIR} # 默认为 /opt/1panel/www ${WEBSITE_DIR} # 默认为 /opt/1panel/www
报错信息:
服务内部错误: Get "[***]": dial tcp 127.0.0.1:80: connect: connection refused
原因:健康检查 127.0.0.1 访问失败,容器内访问 127.0.0.1 会访问 1panel 监听80端口,而 openresty 是单独的容器,1panel -> openresty 可以走 [***]。
处理:可为健康检查添加 host:server_name 127.0.0.1 openresty; 正确访问地址:<[***]>。
彻底解决问题,需要修改官方实现代码:
go# 文件路径:agent/app/service/nginx.go func (n NginxService) GetStatus() (response.NginxStatus, error) { // bala url := "[***]" if httpPort != 80 { url = fmt.Sprintf("[***]", httpPort) } useDoodMode := true if useDoodMode { localServerName := "127.0.0.1" openrestyContainerName := "openresty" url = strings.ReplaceAll(url, localServerName, openrestyContainerName) } // bala }
WebSocket/升级头
nginxproxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; # 若需要固定后端 Host,请显式设置
开启安全入口后,通过容器内命令查看:1pctl user-info
首次部署务必修改用户名/密码/入口
建议WAF+网络防火墙做好访问控制。
CPU 限额过低可能导致接口超时(偶尔 5xx/超时),建议 1.0~1.5 core。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务