サムネイル画像

これは昨日の続きである。

昨日の内容を一言でまとめると、今後はDockerのコンテナもまるごとバックアップしていくことに決めた。

ではその具体はどうするのか。

今日一日を振り返ってみようと思う:

① コンテナのイメージを保存する(前提)

コンテナのベースイメージ+レイヤーをtarballの保存:

docker save -o backup.tar your-image-name:tag

tarballをもとに復元:

docker load -i backup.tar

――たしかにこの方法はコンテナを物理的に保存/復元としては正しいのかもしれないが、原始的すぎる。

私もハードディスクが云々とは言ったけれども、この方法自体は最後の手段としてはいつか使うことがあるかもしれないので残しておく。1

② Harborを築く

もともとカスタムレジストリはDockerが提供していたり、GitLabにも長らくレジストリを管理する仕組みは存在していた。

その傍らHarborというプロジェクトも存在していたようだ。

GitHub上で確認できる0.1.02016年3月ごろ。2

私はこのプロジェクトをもっと早く知っていたらまた違ったのかもしれないがこれ以上は嘆いても仕方がない。

ざっくりとこのHarborはDocker Registryよりもコンテナを管理できるアプリケーションのようだ。

GitLab上ではレジストリがリポジトリと紐付いてしまうため、当然GitLab上でリポジトリを消してしまうとこれらのコンテナイメージは保存できない。

しかしHarborであれば柔軟にユーザー管理などもできるので、Dockerレジストリに比べて遥かに扱いやすい。

ロボットアカウントが特によくできていて、プッシュ専用のアカウントや、プル専用のアカウントを都度作成できる。

興味深いのはその当時のコンテナだけではなく古いRedisやPostgresなどのコンテナも自分のサーバーに残しておけるということだ。

③ 6年前のコンテナをビルドしてみる

今日の作業が比較的容易に進んだのも私が最初期に保存していたリポジトリでたまたま作ったコンテナが依存も少なくよい作りだった。

最近はRailsで書いているが、この当時はNode.jsに乗り換えようと思っていた頃で意図的にRailsからは離れていた。3

もとのアプリケーションもPostgresとRedisのみで、コンテナのビルドもほぼ一瞬で終わった。

正直ただ作るだけならこれをずっと追求してもよかったのかもしれないが、JavaScriptだけでサーバーを書いていた頃が懐かしいなぁと思い返していた。

当時作っていた頃の外部のAPIも2/3は死んでいるので正直これを今再び動かすメリットはないのだが、6年前のコードでサーバーが起動している事実さえあれば今はそれ以上求める必要もない。

④ Portainerをインストールしてみる

突然だがCasaOSをご存知だろうか。

私はもともとこのOSをそれなりに長く利用してきたが、このOSの特徴はあらかじめDockerのスタックをボタンひとつでデプロイできる。

例えばJellyfinやNextcloudなどのアプリケーションを一発でクリックできる。

PortainerもCasaOSでインストールできるし、Portainerそのものは何度か触ったことはあった。

しかしDockerをファイルとかコマンドでずっと触ってきた身としてはあまり受け付けなかった。

今回これを使ってみようと思ったのはCasaOSのような仕組みに近いものを再現しようとしたときにPortainerは選択肢としてかなり近かったからだ。

イメージとしては仮想マシン経由で別の仮想マシンをデプロイできる。

これは非常に画期的だ。CasaOS単体では他のマシンに対してデプロイまではできなかったはずだ。

というわけでHarborとPortainerというアプリケーションを一気にデプロイしてみた。

ここまではさほど大きなトラブルもなく順調に進んでいた。

⑤ Custom App Template Repository (使いたかった)

そして実際にVMを作成して、いざデプロイをしてみようと思った。

するとどうだろう、うまくいかなかった。いや、正確にはうまくいかなくなった

当初の予定ではPortainerにはtemplates.jsonというファイルを定義して、そこから複数のアプリケーションをデプロイさせることができるらしい。

しかしいざ実際に組んでみるとテンプレートという概念は一切使わずにComposeファイルを直接指定する必要があるなどのトラブルが頻発した。

それから存在しないメニューを探したり、いろいろ相談を繰り返すのち、最終的には今使っているバージョンでPortainerのCommunity Editionからは機能が削除されてしまったらしい。

結局私は存在しない機能を追い求めてChatGPTの壁打ちをほぼ一日ひたすら繰り返したわけである。

プログラムの場合は反復で結果を逐一確認しながら進めるので問題ないのだが、これが何かしらの調査であったり答えが出ないものであればどうだっただろうか。

ChatGPTはやはり便利ではあるものの、やはり全幅の信頼を寄せるにはまだ少し早いのかもしれない。

とはいえ今回やりたいことの大半は実現できた。

比較的用意に昔のアプリケーションを起動できるようになったので、これまで残したたくさんの負債が徐々に資産に戻る日がいつか来るかもしれない。

Updated: 翌日へ続く


  1. 実際にこのコマンドの保存と復元は試していないのであしからず 

  2. 昔の記憶は得てして美化されがちかもしれないが、2016年頃は良かった 

  3. Railsを全く書いていなかったわけでもなかったのだが、もし今日このRailsのコンテナを選んでいたらこの投稿までする余裕はなかっただろう