Dockerのデータディレクトリを別のボリュームに移す方法 – docker-ceのupgradeで泣いた

Dockerのデータディレクトリを別のボリュームに移す方法 – docker-ceのupgradeで泣いた

Dockerのデータディレクトリは、デフォルトだと/var/lib/dockerが使われます。
私はいつも/var/lib/dockerではなく別のディスクボリューム等の容量に余裕があるところに移して使用しています。

別ディレクトリに移す方法は検索すれば大量に出てくるのですが、docker.serviceのExecStartにオプションを追加して変更するという方法が一般的だと思います。
やり方はこうです。

まずはdockerを停止します

sudo systemctl stop docker

/lib/systemd/system/docker.service を以下のように書き換えます。
もちろんExecStartの部分に直接オプションを記述しても良いのですが、外部ファイルの/etc/default/dockerに逃がすのが通例のようです。

[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
# デフォルトのExecStartは以下
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

/etc/default/dockerはこんな感じです(必要箇所以外は記載していませんが長々と書かれています)
/mnt/ssd/dockerの部分がデータディレクトリの移動先です
よく他のサイト等で紹介されている書き方とは若干異なります。(理由は後述します)

DOCKER_OPTS="--data-root /mnt/ssd/docker"

あとはdaemon-reloadを行ってから、dockerを起動します

sudo systemctl daemon-reload
sudo systemctl start docker

docker-ceのupgradeで泣いた話

docker-ceのupgradeが出ていたので何も考えず安易に更新しました。
するとどうでしょう。なんとDockerの中身が空っぽに!imageも全くありません。

勘の良いかたはお気づきですね。
ExecStartで外部ファイルを読むように変更したのはdocker.serviceなので、アップグレードによりこいつが上書きされて外部ファイルを読まないデフォルト状態になっていました。

データディレクトリが古いままのもので繋がるのか若干不安はありましたが、docker.serviceを書き換えてdaemon-reloadしてstart…エラーです。

sudo journalctl -u docker.service

でログを確認すると、

Flag --graph has been deprecated, Use --data-root instead

ということで、$DOCKER_OPTSの内容に問題があるようです。
ログ確認大事。
docker-ce -gオプション(--graph)廃止 ログ

これが後述しますと記載した部分で、よく他のサイト等で紹介されている方法は、

DOCKER_OPTS="-g /mnt/ssd/docker"

と-gオプションが使われています。
以前はこの-gオプション(–graphオプション)を使うのが主流でしたが、新バージョンではdeprecateされており–data-rootオプションを使う必要があります。

ということで、冒頭に書いた方法のように修正し、無事起動し以前のデータにアクセスすることができました。
こんなことになるとは思っておらず、起動しなかった時は結構焦りましたよ。

これ、単純にコピーしてシンボリックリンクじゃダメよって書いてるサイトが多くてこうした記憶があるのだけど、なんでダメなんだっけ。
シンボリックリンクだったらアップグレードかけても問題なく使えるはずでは。

Dockerのデータディレクトリを別のボリュームに移す方法 – docker-ceのupgradeで泣いたにコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です