群晖的 docker 相关操作
说明:
我的测试都是在 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 安全模块,但在群晖系统中可能没有正确配置或不需要。我们有两种解决方案:
- 在 compose 文件里添下下面的参数
version: '3'
services:
your-service:
security_opt:
- apparmor=unconfined
- 在系统配置里修改
echo 0 > /sys/module/apparmor/parameters/enabled
docker 命令不存在
群晖的 docker 命令不在正常的路径下,可以自己做个软链接。
ln -s /var/packages/ContainerManager/target/usr/bin/docker .
Read other posts