Debian服务器部署1Panel:专治Docker困难户的运维方案

📅 2026/7/16 4:43:41 👁️ 阅读次数 📝 编程学习
Debian服务器部署1Panel:专治Docker困难户的运维方案

1. 为什么 Debian 用户特别需要 1Panel?——从“Docker 困难户”的真实困境说起

你是不是也经历过这些时刻:在一台刚装好的 Debian 服务器上,想跑个 Nextcloud,查了三篇教程,发现每篇的docker run命令参数都不一样;复制粘贴完命令,容器启动了,但网页打不开,curl -I localhost:8080返回Connection refused,翻遍日志只看到一行standard_init_linux.go:228: exec user process caused: exec format error,却根本不知道这行字在说啥;想改个 Nginx 配置,发现容器里连vi都没装,apt update报错 “Unable to locate package”,最后只能docker exec -it xxx /bin/sh进去硬改,改完重启又失效……这不是操作失误,这是典型的“Docker 困难户”症状——不是学不会,是环境太碎、路径太深、反馈太慢。

而 Debian,恰恰是这种困境的“高发区”。它不像 Ubuntu 那样默认集成 Snap 或预装 Docker Desktop 的 GUI 层,也不像 CentOS 那样有大量面向运维的中文文档沉淀。Debian 的哲学是“稳定压倒一切”,这意味着它的软件源版本保守、内核模块默认精简、SELinux/AppArmor 策略更严格、甚至systemd-resolveddnsmasq的冲突都可能让容器网络莫名其妙掉线。我去年帮一位高校实验室部署 NAS 时,就遇到过 Debian 12 上dockerd启动后docker ps一直卡住,排查三天才发现是apparmor_parser加载策略失败,而错误日志被journalctl -u docker自动截断了前 20 行——这种细节,99% 的 Docker 入门教程根本不会提。

1Panel 的价值,就在这里:它不试图让你“学会 Docker”,而是把 Docker 的核心能力——镜像拉取、容器编排、端口映射、卷挂载、日志查看——封装成一个符合人类直觉的操作界面。它不是 Docker 的替代品,而是 Docker 的“翻译器”和“缓冲垫”。比如,当你在 1Panel 里点击“创建容器”,它背后执行的其实是docker run -d --name=nextcloud --restart=unless-stopped -p 8080:80 -v /opt/1panel/extra/nextcloud/data:/var/www/html/data -e TZ=Asia/Shanghai -e MYSQL_HOST=172.17.0.1 nextcloud:latest这一整串命令,但你完全不需要记住-v-e的顺序,也不用担心路径权限问题——1Panel 会自动检查/opt/1panel/extra/目录的属主是否为1panel用户,并在创建前为你chown -R 1panel:1panel /opt/1panel/extra/nextcloud。这才是“专治困难户”的底层逻辑:把技术债打包成可感知、可回滚、可审计的操作单元。

更重要的是,1Panel 是为 Linux 服务器原生设计的,不是 Docker Desktop 那种“在 Windows/macOS 上模拟 Linux 环境”的套娃方案。它直接运行在 systemd 之下,所有容器进程由dockerd统一管理,资源占用比 WebUI 类工具低 40% 以上(实测数据:同等负载下,1Panel 内存常驻 85MB,Portainer CE 为 132MB)。它甚至能绕过 Docker Desktop 在 VMware 中常见的virtualization support not detected错误——因为根本不需要虚拟化嵌套,它直接调用宿主机的runc。所以,如果你的服务器是 Debian + VMware 虚拟机,或者你正被debian btrfs子卷配额搞到崩溃,又或者你在debian 13 upgrade 7.x kernel后发现docker模块加载失败,那么 1Panel 不是“锦上添花”,而是“雪中送炭”。

提示:本文所有操作均基于 Debian 12(bookworm)实测,兼容 Debian 11(bullseye)及 Debian 13(trixie)。不推荐在 Debian 10(buster)上安装,因其内核版本过低(4.19),无法支持 1Panel 所需的 overlay2 存储驱动高级特性。

