使用 Overlay fs 在 Raspberry Pi4 上运行 Docker

i v*_* vk 3 readonly docker docker-compose raspberry-pi4

我更喜欢创建一种情况,其中 Raspberry Pi4 Docker 正在运行,而 SD 卡是只读的。这与覆盖 fs 一起。

\n

在docker容器中,数据库正在运行,数据库的数据被写入USB记忆棒(卷映射)。

\n

当overlayfs被激活时(重启后,通过\xe2\x80\x9csudo raspi-config\xe2\x80\x9d启用),docker将不再启动。

\n

https://docs.docker.com/storage/storagedriver/overlayfs-driver/上的步骤\n系统信息:\nLinux raspberrypi 5.10.63-v8+ #1488 SMP PREEMPT Thu Nov 18 16:16:16 GMT 2021 aarch64 GNU/ Linux

\n

码头工人信息:

\n
pi@raspberrypi:~ $ docker info\nClient:\nContext:    default\nDebug Mode: false\nPlugins:\n  app: Docker App (Docker Inc., v0.9.1-beta3)\n  buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)\nServer:\nContainers: 1\n  Running: 1\n  Paused: 0\n  Stopped: 0\nImages: 1\nServer Version: 20.10.11\nStorage Driver: overlay2\n  Backing Filesystem: extfs\n  Supports d_type: true\n  Native Overlay Diff: true\n  userxattr: false\n\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

重启后docker状态:

\n
pi@raspberrypi:~ $ sudo systemctl status docker.*\nWarning: The unit file, source configuration file or drop-ins of docker.service changed on disk. Run \'systemctl daemon-reload\' to reload units.\n\xe2\x97\x8f docker.socket - Docker Socket for the API\n     Loaded: loaded (/lib/systemd/system/docker.socket; enabled; vendor preset: enabled)\n     Active: failed (Result: service-start-limit-hit) since Thu 2021-12-09 14:30:43 GMT; 1h 13min ago\n   Triggers: \xe2\x97\x8f docker.service\n     Listen: /run/docker.sock (Stream)\n        CPU: 2ms\nDec 09 14:30:36 raspberrypi systemd[1]: Starting Docker Socket for the API.\nDec 09 14:30:36 raspberrypi systemd[1]: Listening on Docker Socket for the API.\nDec 09 14:30:43 raspberrypi systemd[1]: docker.socket: Failed with result \'service-start-limit-hit\'\n\xe2\x97\x8f docker.service - Docker Application Container Engine\n     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)\n     Active: failed (Result: exit-code) since Thu 2021-12-09 14:30:43 GMT; 1h 13min ago\nTriggeredBy: \xe2\x97\x8f docker.socket\n       Docs: https://docs.docker.com\n   Main PID: 992 (code=exited, status=1/FAILURE)\n        CPU: 162ms\nDec 09 14:30:43 raspberrypi systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.\nDec 09 14:30:43 raspberrypi systemd[1]: Stopped Docker Application Container Engine.\nDec 09 14:30:43 raspberrypi systemd[1]: docker.service: Start request repeated too quickly.\nDec 09 14:30:43 raspberrypi systemd[1]: docker.service: Failed with result \'exit-code\'.\nDec 09 14:30:43 raspberrypi systemd[1]: Failed to start Docker Application Container Engine.\n
Run Code Online (Sandbox Code Playgroud)\n

使用附加的覆盖标志运行 docker.service 中给出的命令

\n
pi@raspberrypi:~ $ sudo /usr/bin/dockerd --storage-driver=overlay  -H fd:// --containerd=/run/containerd/containerd.sock\nunable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: storage-driver: (from flag: overlay, from file: overlay2)\npi@raspberrypi:~ $ sudo /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\nINFO[2021-12-09T14:34:31.667296985Z] Starting up\nfailed to load listeners: no sockets found via socket activation: make sure the service was started by systemd\n
Run Code Online (Sandbox Code Playgroud)\n

我缺少哪些步骤才能使用覆盖文件系统运行 Docker,以便 Raspberry 中的 SD 卡是只读的?

\n

如果没有激活覆盖文件系统,一切都会按预期工作。

\n

asm*_*asm 5

我也遇到了这个问题并找到了解决方法。总之,您无法overlay2在overlayfs 上运行默认的Docker FS 驱动程序( )。幸运的是,Docker 支持其他存储驱动程序,包括fuse-overlayfs. 切换到此驱动程序可以解决该问题,但还有最后一个问题。当 Docker 启动时,它会尝试重命名/var/lib/docker/runtimes,由于 overlayfs 不支持重命名已位于较低层的目录,因此会失败。如果您rm -rf在 Docker 停止时且在启用 RPi 的 Overlayfs 之前仅使用此目录,则一切都应该正常。