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_OPTS="-g /mnt/ssd/docker"
と-gオプションが使われています。
以前はこの-gオプション(–graphオプション)を使うのが主流でしたが、新バージョンではdeprecateされており–data-rootオプションを使う必要があります。
ということで、冒頭に書いた方法のように修正し、無事起動し以前のデータにアクセスすることができました。
こんなことになるとは思っておらず、起動しなかった時は結構焦りましたよ。
これ、単純にコピーしてシンボリックリンクじゃダメよって書いてるサイトが多くてこうした記憶があるのだけど、なんでダメなんだっけ。
シンボリックリンクだったらアップグレードかけても問題なく使えるはずでは。