2. 安装前必须确认的 5 个硬性条件:跳过这一步,90% 的失败都发生在这里

很多用户反馈“1Panel 安装一半卡住”“面板打不开”“容器启动报错”,80% 以上的问题根源,都出在安装前的环境校验环节。1Panel 看似一键安装,实则对底层环境有明确且不可妥协的要求。下面这 5 个检查项,我建议你逐条在终端里敲命令验证,而不是凭经验跳过:

2.1 检查系统架构与内核版本:Debian 的“身份证”必须合规

# 查看系统架构(必须是 amd64 或 arm64) uname -m # 正确输出示例:x86_64 或 aarch64 # 错误输出示例:i686(32位)、armv7l(32位ARM)——1Panel 不支持 # 查看内核版本(必须 ≥ 5.4) uname -r # 正确输出示例:6.1.0-18-amd64(Debian 12 默认内核) # 错误输出示例:4.19.0-25-amd64(Debian 10 内核)——需先升级内核 # 查看内核配置(关键:overlay2 支持必须启用) zcat /proc/config.gz 2>/dev/null | grep CONFIG_OVERLAY_FS || cat /boot/config-$(uname -r) | grep CONFIG_OVERLAY_FS # 必须看到:CONFIG_OVERLAY_FS=m 或 =y # 如果提示 "No such file",说明未启用 config.gz,需手动检查: grep -i overlay /proc/filesystems # 正确输出应包含:nodev overlay

为什么这个检查如此关键?因为 1Panel 的容器管理依赖overlay2作为默认存储驱动。Debian 11 默认使用overlay,而 Debian 12 默认使用overlay2。如果你在 Debian 11 上升级了内核但没更新docker-cedocker info可能显示Storage Driver: overlay,此时 1Panel 创建容器时会因overlay2特性缺失(如copy_up性能优化)而静默失败。我曾遇到一个案例:用户在 Debian 11 上安装 1Panel 后,所有容器状态显示“运行中”,但docker ps -a却看不到任何进程——最终定位到是overlay驱动不支持--init参数,导致容器 init 进程无法启动。

2.2 验证 Docker 是否已正确安装并运行

1Panel 不自带 Docker,它要求宿主机已预装 Docker Engine(非 Docker Desktop)。很多人误以为“装了 Docker Desktop 就行”,这是最大误区。

# 检查 Docker CLI 是否可用(必须返回版本号) docker --version # 示例输出:Docker version 24.0.7, build afdd53b # 检查 Docker Daemon 是否运行(必须返回 active (running)) systemctl is-active docker # 检查 Docker Info(重点看 Storage Driver 和 Cgroup Driver) docker info | grep -E "(Storage Driver|Cgroup Driver|Kernel Version)" # 正确输出示例: # Storage Driver: overlay2 # Cgroup Driver: systemd # Kernel Version: 6.1.0-18-amd64 # 关键测试:能否拉取并运行最简容器(验证网络和存储) docker run --rm hello-world 2>/dev/null && echo "✅ Docker 运行正常" || echo "❌ Docker 异常"

如果docker info显示Cgroup Driver: cgroupfs,请立即修正。Debian 12+ 默认使用systemd作为 Cgroup Driver,而cgroupfs会导致 1Panel 的资源监控(CPU/内存使用率)完全失真。修正方法如下:

# 编辑 Docker 配置 sudo mkdir -p /etc/docker echo '{"exec-opts": ["native.cgroupdriver=systemd"]}' | sudo tee /etc/docker/daemon.json sudo systemctl restart docker # 重启后再次运行 docker info 验证

2.3 确认系统时间与证书链:被忽视的“隐形杀手”

Debian 的tzdata包和ca-certificates包,看似与面板无关,实则决定 1Panel 能否成功连接其官方应用商店。

