前回は Image の Backup/Restore について書きました。
これで Image を指定してバックアップ可能になったのですが、Registry に登録される Image が1つとは限らない。
ということで Docker Registry ごと全イメージをバックアップしてみる。
これで 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 ファイルから復元したいと思います。
export と対象に docker import コマンドを使います。
- $ 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 件のコメント:
コメントを投稿