如何在只读主机文件系统上运行docker守护程序

如何在只读主机文件系统上运行docker守护程序,docker,ubuntu,raspberry-pi,filesystems,Docker,Ubuntu,Raspberry Pi,Filesystems,我有一个Raspberry Pi 3在只读根分区上运行Ubuntu16.04.6 LTS。现在我尝试启动一个docker守护进程。但重启后,它说: ubuntu@z11:~$ docker info Client: Debug Mode: false Server: ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? errors pr

我有一个Raspberry Pi 3在只读根分区上运行Ubuntu16.04.6 LTS。现在我尝试启动一个docker守护进程。但重启后,它说:

ubuntu@z11:~$ docker info
Client:
 Debug Mode: false

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
尝试重新启动docker守护进程时,我得到:

ubuntu@z11:~$ sudo systemctl daemon-reload
ubuntu@z11:~$ sudo systemctl restart docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
这是
systemctl status docker.service的输出:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Thu 2016-02-11 17:28:26 CET; 14s ago
     Docs: https://docs.docker.com
  Process: 1620 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 1620 (code=exited, status=1/FAILURE)

Feb 11 17:28:24 z11 systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Feb 11 17:28:24 z11 systemd[1]: Failed to start Docker Application Container Engine.
Feb 11 17:28:24 z11 systemd[1]: docker.service: Unit entered failed state.
Feb 11 17:28:24 z11 systemd[1]: docker.service: Failed with result 'exit-code'.
Feb 11 17:28:26 z11 systemd[1]: docker.service: Service hold-off time over, scheduling restart.
Feb 11 17:28:26 z11 systemd[1]: Stopped Docker Application Container Engine.
Feb 11 17:28:26 z11 systemd[1]: docker.service: Start request repeated too quickly.
Feb 11 17:28:26 z11 systemd[1]: Failed to start Docker Application Container Engine.
Feb 11 17:28:26 z11 systemd[1]: docker.service: Unit entered failed state.
Feb 11 17:28:26 z11 systemd[1]: docker.service: Failed with result 'start-limit-hit'.
这是带有只读根分区和读写/var/lib/docker的my/etc/fstab:

proc            /proc                   proc    defaults                                     0 0
/dev/mmcblk0p1  /boot                   vfat    ro                                           0 0
/dev/mmcblk0p2  /                       ext4    noatime,ro                                   0 0
/dev/mmcblk0p3  none                    swap    sw                                           0 0
/dev/mmcblk0p4  /var/lib/docker         ext4    noatime,rw                                   0 0
tmpfs           /var/log                tmpfs   defaults,noatime,nosuid,mode=0755,size=50m   0 0
tmpfs           /var/log/apache2        tmpfs   defaults,noatime,size=10m                    0 0
tmpfs           /var/lib/sudo           tmpfs   defaults,noatime,nosuid,mode=0755,size=2m    0 0
tmpfs           /tmp                    tmpfs   defaults,noatime,mode=1777,size=30m          0 0
当将根分区从
ro
更改为
rw
时,docker在重新启动系统后运行良好

如何让it docker保持根分区为只读运行? docker还需要写入其他文件或目录吗?

显然,/run(aka/var/run)将用于打开套接字文件。Docker是一个系统守护进程,“Docker”命令只是将输入发送到套接字文件。基本上,您已经将/var的一些子目录挂载为rw,而不是/var/run

如果您想在持久性存储上使用/var/lib/docker,那么最好重新配置docker.service—可能需要检查/etc/sysconfig/docker并使其生效

DOCKER_OPTS="-g /data/docker"

我想知道你的
mount
结果是什么样的

我的情况和你的略有不同。 在我的例子中,我在根覆盖的文件系统上运行docker守护进程时遇到了同样的问题。 我希望我的解决方案也能帮助你或其他人

按照指导方针,, , docker无法在覆盖备份文件系统上运行。 但幸运的是,它可以在覆盖文件系统之上的tmpfs上运行

这是我的环境:

  • Ubuntu服务器19.10
  • 覆盆子皮4B
  • 使用overlayroot使根覆盖在只读文件系统上
我的解决方案是:

  • sudo挂载-t tmpfs tmpfs/var/lib/docker
    启动后(编辑的
    /etc/fstab
    可能不适用于overlayroot)
  • 使用sudo systemctl restart docker重新启动docker
  • 如果第2步失败,只需等待几秒钟,然后重试(第1步似乎无法立即工作)

    我还发现,如果重复步骤1两次以上,步骤2可以立即执行。抱歉,我无法解释原因。

    我需要添加此项

    tmpfs        /var/lib/docker tmpfs   nosuid,nodev         0       0
    tmpfs        /var/lib/containerd tmpfs   nosuid,nodev         0       0
    

    到/etc/fstab

    可以创建一个可写文件系统,并将其装载到
    /var/run
    上。通常,docker需要创建目录才能工作。@root/var/run链接到/run,它已经是一个具有rw访问权限的tmpfs:-/请提供“此服务无法重新启动太多次”错误消息之前的错误消息。尝试
    systemctl重置失败
    谢谢您的建议。但是/var/run链接到/run,后者已经是具有rw访问权限的tmpfs。因此,将这样一行添加到/etc/fstab没有帮助。(如前所述,系统甚至不会启动。)