Docker Contextの使い方:SSH経由で複数のリモートサーバーを一元管理する方法

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

リモートDocker管理:手動操作から卒業する時が来た

以前は、VPS上のコンテナを確認するたびに、同じ操作を繰り返していました。まずターミナルを開き、ssh root@ip-serverと入力してパスワードを入れ、ようやくdocker psを実行できるという流れです。管理するサーバーが5台を超えると、このプロセスは非常に煩わしくになります。

SSHウィンドウをあちこち切り替えていると、ミスが起きやすくなります。実際、プロンプトをよく見ずに、テストサーバーのコンテナを停止するつもりが、本番サーバーで実行してしまったこともありました。これは多くのDevOpsエンジニアが経験しうる、致命的なミスです。

接続を速くするために、Docker APIポート(2375や2376)を開放する人もいます。しかし、TLS設定を忘れると、Shodanのようなスキャンツールによって数分で見つかってしまいます。そうなれば、サーバーを乗っ取られて仮想通貨のマイニングに悪用されるリスクがあります。Docker Contextは、SSH経由でDocker Engineを操作できる、セキュリティに優れた完璧な代替案です。

Docker Contextを導入して6ヶ月が経ちますが、作業効率が明らかに向上しました。毎日の手動ログイン作業で約15〜20分を節約できています。特に便利なのは、SCPやサーバー上での Git pull を使わずに、ローカルPCから直接VPSへdocker-compose.ymlをデプロイできる点です。

環境準備

始める前に、ローカルPCとサーバーがいくつかの基本的な条件を満たしている必要があります。現在のほとんどのシステムでは、これらのコンポーネントは既にサポートされています。

1. ローカルDockerのインストール

ローカルPC(Windows、macOS、またはLinux)にDockerがインストールされている必要があります。以下のコマンドで現在のバージョンを確認してください:

docker version

2. SSHキーの設定(必須)

Docker Contextは、SSHキーを使用した自動ログイン環境で最も威力を発揮します。まだSSHキーがない場合は、作成してサーバーに登録しましょう:

# 新しいキーを作成
ssh-keygen -t ed25519

# キーをサーバーに転送(1.2.3.4を自分のサーバーIPに置き換えてください)
ssh-copy-id [email protected]

パスワードを入力せずにssh [email protected]でサーバーにアクセスできる状態を目指します。

Docker Contextの詳細設定

デフォルトでは、dockerコマンドはローカル環境を指すdefaultという名前のContextを使用します。ここに、リモートサーバーを表す新しいContextを追加していきます。

SSH経由でContextを作成する

例えば、IP 1.2.3.4で動作しているステージング環境のVPSがあるとします。このContextにstaging-serverという名前を付けます:

docker context create staging-server --docker "host=ssh://[email protected]" --description "ステージングサーバー"

本番サーバー(Production)についても、同様に対応するIPで作成します:

docker context create prod-server --docker "host=ssh://[email protected]" --description "本番サーバー"

Contextリストの管理

設定済みの環境を確認するには、以下のコマンドを使用します:

docker context ls

一覧が表示されます。アスタリスク(*)が付いている行が、現在アクティブなContextです。

環境の柔軟な切り替え

これこそが最も価値のある機能です。操作対象をローカルからステージングサーバーに切り替えるには、次のように入力するだけです:

docker context use staging-server

実行後すぐに、docker psdocker logsといったすべてのコマンドがリモートサーバー上で直接実行されるようになります。自宅のローカルマシンで作業しているかのような、スムーズで一貫した操作感です。

実践的なアドバイスとセキュリティの注意点

Docker Contextを使いこなすには、ミスを避け、速度を最適化するためのちょっとしたコツが必要です。

モニタリングとデバッグのコツ

Docker APIからの詳細なレスポンスを確認したいときは、inspectコマンドをよく使います。JSONの結果が長すぎる場合は、toolcraft.app/ja/tools/developer/json-formatterなどのツールを使って整形すると読みやすくなります。詳細情報を取得するコマンドは以下の通りです:

docker context inspect staging-server

リモートでのDocker Composeデプロイ

Docker ComposeはContextを完璧にサポートしています。対象のサーバーにDocker Composeをインストールする必要はありません。ローカルPCから対象のContextに切り替えて、以下を実行するだけです:

docker-compose up -d

Dockerが自動的に指示をパッケージ化し、SSH経由で送信します。これにより、手動のCI/CDプロセスが格段にプロフェッショナルなものになります。

重要な注意事項

  • 権限管理: セキュリティリスクを最小限に抑えるため、rootではなくdockerグループに所属するユーザーを使用してください。
  • レイテンシ: データはSSHを経由するため、サーバーが遠すぎる場合(例:日本からアメリカのサーバーへ接続する場合)、コマンドの実行に1〜2秒の遅延が生じることがあります。
  • 誤操作の防止: 現在のContext名がターミナルのプロンプトに表示されるよう設定することをお勧めします。これにより、今操作しているのがステージングなのか本番なのかを一目で把握できます。

ローカル環境に戻る

サーバーでの作業が終わったら、テスト用のコンテナを誤って本番サーバーで動かしてしまわないよう、必ずローカル環境に戻しておきましょう:

docker context use default

従来の古い手法の代わりにDocker Contextを使用することで、システムの管理が非常にスッキリしました。何十ものSSHウィンドウを開く代わりに、今では一つのターミナルだけで全Dockerノードを制御できています。もし2台以上のサーバーを管理しているなら、ぜひ今日から設定してみてください。

Share: