やりたかったこと
1年半使ってきた Docker for mac のデータファイルが肥大化してきたので、開放できる領域を解放してデータファイルを縮小させます。但し、事前に コンテナイメージ と ボリュームを整理して、削除しておかないと効果がありません。
データファイルの場所は、Docker for Macの Preferences
の Advanced
タブにある Disk Image Location
に記載されています。
Open in Finder
をクリックすると、Finderで該当ディレクトリが表示され、ファイルサイズを見ると50GByteでした。このファイルを小さくします。
進め方
必要なものをバックアップした後に、 Remove all Data
で全てのデータを削除した後に復元します。バックアップを行うのは下の二つです。
- コンテナイメージ (
docker images
で表示されるもの) - ローカルボリューム(
docker volume ls
で表示されるもの)
docker-compose でコンテナを作るので、(docker ps -a
で表示される) コンテナはバックアップしません。
バックアップ
コンテナイメージをバックアップ
docker save
で丸っとバックアップします。 引数にコンテナ名を列挙することで複数のコンテナをファイルに書き出すことができます。
$ docker save -o all-images.tar $(docker images |awk '2<=NR{printf "%s:%s ",$1,$2}')
ローカルボリュームをバックアップ
docker volume
にはバックアップのコマンドがないので、任意のコンテナにマウントする必要があります。
dockerのデータボリュームとそのバックアップ方法 を参考にバックアップします。
#!/bin/bash
export now=`date '+%Y%m%d%H%M%S'`
for vol in $(docker volume ls | awk '2<=NR{print $2}'|grep -v '^[a-z0-9]\{64\}$')
do
backup_to="${vol}-${now}.tgz"
echo "backup volume ${vol} to ${backup_to}"
docker run --rm -v ${vol}:/volume -v `pwd`:/media busybox tar cfz /media/${backup_to} . -C /volume
done
ボリューム名にハッシュ値が使われているものは、除外します。
Remove all Data
Reset タブの Remove all Data
を実行すると、Dockerが停止し、データファイルが作り直されます。データファイルが作り直されることで、データの削除が行われます。
リストア
コンテナをリストア
docker load
でリストアします。
$ docker load -i all-images.tar
バックアップで作成した all-images.tar に入っている複数のイメージをリストアします。
データボリュームをリストア
ボリュームのバックアップしたファイル名には、ボリューム名とバックアップ日時が付与されているので、ボリューム名を取り出してリストアします。
#!/bin/bash
for f in $(ls *.tar.gz)
do
[[ ${f} =~ ^(.*)-([0-9]{14}).tar.gz$ ]]
volume_name=${BASH_REMATCH[1]}
echo restore image ${volume_name} from ${f}
docker volume create ${volume_name}
docker run --rm -v ${volume_name}:/volume -v `pwd`:/media busybox tar xvfz /media/${f} -C /media
done