# 检查系统时间是否准确(误差 > 5 分钟将导致 HTTPS 握手失败) timedatectl status | grep "System clock synchronized" # 检查证书链是否完整(1Panel 应用商店使用 Let's Encrypt 证书) curl -I https://apps.1panel.cn 2>/dev/null | head -1 # 正确输出:HTTP/2 200 或 HTTP/1.1 200 OK # 错误输出:curl: (60) SSL certificate problem: unable to get local issuer certificate # 如果证书报错,更新证书链 sudo apt update && sudo apt install -y ca-certificates && sudo update-ca-certificates

这个坑我踩过两次。一次是客户服务器 BIOS 电池没电,系统时间倒退了 3 年,导致curl认为 Let's Encrypt 证书“尚未生效”;另一次是 Debian 11 的ca-certificates包版本过旧(20210119),缺少 ISRG Root X1 证书,而 1Panel 商店的证书链正是基于此根证书签发。解决方案就是强制更新证书包,而非修改系统时间——后者会破坏systemd-timesyncd的同步逻辑。

2.4 检查磁盘空间与 Inodes:1Panel 的“粮仓”必须充足

1Panel 默认将所有数据(包括应用商店缓存、容器卷、备份文件)存放在/opt/1panel。这个目录的磁盘空间和 Inodes 数量,直接决定你能部署多少服务。

# 检查 /opt 分区剩余空间(建议 ≥ 20GB) df -h /opt # 检查 /opt 分区 Inodes 使用率(建议 < 85%) df -i /opt # 如果 /opt 是独立分区且空间不足,可临时软链接到大分区 # (注意:此操作需在安装 1Panel 前完成,安装后修改需迁移数据) sudo mkdir -p /data/1panel sudo ln -sf /data/1panel /opt/1panel

Inodes 不足是个隐蔽问题。Debian 默认 ext4 文件系统,每 GB 分配约 32K Inodes。当/opt/1panel下存在大量小文件(如 Node.js 应用的node_modules、Python 的.pyc缓存),Inodes 很快耗尽。现象是:1Panel 页面能打开,但点击“应用商店”时无限转圈,journalctl -u 1panel日志里反复出现open /opt/1panel/cache/apps/xxx.json: no space left on device——注意,这里报的是 “no space left on device”,但df -h显示空间充足。这就是典型的 Inodes 耗尽。解决方法只有两个:清理无用小文件,或重新格式化分区时指定-i 16384(每 GB 16K Inodes)。

2.5 验证防火墙与端口冲突:1Panel 的“大门”必须畅通

1Panel 默认监听80(HTTP)和443(HTTPS)端口。如果这些端口被 Nginx/Apache 占用,安装会失败。

# 检查 80 和 443 端口占用情况 sudo ss -tuln | grep -E ":80|:443" # 如果被占用,有两种选择: # 方案 A:停止占用服务(推荐给新手) sudo systemctl stop nginx apache2 sudo systemctl disable nginx apache2 # 方案 B:修改 1Panel 端口(适合已有 Web 服务的用户) # 安装时通过环境变量指定(见后文安装命令) export PANEL_PORT=8080 export PANEL_SSL_PORT=8443

特别提醒:Debian 的ufw防火墙默认是禁用的,但如果你启用了它,请务必放行新端口:

sudo ufw allow 8080 sudo ufw allow 8443 sudo ufw reload

注意:不要尝试用iptables直接转发 80→8080。1Panel 的 HTTPS 证书申请(ACME)需要直接监听 443 端口进行 HTTP-01 挑战,端口转发会导致证书申请失败。

3. 三种安装方式深度对比:为什么我坚持用“离线安装包”而非一键脚本

网上流传的 1Panel 安装方法主要有三种:官方一键脚本、Docker 容器化部署、离线安装包。很多教程直接推荐“curl 一键安装”,但我在线上 27 台 Debian 服务器的部署实践中,100% 选择了离线安装包。原因很简单:可控性、可审计性、可复现性。下面我用一张表,把三种方式的核心差异摊开讲透:

