Docker+ownCloudのデータ保存パスを引っ越しした
Docker 用のディレクトリを専用ディスク上に引っ越ししてみた。
これまでのあらすじ
前回の記事で、 Docker Compose を使い ownCloud を構築した。
この記事ではデータボリュームコンテナを使い、 ポータブルな ownCloud 環境をつくりあげることに成功した。
さらに、ホストPCにマウントしてある巨大なストレージ /house
を用意し、
外部ストレージとして ownCloud から利用できるようにした。
外部ストレージがコンテナから見えるように、Docker のボリューム機能を使った。
で、この環境はおおむね期待通りに動いたが、一つの大きな問題により、 あまり役に立っていなかった。
問題点と方針
Docker 本体のデータが保存されたディスクが容量一杯になると、 せっかく潤沢な容量を持つ外部ストレージがあっても、 そこへファイルをアップをアップロードできない。
Docker のデータボリュームコンテナは自動的に、 /var/lib/docker
配下に作成される。
Docker 上で動く ownCloud 本体の作業が行われるディレクトリも同じ場所である。
だから、ownCloud にファイルをアップロードするときには、 このディレクトリが属するディスクの残容量のチェックが入るし、 ファイル削除時にファイルが移動されるゴミ箱も同じディスク上になってしまう。
今回のサーバでは、/var
を、 ルート(/
) と共用で容量は 10 GB しか無い。
これは、ownCloud にアップロードできるファイルサイズは 10 GB を超えることができないことになってしまう。
ということで、/var/lib/docker
をもっと容量のあるディスクに引越しすることにした。
とは言ったものの、データボリュームコンテナが使うパスの変更は容易で無さそうだったため、少し大きなディスクを用意して /var/lib/docker
にマウントすることにした。
Docker 用パーティションの用意
Docker が使う /var/lib/docker
に専用のパーティションを割り当てることにする。
今回 /dev/sdc1
が空いていたので、そいつをDocker 用のパーティションにすることにした。これも容量 200 GB しか無いが、まあ作業ディレクトリとしては十分な大きさと言えるだろう。
ext4
のファイルシステムを作成する。ext4
にしたのは、なんとなく。
[root@fg-arch server]# mkfs.ext4 /dev/sdc1
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 48839985 4k blocks and 12214272 inodes
Filesystem UUID: 80ce0f6d-71f2-458f-895a-21fd49943f55
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
fstab に書き込んで簡単にマウントできるようにする。
先に /dev/sdc1
の UUID を調べておき、
それを指定して /var/lib/docker
へマウントするようにした。
[root@fg-arch server]# ls -l /dev/disk/by-uuid | grep sdc1
lrwxrwxrwx 1 root root 10 Apr 10 04:32 80ce0f6d-71f2-458f-895a-21fd49943f55 -> ../../sdc1
[root@fg-arch server]# echo "UUID=80ce0f6d-71f2-458f-895a-21fd49943f55 /var/lib/docker ext4 rw,relatime,data=ordered0 0" >> /etc/fstab
さっそくマウントしたいところだが、
既存の /var/lib/docker
のデータを回収しなければならない。
Docker ディレクトリの用意
まずは、既存ファイルをバックアップする。
[root@fg-arch ~]# cd /var/lib/
[root@fg-arch lib]# mv docker docker_bak
それから、新しいマウントポイントにさっき作ったパーティションをマウントする。
[root@fg-arch server]# mkdir docker
[root@fg-arch server]# mount /var/lib/docker/
そしてバックアップしておいたデータをコピー。
[root@fg-arch server]# cp -a /var/lib/docker_bak/* /var/lib/docker/
Docker デーモンの起動
うまくできていれば起動できるはず。
[root@fg-arch server]# systemctl start docker
おまけ
はじめは btrfs 上のサブボリュームを /var/lib/docker
にしようとしたんだけど、
Overlay2 は btrfs 上で使えない的なエラーが出たので素直に諦めた。
overlay2 is not supported over btrfs
そこまでの手順をここにメモしておく。
btrfs の状態確認
house
というラベルがついたファイルシステムが、5個のディスクで組まれている。
/dev/sdc1
がまったく仕事をしていないので、こいつを Docker 用にしようと思った。
[root@fg-arch server]# btrfs filesystem show
Label: 'house' uuid: 962205ef-673e-4b93-be7e-58bd23d68095
Total devices 5 FS bytes used 2.30TiB
devid 1 size 2.61TiB used 1.07TiB path /dev/sda5
devid 2 size 2.73TiB used 1.16TiB path /dev/sdb1
devid 3 size 186.31GiB used 0.00B path /dev/sdc1
devid 4 size 2.73TiB used 1.19TiB path /dev/sdd1
devid 5 size 2.73TiB used 1.19TiB path /dev/sde1
/dev/sdc1
は下のようにして取り外した。
[root@fg-arch server]# mount /dev/sda5 /mnt
[root@fg-arch server]# btrfs device delete /dev/sdc1 /mnt
[root@fg-arch server]# btrfs filesystem show
Label: 'house' uuid: 962205ef-673e-4b93-be7e-58bd23d68095
Total devices 4 FS bytes used 2.30TiB
devid 1 size 2.61TiB used 1.07TiB path /dev/sda5
devid 2 size 2.73TiB used 1.16TiB path /dev/sdb1
devid 4 size 2.73TiB used 1.19TiB path /dev/sdd1
devid 5 size 2.73TiB used 1.19TiB path /dev/sde1