从零开始的小主机折腾记#2
续上一章:Docker 相关事项补充
上一章中关于 Docker 的内容相对偏多,如果对 Docker 还不太熟悉,可以先用下面这个最简单的验证与补救方法。
在终端中输入:
docker -v- 如果 Docker 已正确安装,会直接输出版本号
- 如果 Docker 未安装,系统通常会提示找不到该命令,并在输出中给出一行类似:
sudo apt install "xxx"此时只需要将提示中的整行命令复制并执行即可完成安装。
这种方式虽然不是官方推荐的安装路径,但对于只是想快速用起来、验证环境是否可用的用户来说已经足够,后续也不影响正常使用 Docker。
确认能够正常输出版本号后,就可以继续进行后面的 Docker 容器部署内容了。
(可选)在有多块硬盘的情况下,格式化硬盘并挂载
下面按实际可操作流程说明:在 Linux / Ubuntu Server 下,多块硬盘如何识别 → 格式化 → 挂载。不涉及 GUI,适合服务器环境。
一、识别所有硬盘与分区(非常重要)
先确认 哪块盘是哪块盘,避免误操作。
lsblk常见输出示例:
NAME SIZE TYPE MOUNTPOINT
sda 256G disk
├─sda1 512M part /boot/efi
├─sda2 1G part /boot
└─sda3 254G part /
sdb 4T disk
sdc 8T disk
说明:
sda:系统盘(不要动)sdb / sdc:额外数据盘(通常是需要格式化和挂载的)
如果想看得更清楚(型号、接口):
sudo lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL二、给硬盘分区(新盘 / 空盘)
如果整块盘打算只用一个分区,可直接全盘一个分区
以 /dev/sdb 为例(请自行替换):
sudo fdisk /dev/sdb常用操作流程:
g→ 创建 GPT 分区表(大于 2TB 必须)n→ 新建分区- 分区号:回车
- 起始扇区:回车
- 结束扇区:回车(使用整块盘)
w→ 写入并退出
完成后刷新分区表:
sudo partprobe确认分区生成(例如 /dev/sdb1):
lsblk三、格式化分区(推荐 ext4)
以 /dev/sdb1 为例:
sudo mkfs.ext4 /dev/sdb1常见可选格式:
ext4:通用、稳定(强烈推荐)xfs:适合大文件、NAS 场景btrfs:高级玩法,不建议新手
四、创建挂载目录
建议统一放在 /mnt 或 /data 下,例如:
sudo mkdir -p /data/disk1五、临时挂载(立即生效,重启失效)
sudo mount /dev/sdb1 /data/disk1验证:
df -h如果能看到 /data/disk1,说明挂载成功。
第六步:配置 /etc/fstab(永久挂载)
1️⃣ 获取 sdb1 的 UUID(必须)
sudo blkid /dev/sdb1你会看到类似输出:
/dev/sdb1: UUID="1234abcd-5678-efgh-90ab-cdef12345678" TYPE="ext4"
👉 把这个 UUID 原样复制下来,下面要用。
2️⃣ 规划挂载点(推荐方案)
为了后续 Docker / 下载数据结构清晰,我建议你这样规划:
- 整块数据盘挂载到:
/data - Docker 下载、缓存等数据放在:
/data/docker - 普通大文件、影视、杂项:
/data/storage//data/media(以后再建)
你说的“文件夹”,在 Linux 里叫 目录(directory),和 Windows 的文件夹是同一个概念,你可以完全按“文件夹”来理解。
先创建挂载点:
sudo mkdir -p /data3️⃣ 编辑 /etc/fstab
sudo nano /etc/fstab在文件最后一行加入:
UUID=1234abcd-5678-efgh-90ab-cdef12345678 /data ext4 defaults,noatime 0 2- UUID 一定要换成你自己的
- 不要多空格、不要换行错位
参数解释(给你吃个定心丸):
defaults:标准挂载参数noatime:减少磁盘写入,对机械盘友好0:不参与 dump2:非系统盘 fsck 顺序
4️⃣ 验证 fstab(这一步不能跳过)
sudo mount -a- 没有任何输出 = 正常
- 有报错 → 立刻停下并按照输出解决问题,别重启
确认是否挂载成功:
df -h你应该能看到类似:
/dev/sdb1 458G ... /data
到这里,硬盘已经安全、永久挂载完成。
第七步:在数据盘内创建“文件夹”(目录)
现在你要做的只是在 /data 里建目录,不涉及 Docker 本身。
1️⃣ 创建 Docker 数据目录
sudo mkdir -p /data/docker你可以理解为:
“在大容量盘里新建一个文件夹,专门给 Docker 放下载内容用”
2️⃣ 设置目录权限(非常关键)
为了以后 Docker、qB、普通用户都不折腾权限,先把所有权交给你当前用户:
sudo chown -R $USER:$USER /data验证:
ls -ld /data /data/docker应显示为你的用户名。
到目前为止,你已经完成了什么?
✔ sdb 整盘作为一个大容量数据盘
✔ 永久挂载到 /data
✔ 结构清晰、不会影响系统盘
✔ 为 Docker 留好了专用目录但未动 Docker 本身
✔ 重启不丢、不炸、不进 emergency mode
(可选)进一步配置(机械)硬盘(——自动启停)
因为机械盘一直响会比较吵,我们得想个办法让它不那么吵。
最安全、最推荐的方法:hdparm 省电策略
1️⃣ 临时测试(立刻生效,重启失效)
sudo hdparm -B 127 -S 120 /dev/sdb
含义:
-B 127:启用温和的 Advanced Power Management(不频繁抖头)-S 120:10 分钟无访问后停转
-S的单位是特殊编码:
120 × 5 秒 = 600 秒 = 10 分钟
如果你发现:
- 噪音明显下降
- 没有频繁“转-停-转”
说明这个方案适合你。
2️⃣ 写成永久规则(推荐)
安装 udev 规则支持:
sudo apt install -y hdparm
编辑配置:
sudo nano /etc/hdparm.conf
在末尾添加:
/dev/sdb {
apm = 127
spindown_time = 120
}
保存后重启,或手动应用:
sudo systemctl restart udev
Docker 日志设置
1️⃣ Docker 默认日志行为
json-file- 每条容器输出都会写文件
- 没有限制 = 无限小写入
2️⃣ 最小侵入的优化(不动容器)
创建 / 修改 Docker 配置:
sudo nano /etc/docker/daemon.json
写入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "1"
}
}
然后:
sudo systemctl restart docker
这会:
- 减少日志滚动频率
- 避免高频写盘
初步使用docker(qBittorrent)
那么目前所有准备工作都已完毕,我们可以开始正式使用docker了。
让我们先来部署一个qBittorrent练练手。
目标:
✔ 使用 Docker 部署 qBittorrent
✔ Docker 运行仍在sda
✔ 下载数据存放在/data(机械盘 sdb)
✔ 尽量减少机械盘噪音
✔ 方案稳、清晰、可回滚
一、整体结构(先建立正确认知)
你最终会得到这样的结构:
/data
├── qb
│ ├── config ← qB 配置(小量写入)
│ ├── downloads ← 已完成下载(机械盘)
│ ├── incomplete ← 未完成下载(可选:后面可迁移)
- qB 程序:Docker 容器(在 sda)
- 下载结果:
/data/qb/downloads(sdb) - Web 管理:浏览器访问
二、创建目录(只做一次)
sudo mkdir -p /data/qb/{config,downloads,incomplete}
sudo chown -R $USER:$USER /data/qb你可以把它理解为:
“在大容量盘里新建一个qb文件夹,里面再分三个子文件夹”
三、选择镜像(稳定、主流)
这里我明确推荐 LinuxServer 团队的镜像:
lscr.io/linuxserver/qbittorrent
理由:
- 更新稳定
- 权限模型清晰(PUID / PGID)
- 文档规范
四、部署方式(推荐 docker compose)
1️⃣ 新建 compose 文件
mkdir -p ~/docker/qbittorrent
cd ~/docker/qbittorrent
nano docker-compose.yml2️⃣ 写入以下内容(可直接复制)
version: "3.8"
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- WEBUI_PORT=8080
volumes:
- /data/qb/config:/config
- /data/qb/downloads:/downloads
- /data/qb/incomplete:/incomplete
ports:
- 8080:8080
- 6881:6881
- 6881:6881/udp
restart: unless-stopped3️⃣ 关键参数解释(重要)
PUID/PGID=1000- 对应你当前用户(
id $USER可验证)
- 对应你当前用户(
/downloads- 最终下载目录(机械盘)
/incomplete- 未完成下载目录
restart: unless-stopped- 开机自启,但不死循环
五、启动 qBittorrent
docker compose up -d查看状态:
docker ps六、访问 Web UI
浏览器访问:
http://服务器IP:8080
默认账号密码(第一次)
- 用户名:
admin - 密码:
查看容器日志获取:
docker logs qbittorrent | grep password登录后第一件事建议改密码。
七、关键配置(直接关系到“吵不吵”)
进入 Web UI → 设置
1️⃣ 下载目录(确认)
-
默认保存路径:
/downloads -
未完成 Torrent 保存路径:
/incomplete -
勾选:下载完成后移动文件
2️⃣ 降低磁盘噪音(非常重要)
✅ 启用内存缓存
- 磁盘缓存:
512 MB(或自动) - 勾选:使用异步 I/O
- 勾选:启用 OS 缓存
❌ 不要勾选
- “每次写入立即刷新到磁盘”
3️⃣ 文件预分配
- 文件预分配方式:
稀疏文件(Sparse)
👉 机械盘友好,避免长时间“狂响”
八、验证:机械盘是否还在“乱响”
1️⃣ 观察 IO
sudo iotop -o- 空闲时应基本无 IO
- 下载时有 IO 是正常的
- 没有 iotop 可以安装一下
2️⃣ 查看是否能休眠
sudo hdparm -C /dev/sdb理想状态:
- 空闲 →
standby - 下载 →
active
注意事项:
如果你像我一样遇到这样的报错:
WARN[0000] /home/lluosu/docker/qbittorrent/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
unable to get image 'lscr.io/linuxserver/qbittorrent:latest': permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/images/lscr.io/linuxserver/qbittorrent:latest/json": dial unix /var/run/docker.sock: connect: permission denied
别担心,让我们分析一下
一、version is obsolete ——只是警告,不是错误
the attribute `version` is obsolete, it will be ignored
这句话是什么意思?
-
你现在用的是 Docker Compose V2(
docker compose) -
V2 已经不再需要
version:字段 -
Docker 明确告诉你:
我会忽略它,但你最好删掉
处理方式(可选,但建议)
编辑你的 docker-compose.yml:
nano /home/lluosu/docker/qbittorrent/docker-compose.yml
把这一行删掉即可:
version: "3.8"
删不删都不影响运行,只是让文件更“干净”。
二、真正的问题:Docker 权限不足(核心问题)
错误原文
permission denied while trying to connect to the Docker daemon socket
connect: permission denied
这句话的准确含义是:
当前用户
lluosu没有权限访问 Docker 守护进程
也就是说:
- Docker 已经安装
- Docker 服务正在运行
- 但你这个用户 不在 docker 用户组里(或权限未生效)
三、最直接的验证方式(你可以先看一眼)
groups
如果输出里 没有 docker,那就是原因。
四、修复方案(推荐做法)
1️⃣ 把当前用户加入 docker 组
sudo usermod -aG docker $USER
- 这一步不会立刻生效
- Linux 的用户组是在登录时加载的
2️⃣ 让权限立刻生效(二选一)
✅ 方式 A(推荐,最干净)
重新登录 SSH / 重新开一个终端
然后再试:
cd ~/docker/qbittorrent
docker ps
如果不报错,说明成功。
⚠️ 方式 B(临时生效,不如 A 干净)
newgrp docker
这个会:
- 临时切换当前 shell 到 docker 组
- 关闭终端后失效
五、验证 Docker 是否可用(必须)
docker version
docker ps
只要不再出现 permission denied,就说明问题解决。
六、重新启动 qB 容器
回到 qB 目录:
cd /home/lluosu/docker/qbittorrent
docker compose up -d
然后检查:
docker ps
你应该能看到:
qbittorrent lscr.io/linuxserver/qbittorrent Up ...
七、如果你现在就想“先跑起来”(不推荐长期)
你也可以用 sudo 直接跑(不建议作为习惯):
sudo docker compose up -d
这只是为了验证环境,不是最终方案。
八、一句话总结
- ❌ 不是镜像问题
- ❌ 不是 compose 写错
- ❌ 不是硬盘 / 路径问题
✔ 只是 Linux 权限模型在起作用
✔ 加入 docker 组即可
✔ 属于“第一次用 Docker 必踩坑”