「Docker Daemon に接続できません」エラーのトラブルシューティング方法
公開: 2022-08-14Docker は、ソフトウェア コンテナーを構築および実行するための主要なプラットフォームの 1 つです。 Swarm モードの単一ホストまたは複数の分散ノードでコンテナーを使用するために必要なものがすべて付属しています。
Docker にはデーモンベースのアーキテクチャがあります。 コンテナーの作成と開始を担当するソフトウェアは、コマンドを受け入れる CLI プロセスから独立しています。 これは、アクティブなデーモン接続なしでコマンドを実行しようとすると、CLI にエラーが表示されることを意味します。 この記事では、これらのイライラするメッセージのトラブルシューティング方法をいくつか紹介します。
問題の症状
Docker CLI は、利用可能なデーモン接続に依存しています。 API 呼び出しを使用してデーモンと対話します。 構成されたデーモンにアクセスできない場合、 docker ps
、 docker run
、 docker 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 のソケットとやり取りする権限があることを確認して、エラーをトラブルシューティングします。