说明:
我的测试都是在 DSM 7.2 上进行的,其余的版本可能有些区别

启动

群晖的 docker 启动不能简单的使用 systemctl start docker
目前我知道的命令下面这两个。

/usr/syno/bin/synosystemctl stop pkg-ContainerManager-dockerd

systemctl start pkg-ContainerManager-dockerd.service

我的理解是 synosystemctl 调用了 sytemctl。我使用 sytemctl 启动过一次 docker,但是启动后在套件中心的 ContainerManger 还是停止状态。所以后面我停止了又在套件中心启动的。没有验证是否套件中心启动就等于 synosystemctl 启动,但是可能是差不多的。所以操作 docker 还是建议使用 synosystemctl

docker 相关的二进制文件都在 /var/packages/ContainerManager/target/usr/bin/docker下。
使用 systemctl 启动的 docker 不用将 docker 命令加到 PATH 里。在套件里启动的会将 docker 命令放到 /usr/local/bin 里

普通用户免 sudo 使用 docker

# 添加用户组 docker
sudo synogroup --add docker
# 将当前用户加入 docker 用户组 
sudo synogroup --member docker $USER
# 修改 docker.sock 的权限
sudo chown root:docker /var/run/docker.sock

然后断开终端重连即可(不行就重启下 docker 服务)。

创建脚本目录(如果不存在)

mkdir -p /usr/local/etc/rc.d

创建启动脚本

群晖还是用 rc 管理的启动脚本,编辑 /usr/local/etc/rc.d/load_docker_modules.sh。

#!/bin/sh

case $1 in
        start)
                # 等待系统完全启动
                sleep 30
                
                # 加载必要的模块
                modprobe ip_tables
                modprobe iptable_nat
                modprobe iptable_filter
                modprobe x_tables
                
                # 重启 Docker 服务
                synoservice --restart pkgctl-Docker
                ;;
        stop)
                ;;
        *)
                ;;
esac

报错

docker 起来了,但是容器服务启动失败是为什么

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: unable to apply apparmor profile: apparmor failed to apply profile: write /proc/self/attr/exec: no such file or directory: unknown

这个错误是因为群晖的 DSM 7.2 中 AppArmor 的问题。AppArmor 是一个 Linux 安全模块,但在群晖系统中可能没有正确配置或不需要。我们有两种解决方案:

  1. 在 compose 文件里添下下面的参数
version: '3'
services:
  your-service:
    security_opt:
      - apparmor=unconfined
  1. 在系统配置里修改
echo 0 > /sys/module/apparmor/parameters/enabled

docker 命令不存在

群晖的 docker 命令不在正常的路径下,可以自己做个软链接。

ln -s /var/packages/ContainerManager/target/usr/bin/docker .