被 AppArmor 击杀的 Dockge

Debian 自从 Debian10 后开始默认启用了 AppArmor,这是另外一个和 SELinux 类似的 MAC(Mandatory Access Control) 实现,但他有更容易被人类所接受的配置颗粒度,并且由社区开发,而且很容易关掉(不推荐你关掉)

在默认情况下 Debian 的 AppArmor 运行情况是不会干扰用户的正常操作的,但是在有些时候他会突然给你一拳告诉你你不能这样做,这样违反了约束。


好吧,我遇到了。在 Debian13 上如果不去新增 AppArmor 配置就会无法运行 Dockge 这个还挺不错的 Compose 管理器。

除此之外,还有 lscr.io/linuxserver/qbittorrent 这个容器也受到了影响——可能更多,但我没有继续测试。

初探

我们通过命令 dmesg | rg apparmor | rg denied 得到了输出

1
2
3
4
5
6
[ 2661.149627] audit: type=1400 audit(1759760495.520:84): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15527 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
[ 2674.109757] audit: type=1400 audit(1759760508.479:85): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15712 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
[ 2699.872327] audit: type=1400 audit(1759760534.241:86): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=15897 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
[ 2751.237225] audit: type=1400 audit(1759760585.607:87): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16081 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
[ 2811.399220] audit: type=1400 audit(1759760645.767:88): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16269 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none
[ 2871.560585] audit: type=1400 audit(1759760705.928:89): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="docker-default" pid=16472 comm="node" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none

接下来诡异的事情来了:我没有在任何地方发现任何一个叫作 docker-default 的配置文件,完全不存在于标准的 /etc/apparmor.d/ 中:

1
2
➜  dockge ls /etc/apparmor.d/ | rg docker
➜ dockge

怎么办?

再探

我觉得这个问题的关键词应该是 Docker, AppArmor。于是我的第一反应是像 GPT 求助——很可惜它没有给我预期响应。

于是我直接使用搜索引擎进行搜索,第一项便是如下链接:

很好,这就是我想要的。但也不完全是,因为这里面没有说解决方案,相反给了个巨复杂的文件

再做搜寻,我看到了这个

他的解决方案是想办法让 Docker 不再动态生成 docker-default 这个配置。我觉得这个已经很接近我想要的答案了,但我觉得不够完美

终曲

我们现在得到了两个方案:

  • 调整 Docker 的安全配置
  • 关闭 AppArmor 对于 Docker 的管控

调整 Docker 的安全配置

我这里列出 compose.yml (也就是 docker-compose.yml 的高版本别名)中如何调整相关设定:

在修改之前:

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
dockge:
image: louislam/dockge:nightly
restart: unless-stopped
ports:
- 5001:5001
volumes:
- ./data:/app/data
- /pool/striping/dockge/stacks:/pool/striping/dockge/stacks
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DOCKGE_ENABLE_CONSOLE=true
- DOCKGE_STACKS_DIR=/pool/striping/dockge/stacks

在修改之后,请注意新添加的 security_opt 字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
dockge:
image: louislam/dockge:nightly
restart: unless-stopped
ports:
- 5001:5001
volumes:
- ./data:/app/data
- /pool/striping/dockge/stacks:/pool/striping/dockge/stacks
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DOCKGE_ENABLE_CONSOLE=true
- DOCKGE_STACKS_DIR=/pool/striping/dockge/stacks
security_opt:
- apparmor:unconfined

关闭 AppArmor 对于 Docker 的管控

TODO


被 AppArmor 击杀的 Dockge
https://blog.krysztal.dev/2025/10/12/被-AppArmor-击杀的-Dockge/
作者
Krysztal
发布于
2025年10月12日
许可协议