「Docker Daemon に接続できません」エラーのトラブルシューティング方法

公開: 2022-08-14

Docker ロゴを示すグラフィック

Docker は、ソフトウェア コンテナーを構築および実行するための主要なプラットフォームの 1 つです。 Swarm モードの単一ホストまたは複数の分散ノードでコンテナーを使用するために必要なものがすべて付属しています。

Docker にはデーモンベースのアーキテクチャがあります。 コンテナーの作成と開始を担当するソフトウェアは、コマンドを受け入れる CLI プロセスから独立しています。 これは、アクティブなデーモン接続なしでコマンドを実行しようとすると、CLI にエラーが表示されることを意味します。 この記事では、これらのイライラするメッセージのトラブルシューティング方法をいくつか紹介します。

問題の症状

Docker CLI は、利用可能なデーモン接続に依存しています。 API 呼び出しを使用してデーモンと対話します。 構成されたデーモンにアクセスできない場合、 docker psdocker rundocker buildなどのdockerコマンドは、次のようなエラー メッセージを表示します。

 $ docker run hello-world:latest
unix:///var/run/docker.sock で Docker デーモンに接続できない
docker デーモンは実行されていますか?

これは、CLI が/var/run/docker.sock Unix ソケットを使用して Docker デーモンと通信しようとしたことを示しています。 ソケットが開いていないため、接続に失敗しました。

1. Docker デーモン サービスが実行されていることを確認する

通常、Docker デーモンは、ホストの再起動後に Docker を自動的に開始する systemd サービスによって管理されます。 このサービスが実行されているかどうかを確認することで、トラブルシューティングを開始できます。

 $ sudo systemctl ステータス docker
docker.service - Docker アプリケーション コンテナ エンジン
     ロード済み: ロード済み (/lib/systemd/system/docker.service; 有効; ベンダー プリセット: 有効)
     アクティブ: 非アクティブ (死んでいる)

デーモンが実行中の場合、サービスはActive: active (running)を報告する必要があります。 上記の例は、デーモンが停止したことを意味するinactive (dead)を示しています。

次のコマンドを使用して Docker を起動します。

 $ sudo systemctl start docker

これで、 docker CLI コマンドを正常に実行できるはずです。

マシンを再起動した後、Docker が停止状態のままになる場合があります。 これを解決するには、サービスを有効にして、systemd がサービスを自動的に開始できるようにします。

 $ sudo systemctl enable docker
$ sudo systemctl デーモン-リロード

daemon-reloadコマンドは、systemd に設定をリロードして変更を適用するように指示します。

2.デーモンを手動で開始する

Docker サービスがインストールされていないシステムを使用する場合があります。 dockerdコマンドを使用して、Docker デーモンを手動で開始できます。 これは通常rootとして実行する必要があります。

 $ sudo dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] 起動中

コマンドが実行されている限り、Docker は引き続きアクセス可能です。 デーモンを停止するには、Ctrl+C を使用します。

3. CLI が正しいデーモンをターゲットにしていることを確認する

CLI がリモートの Docker デーモン インスタンスに接続しようとすると、問題が発生する可能性があります。 これは通常、エラー メッセージに TCP アドレスが表示される原因です。

 $ docker run hello-world:latest
tcp:///0.0.0.0:2375 で Docker デーモンに接続できません

この例では、 docker CLI は、ローカルの Unix Docker ソケットではなく、TCP を使用して0.0.0.0:2375で Docker デーモンに接続しようとしています。 Docker デーモンの TCP サポートが無効になっているか、指定されたホストがネットワーク上でアクセスできない場合、これは失敗します。

通常、これは、使用するデーモン接続の適切な Docker CLI コンテキストに切り替えることで解決できます。

 $ docker context use default

context lsコマンドを使用して、使用可能なすべてのコンテキストとそれらが接続するデーモン エンドポイントを一覧表示できます。

 $ docker context ls
名前 説明 Docker エンドポイント             
デフォルト * 現在の DOCKER_HOST ベースの構成 unix:///var/run/docker.sock

現在選択されているコンテキストは、アスタリスクで強調表示されます。

DOCKER ENDPOINT列の予期しない値は、通常、 DOCKER_HOST環境変数が設定されていることが原因です。 この場合、警告が表示されます。

 $ export DOCKER_HOST=1.2.3.4
$ docker context ls
名前 説明 Docker エンドポイント
デフォルト * 現在の DOCKER_HOST ベースの構成 tcp://1.2.3.4:2375
警告: DOCKER_HOST 環境変数は、アクティブなコンテキストをオーバーライドします。 コンテキストを使用するには、グローバルな --context フラグを設定するか、DOCKER_HOST 環境変数の設定を解除します。

シェルにDOCKER_HOST環境変数が存在すると、選択したコンテキストで定義されたエンドポイントがオーバーライドされます。 この例では、 dockerコマンドは常にtcp://1.2.3.4:2375のデーモン インスタンスをターゲットにします。

この問題は、 DOCKER_HOST変数をクリアすることで解決できます。

 $ エクスポート DOCKER_HOST=

Docker は、アクティブなコンテキストによって構成されたエンドポイントを使用します。 カスタム コンテキストを手動で設定しない限り、これが/var/run/docker.sockのデフォルトのローカル Unix ソケットになります。

 $ docker context ls
名前 説明 Docker エンドポイント             
デフォルト * 現在の DOCKER_HOST ベースの構成 unix:///var/run/docker.sock

4. 権限の問題

Docker のソケットに対する不適切なユーザー権限は、デーモン接続の問題のもう 1 つの一般的な原因です。 この種の問題では、通常、わずかに異なるエラー メッセージが表示されます。

 $ docker run hello-world:latest
unix:///var/run/docker.sock で Docker デーモン ソケットに接続しようとしたときにアクセス許可が拒否されました

これは、Docker API を公開するソケットと対話する権限が Unix ユーザー アカウントにない場合に発生します。 dockerグループに自分自身を追加することは、この問題を解決するためのベスト プラクティスです。

 $ sudo usermod -aG docker $USER

この変更を有効にするには、新しいシェル ウィンドウを開くか、ログアウトしてから再度ログインする必要があります。 これで、パーミッションの問題に遭遇することなくdockerコマンドを実行できるはずです。

概要

Docker CLI が現在の構成を使用して Docker デーモン インスタンスと通信できない場合、「Docker デーモンに接続できません」と表示されます。 これは多くの場合、Docker デーモン サービスが停止または無効になっていることが原因です。 オフラインになったリモート Docker ホストに接続しようとしている可能性もあります。

この問題の考えられる原因と、それを解決するための一般的な方法を知っておく必要があります。 Docker デーモンの設定を確認し、Docker サービスを再起動して、ユーザー アカウントに Docker のソケットとやり取りする権限があることを確認して、エラーをトラブルシューティングします。