Dockerイメージの格納場所を変更する方法
Dockerイメージによるディスク容量の逼迫
ある日Dockerイメージをpullしたら突然の警告。
デバイスに空き領域がありません
容量にまだ余裕あるはずなのになんで?と思ったら、Dockerは /var/lib/docker
以下にイメージなどを格納しているようです。なので/
(スラルート)の容量を少なめに確保していると、大きいDockerイメージをいくつもダウンロードすると容量がパンパンになってしまうようです。
私は/
に100GBしか確保していなかったため、容量が枯渇指定しまいました。
保存場所を変えるのが常套手段みたいです。ネット調べても出てきますが、一応自分のメモとして残しておきます。
Dockerイメージの格納場所を変える方法
私の場合は~/docker(/home/<username>/docker)
以下に移動しました。
別ディスクなどにする場合は、各自読み替えてください。
Dockerを停止してファイルコピー
以下コマンド実行します。ちなみにこれだと ~/docker/docker
とちょっと間抜けな感じになります(後で気づきました)。
$ sudo systemctl stop docker
$ cd && mkdir docker
$ sudo cp -ar /var/lib/docker docker/
Dockerサービスのオプションを編集
以下Vimで編集する場合のコマンドです。
$ sudo vim /lib/systemd/system/docker.service
ExecStart
に以下のように-g
オプションを追記してください。
<username>
は自分のユーザー名(ホームディレクトリ名)をいれてください。
変更前
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
変更後
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -g /home/<username>/docker/docker
注:新しいDockerバージョンだと、以下のように-g
オプションを--data-root
オプションにする必要があるようです。コメントで教えていただきました。ありがとうございます。
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root /home/<username>/docker/docker
注:サービスのオプションを変更する以外に、/etc/docker/daemon.json
を変更する方法もあるようです(後で教えていただきました)。以下ページ参照ください(私は試せていません)。
参考:docker image保存先を外部ストレージに変更する
Dockerサービスのリロードと再起動
以下コマンド実行します。可能なら再起動しておくのがベターです。
$ sudo systemctl daemon-reload
$ sudo systemctl start docker
イメージの確認
とりあえずDockerイメージを確認します。
$ docker images
以下は表示例です。
REPOSITORY TAG IMAGE ID CREATED SIZE
nvcr.io/nvidia/tensorflow 20.03-tf1-py3 8b2abbd886f0 22 months ago 9.51GB
nvcr.io/nvidia/tensorflow 20.03-tf2-py3 9af3e368023b 22 months ago 7.44GB
動作確認
適当なDockerイメージをpullして移行先のdocker
ディレクトリの容量が増えているか確認します。
$ cd
$ sudo du -s docker
53376496 docker
$ docker pull centos
$ sudo du -s docker
53627380 docker
ちょっと容量が増えているので、ちゃんとディレクトリが移行できているのがわかります。
もとのディレクトリ削除
もとのディレクトリは、不要なら以下のコマンドで削除しておくと容量節約できます。
$ sudo rm -rf /var/lib/docker
まとめ
Dockerイメージの格納場所の変更方法に関して記載しました。
参考リンク
Discussion
保存先を
とすると、
というwarningで sudo systemctl start dockerが失敗するので、エラーで言われている通り、
と直すと動きました。
@shmpwk さん
ありがとうございます!試してから返信しようかと思いましたが、なかなか時間がとれず。
記事中に、注記として追記させていただきました!