2018/07/22

Docker Registry の backup と restore

前回は Image の Backup/Restore について書きました。
これで Image を指定してバックアップ可能になったのですが、Registry に登録される Image が1つとは限らない。
ということで Docker Registry ごと全イメージをバックアップしてみる。


環境

  • OS: CentOS Linux release 7.4.1708 (Core)
  • Docker: version 1.13.1, build 774336d/1.13.1
  • Kernel: 3.10.0-693.5.2.el7.x86_64


Docker Registry を tar にする

さて、Registry はコンテナ内部に登録イメージのファイルを持ってます。
ファイルごとバックアップを取りたいので、戦略としてはコンテナのバックアップを取る。
今度使うのは docker export コマンド

  • $ docker run -d -p 5000:5000 --name registry registry:latest
  • $ docker push hogehoge
  • $ docker export registry > registry-backup.tar
これで Registry のコンテナが tar ファイルになります。


Docker Registry を復元する

さて、 tar ファイルから復元したいと思います。
  • $ docker import - registry:latest < registry-backup.tar
今回はタグの情報とかは無いので自分で指定する。
というかコンテナからイメージを作るので実質 docker commit みたいなものか。

tar から作られた registry:latest を実行します。
  • $ docker run -d -p 5000:5000 --name registry registry:latest
お? 動かない。 
/usr/bin/docker-current: Error response from daemon: No command specified.
と言ってくる。CMD の情報が吹っ飛んでるのか。
Github にある Registry の Dockerfile を見ると、'docker-registry' とすれば良いかな。
  • $ docker run -d -p 5000:5000 --name registry registry:latest docker-registry
動かない。今度は
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"docker-registry\": executable file not found in $PATH
か。そんなコマンドは無いらしい。 
もうコンテナ内に入ってしまうかな。export 前の registry に対して
  • $ docker exec -it registry bash
すると
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"bash\": executable file not found in $PATH"
おお、bash すら無いのか。sh も無ければ最早 user interactive に何もできないコンテナだ。

  • $ docker exec -it registry sh
流石に sh はありました。find もある。
find で docker-registry を探しても無い。
他に探索していると registry というのが /bin/registry にあった。
実行すると serve か garbage-collect と help がサブコマンドにある。serve してみます。
  • $ registry serve
文句言ってきました。具体的には
configuration error: configuration path unspecified
と。 docker-registry の configuration path って何だろう。
どこかに mount してたらそれを参照してくれるから設定変更可能、とかそういう意図なんだろうか。

とかとか、いろいろ試した結果、ps で path が分かりました。
Process ID 1 のやつが
registry serve /etc/docker/registry/config.yml
で動いていました。
と、いうことで、実行するコマンドは
$ docker run -d -p 5000:5000 --name registry registry:latest registry serve /etc/docker/registry/config.yml
で Import した Registry を復元できました。やったね。


おまけ

/etc/docker/registry/config.yml を読むと storage.filesystem.rootdirectory が /var/lib/registry
だったので、run する時に -v で /var/lib/registry に Host の Directory を mount しておけば Image の保存が楽だった説が。

それと、Docker EE だと、 DTR (Docekr Trusted Registry) の backup/restore 手順が提供されています
きちんとサポートを受けたい場合は Docker EE を使うのもアリかも。


参考

0 件のコメント:

コメントを投稿