Docker:是否可以使用重叠的后备文件系统?

时间:2016-09-29 16:29:00

标签: docker raspberry-pi tmpfs

我想控制docker是在持久性存储上运行,还是在使用易失性存储器覆盖的持久性存储上运行。

这是因为我在SD卡(Raspberry Pi)上有文件系统,它需要持续很长时间。我主要想在一个只读文件系统(ext4)上运行tmpfs(在其上运行容器),但当我检测到更新可用时,我想卸载overlayfs,将文件系统切换为读写,更新映像,然后将所有内容切换回tmpfs-overlayed只读文件系统。

# mv /var/lib/docker /var/lib/docker~
# mkdir -p /var/lib/docker /tmp/docker /tmp/work
# mount -t overlay -o lowerdir=/var/lib/docker~,upperdir=/tmp/docker,workdir=/tmp/work overlay /var/lib/docker
# docker daemon --storage-driver devicemapper

我尝试了两个存储驱动程序: overlay2 devicemapper (循环)。前者拒绝在overlayfs底层文件系统上工作(文档中也提到它不受支持),后者消耗我所有的内存然后Docker被操作系统杀死。 Raspberry Pi和我的PC的行为是一样的。

唯一应该工作的存储是 vfs ,但是从我读过的内容来看,它的存储效率非常低(没有Copy-on-Write),所以对我来说没用。

现在我尝试使用aufs存储驱动程序和overlayfs支持文件系统(Docker文档没有声明它被禁用)。我希望它能工作,但它有一些缺点:主线Linux内核不支持aufs。

还有其他方法在两个文件系统之间切换吗?或者SD卡的保存是否可以通过一些完全不同的方式完成(例如,运行内存容器)?

1 个答案:

答案 0 :(得分:0)

编辑:抱歉,这最终不工作!!! 。 Docker守护程序启动但无法创建容器。这是错误:

Handler for POST /v1.24/containers/create returned error: error creating aufs mount to /var/lib/docker/aufs/mnt c549130a63857658f8675fd84296afae46293a9f7ae54e9ee04e83c231db600f-init: invalid argument

带覆盖文件的aufs存储驱动程序支持文件系统工作。现在它似乎是唯一的选择,但是我对解决方案不满意,因为它看起来像是对我的黑客,因为aufs不在主线内核中所以我需要自己编译内核。

这就是我的做法(这是一个非常黑客,请建议我做得更好):

  • 在我的电脑上:

    $ git clone https://github.com/p4l1ly/rpi-kernel
    $ cd rpi-kernel
    $ vagrant up
    

    ......等了很长时间......

    $ vagrant ssh
        $ cp /var/kernel_build/results/kernel-20161003-100112/rpi2_3/kernel7.img /vagrant/
        $ exit
    $ sudo cp kernel7.img /mnt
    
  • 然后在SD卡上:

    # mv /var/lib/docker /var/lib/docker~
    # mkdir -p /var/lib/docker /tmp/docker /tmp/work
    # mount -t overlay -o lowerdir=/var/lib/docker~,upperdir=/tmp/docker,workdir=/tmp/work overlay /var/lib/docker
    # docker daemon --storage-driver aufs