| 对比维度 | 官方一键脚本 (curl -sSL https://... | bash) | Docker 容器化部署 (docker run -d ...) | 离线安装包 (tar.gz+install.sh) | |------------------|----------------------------------------|------------------------------------------|--------------------------------------| |网络依赖| ⚠️ 全程需联网(下载脚本、二进制、依赖) | ⚠️ 需联网拉取镜像(1panel/1panel:latest) | ✅ 完全离线(仅首次安装需下载一次包) | |系统侵入性| ⚠️ 直接写入/usr/local/bin/etc/systemd/system| ✅ 隔离在容器内,不修改宿主机文件系统 | ✅ 仅写入/opt/1panel/usr/lib/systemd/system/1panel.service| |升级风险| ⚠️curl \| bash无法审计脚本内容,存在供应链攻击风险 | ✅ 镜像哈希可验证,但升级需docker pull+docker-compose down/up| ✅ 升级包可提前下载校验 SHA256,install.sh脚本开源可读 | |调试难度| ⚠️ 脚本执行失败,错误信息混杂,难以定位具体哪步出错 | ✅ 容器日志清晰(docker logs 1panel),但需懂容器排错 | ✅ 日志全在/opt/1panel/logs/install.log,按步骤编号,失败点一目了然 | |Debian 兼容性| ⚠️ 脚本内硬编码apt-get install -y curl,在无curl的最小化安装中失败 | ✅ 与发行版无关,但需宿主机 Docker 版本 ≥ 20.10 | ✅ 专为 Debian 优化,自动检测apt/dpkg状态,处理btrfs子卷特殊逻辑 |

这张表不是理论推演,而是我踩坑后的血泪总结。举个真实案例:某次为客户部署,我按教程用一键脚本,结果脚本在apt update后执行apt install -y docker.io,而客户服务器已预装docker-cedocker.io(Debian 官方源)和docker-ce(Docker 官方源)的二进制文件冲突,导致dockerd启动失败,整个服务器 Docker 生态瘫痪。而离线安装包的install.sh里有明确判断:

# install.sh 片段(已脱敏) if command -v docker &> /dev/null; then DOCKER_VERSION=$(docker --version | awk '{print $3}' | tr -d ',') if dpkg --compare-versions "$DOCKER_VERSION" "lt" "24.0.0"; then echo "警告:Docker 版本 $DOCKER_VERSION 较低,建议升级至 24.0.0+" fi else echo "错误:未检测到 Docker,请先安装 Docker Engine" exit 1 fi

这就是“可控性”的价值:它不假设你的环境,而是主动探测、友好提示、安全退出。

3.1 离线安装包的完整获取与校验流程

第一步,去官网下载最新离线包(截至 2024 年 7 月,最新版为v1.10.12):

# 创建临时目录 mkdir -p ~/1panel-install && cd ~/1panel-install # 下载离线包(注意:URL 中的 v1.10.12 需替换为当前最新版) wget https://github.com/1Panel-dev/1Panel/releases/download/v1.10.12/1panel-linux-amd64.tar.gz # 下载对应的 SHA256 校验文件 wget https://github.com/1Panel-dev/1Panel/releases/download/v1.10.12/1panel-linux-amd64.tar.gz.sha256 # 校验完整性(必须输出 "OK") sha256sum -c 1panel-linux-amd64.tar.gz.sha256 # 输出示例:1panel-linux-amd64.tar.gz: OK

提示:如果你的服务器无法访问 GitHub,可在国内镜像站下载,但必须校验 SHA256。我见过三次因镜像站同步延迟导致下载到旧版包(如 v1.10.10),而新版 1Panel 的headscale应用商店组件依赖 v1.10.12 的 API 变更,旧版安装后商店直接空白。

3.2 执行安装:install.sh脚本背后的 7 个关键动作

解压并运行安装脚本,看似简单,实则背后有 7 个自动化步骤,每个都针对 Debian 做了深度适配:

# 解压 tar zxvf 1panel-linux-amd64.tar.gz # 运行安装(加 -v 参数可查看详细日志) sudo ./install.sh -v # 安装完成后,获取初始密码 sudo cat /opt/1panel/password

这行sudo ./install.sh -v执行时,脚本实际完成了以下动作:

  1. 创建系统用户与组useradd -r -s /bin/false -d /opt/1panel 1panel,确保 1Panel 进程以非特权用户运行,符合 Debian 的安全基线。
  2. 初始化数据目录mkdir -p /opt/1panel/{cache,logs,backup,extra},并递归设置权限chown -R 1panel:1panel /opt/1panel。特别处理btrfs文件系统:若检测到/opt是 btrfs 子卷,自动创建@1panel子卷并设置chattr +C(禁用 CoW),避免小文件写入性能下降。
  3. 注册 systemd 服务:生成/usr/lib/systemd/system/1panel.service,其中ExecStart指向/opt/1panel/1panel二进制,RestartSec=5确保崩溃后快速恢复。
  4. 配置防火墙规则:自动检测ufwiptables,添加放行规则(如ufw allow 80,443/tcp)。
  5. 预加载 Docker 配置:检查/etc/docker/daemon.json,若不存在则创建空文件,避免 Docker 启动时因配置缺失报错。
  6. 启动服务并设为开机自启systemctl daemon-reload && systemctl enable 1panel && systemctl start 1panel
  7. 生成初始密码文件openssl rand -base64 12 > /opt/1panel/password,密码仅存于此,不写入数据库。

整个过程耗时约 42 秒(实测 Debian 12 AMD64),所有操作均有日志记录,失败时会打印类似Step 3/7: Initialize data directory... FAILED的提示,方便精准定位。

3.3 安装后必做的 3 项安全加固

安装完成只是开始,真正的稳定性来自后续加固:

# 1. 修改默认端口(防止暴力扫描) sudo sed -i 's/80/8080/g; s/443/8443/g' /usr/lib/systemd/system/1panel.service sudo systemctl daemon-reload && sudo systemctl restart 1panel # 2. 启用 HTTPS(使用内置 ACME,无需 Nginx 反代) # 访问 http://your-server-ip:8080,登录后进入「设置」→「面板设置」→「HTTPS」→「申请证书」 # 输入你的域名(如 panel.example.com),1Panel 会自动完成 DNS 或 HTTP 挑战 # 3. 限制 IP 访问(仅允许公司办公网) sudo iptables -A INPUT -p tcp --dport 8080 ! -s 203.0.113.0/24 -j DROP sudo iptables-save | sudo tee /etc/iptables/rules.v4

注意:第 3 步的iptables规则,必须在ufw启用前设置,否则ufw会覆盖它。Debian 的iptables-persistent包是保存规则的黄金标准,比ufw更底层、更可靠。

4. 从零部署一个真实服务:以 “1Panel 下运行 headscale” 为例的全流程拆解

标题里提到的1panel 容器运行 headscale 启动不了,是近期最高频的求助问题。Headscale 是 Tailscale 的开源替代品,用于自建 WireGuard 网络,但其容器化部署在 1Panel 上确实有独特难点。下面我以Debian 12 + 1Panel v1.10.12为环境,手把手带你走通从创建容器到服务可用的每一步,所有操作均可在 1Panel Web 界面中完成,无需 SSH。

4.1 创建专用网络与数据卷:隔离是稳定的第一步

Headscale 需要持久化存储配置和密钥,且必须与其它容器网络隔离,避免端口冲突。

  1. 登录 1Panel:浏览器访问http://your-server-ip:8080,输入初始密码。
  2. 创建自定义网络
    • 左侧菜单 → 「容器」→ 「网络」→ 「创建网络」
    • 名称:headscale-net
    • 驱动:bridge
    • 子网:172.20.0.0/16
    • 网关:172.20.0.1
    • 关键勾选:“启用 IPv6”(Headscale 的某些客户端需要 IPv6 支持)
  3. 创建数据卷
    • 左侧菜单 → 「容器」→ 「卷」→ 「创建卷」
    • 名称:headscale-data
    • 驱动:local
    • 驱动选项:o=bind(确保绑定挂载)
    • 源路径:/opt/1panel/extra/headscale/data
    • 目标路径:/var/lib/headscale

提示:/opt/1panel/extra/是 1Panel 预留的用户数据目录,所有在此目录下的文件都会被自动备份。不要把数据卷指向/root/home,否则 1Panel 备份时会失败。

4.2 部署 Headscale 容器:参数配置的 5 个生死细节

点击「容器」→ 「创建容器」,填入以下配置。请务必逐项核对,漏掉任何一个,Headscale 都会启动失败

配置项为什么必须这样填?
镜像名称headscale/headscale:v0.22.0必须指定精确版本(v0.22.0),最新版 v0.23.0 有已知的 SQLite 锁问题,1Panel 商店未更新。
容器名称headscale简洁明了,便于识别
网络模式headscale-net(选择上一步创建的网络)确保 Headscale 能与其它服务(如 Nginx 反代)在同一网络通信
端口映射8080:8080/tcp(容器内端口 8080 → 宿主机 8080)Headscale Admin API 默认监听 8080,必须暴露。不能映射到 80,否则与 1Panel 面板冲突。
环境变量HEADSCALE_CONFIG=/etc/headscale/config.yaml
TZ=Asia/Shanghai
HEADSCALE_CONFIG指定配置文件路径,否则容器启动后找不到配置;TZ防止日志时间错乱。
卷挂载/opt/1panel/extra/headscale/data:/var/lib/headscale
/opt/1panel/extra/headscale/config.yaml:/etc/headscale/config.yaml
第一个挂载是数据持久化;第二个挂载是配置文件,必须提前在服务器上创建好config.yaml(见下一步)
重启策略除非已停止防止服务器重启后 Headscale 未自动启动
高级设置勾选“以特权模式运行”Headscale 需要创建 TUN 设备(/dev/net/tun),Debian 默认禁止容器访问,特权模式是最快解决方案。生产环境可改为--cap-add=NET_ADMIN

4.3 手动编写config.yaml:避开官方模板的 3 个大坑

1Panel 的“配置文件挂载”功能,要求你必须先在服务器上创建好config.yaml。直接复制官网模板会失败,因为有三个 Debian 特有的坑:

# 在服务器上创建配置目录 sudo mkdir -p /opt/1panel/extra/headscale # 创建 config.yaml(使用 nano 或 vim) sudo nano /opt/1panel/extra/headscale/config.yaml

填入以下内容(已针对 Debian 12 优化):

# /opt/1panel/extra/headscale/config.yaml database: type: sqlite3 sqlite3: path: /var/lib/headscale/db.sqlite # 关键修复 1:Debian 的 systemd-resolved 会劫持 127.0.0.53,导致 DNS 解析失败 dns: magic_dns: true # 必须显式指定上游 DNS,否则 headsclae 会尝试解析自身域名失败 upstream_dns_servers: - 1.1.1.1 - 8.8.8.8 # 关键修复 2:Headscale 默认监听 0.0.0.0:8080,但在 Docker 中需绑定到 127.0.0.1 # 否则 1Panel 的健康检查会误判为端口未响应 server_url: http://127.0.0.1:8080 listen_addr: 127.0.0.1:8080 # 关键修复 3:Debian 的 AppArmor 策略会阻止 headsclae 读取 /proc/sys/net/ipv4/ip_forward # 必须关闭此检查,否则启动时报错 "failed to read ip_forward" disable_check_updates: true

保存后,必须修改文件权限,否则容器内headscale用户无法读取:

sudo chown 1panel:1panel /opt/1panel/extra/headscale/config.yaml sudo chmod 644 /opt/1panel/extra/headscale/config.yaml

4.4 启动与验证:5 分钟内确认服务可用

回到 1Panel 界面,点击「创建容器」按钮。几秒后,容器列表会出现headscale,状态为“正在运行”。

  1. 查看实时日志:点击容器右侧的「日志」图标,观察输出。成功启动的标志是

    time="2024-07-15T10:23:45Z" level=info msg="Starting headscale server" version=v0.22.0 time="2024-07-15T10:23:45Z" level=info msg="Starting admin server" address="127.0.0.1:8080"
  2. 验证 API 可达性(在服务器本地执行):

    # 测试 Admin API curl -s http://127.0.0.1:8080/health | jq .status # 应返回:"ok" # 测试 Headscale 服务(需先创建用户) docker exec -it headscale headscale users list # 首次运行会提示 "no users found",这是正常的
  3. 创建首个用户并获取连接密钥

    • 在 1Panel 中,点击headscale容器 → 「终端」→ 输入:
      headscale users create myuser headscale users api-key create myuser
    • 复制生成的 API Key,用于客户端连接。

提示:如果日志中出现failed to open database: no such file or directory,说明config.yaml中的path路径错误,或数据卷挂载失败。检查/opt/1panel/extra/headscale/data/目录是否存在,以及chown权限是否正确。

5. 进阶技巧与避坑指南:那些官方文档不会写的“老司机经验”

部署完基础服务,真正的挑战才开始。以下是我在 27 台 Debian 服务器上,用 1Panel 管理超过 156 个容器后,总结出的 5 条“非官方但极其重要”的经验。它们不写在手册里,但能帮你省下至少 20 小时的排错时间。

5.1 修改 1Panel 下 Docker 的默认路径:告别/var/lib/docker空间焦虑

Debian 默认将 Docker 镜像和容器存储在/var/lib/docker。这个目录一旦占满,不仅容器无法启动,连apt upgrade都会失败(因为/var分区满了)。1Panel 本身不提供修改 Docker 根目录的界面,但你可以安全地迁移:

# 1. 停止所有服务 sudo systemctl stop 1panel docker # 2. 创建新目录(假设你有 /data 分区) sudo mkdir -p /data/docker # 3. 迁移数据(rsync 比 cp 更安全,保留权限和硬链接) sudo rsync -avz /var/lib/docker/ /data/docker/ # 4. 修改 Docker 配置 echo '{"data-root": "/data/docker"}' | sudo tee /etc/docker/daemon.json # 5. 清理旧目录(谨慎!确认新目录工作正常后再执行) sudo rm -rf /var/lib/docker # 6. 重启 sudo systemctl start docker 1panel

关键验证点:迁移后,docker info | grep "Docker Root Dir"必须显示/data/docker,且1Panel的「容器」页面能正常列出所有容器。如果页面空白,说明daemon.json格式错误,用sudo dockerd --validate检查。

5.2 1Panel 第三方商店的“隐藏开关”:如何安装未上架的应用

1Panel 应用商店(https://apps.1panel.cn)只上架了约 200 个应用,但社区有上千个 Helm Chart 和 Docker Compose 模板。想安装immich(自建照片云)或filebrowser(轻量文件管理),不用等官方上架:

  1. 下载应用的docker-compose.yml(例如从 GitHub 仓库):

    wget https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml -O /opt/1panel/extra/immich/docker-compose.yml
  2. 修改docker-compose.yml,将所有volumes:路径指向/opt/1panel/extra/immich/下的子目录。

  3. 在 1Panel 中,点击「应用」→ 「从文件部署」,上传修改后的docker-compose.yml

注意:docker-compose.yml中不能有build:指令(需要本地构建),必须全部使用image:。这是 1Panel 的硬性限制。

5.3 解决debian nginx访问html access denied:1Panel 与 Nginx 的共存之道

很多用户想用 Nginx 为 1Panel 面板加 HTTPS 反代,结果配置完nginx.conf,访问https://panel.example.com却返回403 Forbidden。根本原因是:1Panel 的静态文件(/opt/1panel/web/)默认权限是750,Nginx 的www-data用户不属于1panel组。

终极解决方案(非