3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker for mac のデータファイルを縮小させたかった話

Last updated at Posted at 2018-01-02

やりたかったこと

1年半使ってきた Docker for mac のデータファイルが肥大化してきたので、開放できる領域を解放してデータファイルを縮小させます。但し、事前に コンテナイメージ と ボリュームを整理して、削除しておかないと効果がありません。

データファイルの場所は、Docker for Macの PreferencesAdvanced タブにある Disk Image Location に記載されています。
Docker for Mac の Advanced画面

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のデータボリュームとそのバックアップ方法 を参考にバックアップします。

volume-backup.sh
#!/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

Docker for Mac の Reset画面

Reset タブの Remove all Dataを実行すると、Dockerが停止し、データファイルが作り直されます。データファイルが作り直されることで、データの削除が行われます。

リストア

コンテナをリストア

docker load でリストアします。

$ docker load -i all-images.tar

バックアップで作成した all-images.tar に入っている複数のイメージをリストアします。

データボリュームをリストア

ボリュームのバックアップしたファイル名には、ボリューム名とバックアップ日時が付与されているので、ボリューム名を取り出してリストアします。

volume-restore.sh
#!/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

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?