2016-09-29 310 views
1

我想要控制docker是运行在永久性存储上还是运行在永久性存储上,并且覆盖一个易失性存储。Docker:是否可以使用覆盖支持文件系统?

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

# 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 

我尝试了两种存储驱动程序:overlay2devicemapper(循环)。前者拒绝使用overlayfs底层文件系统(在文档中也提到它不被支持),后者消耗我所有的内存,然后Docker被操作系统杀死。树莓派和我的电脑的行为是一样的。

应该工作的唯一存储是vfs,但从我所读到的,它存储非常低效(没有写时拷贝),所以它对我来说是没有用的。

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

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

回答

0

编辑:对不起,最后这个不工作!。 Docker守护进程启动但无法创建容器。这是错误:与overlayfs后盾文件系统工作

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不在mainline内核中,所以我需要自己编译内核。

这是我做的(这是相当一个黑客,请咨询我做的更好):

  • 我的电脑上:

    $ 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 
    
相关问题