複雑なCI/CDパイプラインなしでDockerコンテナ更新を自動化する方法
ホームサーバー、NAS、または小型VPS上でペットプロジェクトを運用している場合、更新ルーティンに頭を悩ませたことがあるでしょう。あるサービスの新しいリリースが出ると、またターミナルを開く必要があります。イメージをプルし、古いコンテナを停止し、すべてのポートマッピング、ボリュームマウント、環境変数を思い出してから、すべてを再度起動する必要があります。
コンテナが10個以上ある場合、手動更新は多くの時間を消費します。Watchtowerプロジェクトは、この問題を完全に解決します。
Watchtowerできること
Watchtowerは、ホスト上で実行されている他のサービスを監視する小さなコンテナです。Docker Hubまたはプライベートレジストリを定期的にチェックして、新しいタグを見つけ、アプリケーションを自動的に更新します。
動作原理は非常にシンプルです:
- Watchtowerは、更新されたイメージレジストリに公開されていることを検出します。
- 新鮮なイメージをサーバーにダウンロードします。
- 現在のコンテナを正常に停止します。
- 古いコンテナとまったく同じ引数と設定を使用して新しいコンテナを起動します。
マウントされたディレクトリ、ネットワーク、環境変数を含むすべての設定が、自動的に新しいインスタンスに移行されます。
クイックスタート
ユーティリティの起動は、1つのターミナルコマンドだけで可能です:
$ docker run --detach \
--name watchtower \
--volume /var/run/docker.sock:/var/run/docker.sock \
nickfedor/watchtower
ここでの重要な点は、Dockerソケットを渡すことです。これにより、ユーティリティはマシン上のDockerデーモンと通信し、他のコンテナを管理できます。
どこで使用し、どこで使用を避けるべきか
プロジェクト開発者はドキュメント内で正直に警告しています:Watchtowerは、商用企業での本番使用を目的としていません。
本番サーバーでレジストリから直接コンテナを自動再起動することは危険です。本番環境では、テストやカナリーリリースを含む完全なCI/CDパイプラインを設定するか、FluxCDのようなGitOpsツールを使用してKubernetesを管理する方が適切です。
ただし、Watchtowerは次のシナリオに最適です:
- ホームラボおよびメディアサーバー。
- ローカル開発環境。
- 小規模プロジェクト向けのステージングまたはテスト環境。
技術的詳細とアーキテクチャ
このプロジェクトはGoで書かれています。ユーティリティは、amd64、i386、armhf、arm64v8、さらにはriscv64を含むほとんどの一般的なCPUアーキテクチャをサポートしています。つまり、通常のサーバーとRaspberry Piの両方で実行できます。
ホストとやり取りするために、WatchtowerはDocker APIバージョン1.43以降を使用します。デフォルトでは、ユーティリティはデーモンと必要なAPIバージョンを自動的にネゴシエートしますが、必要に応じて環境変数でバージョンを手動で設定できます。
Watchtowerは、ノートやスクリプトに手動でコマンドを収集する必要性を排除します。ホームサービスやローカル開発コンテナの更新に厌倦しているなら、ユーティリティのデプロイは1分もかからず、リリースごとに時間を節約できます。
関連プロジェクト