「Dockerデーモンに接続できません」というエラーのトラブルシューティング方法
Dockerは、ソフトウェアコンテナを構築し実行するための主要なプラットフォームの一つです。単一のホストまたはSwarmモードでの複数の分散ノードでコンテナを使用するために必要なすべてが揃っています。
Dockerはデーモンベースのアーキテクチャを持っています。コンテナの作成と起動を担当するソフトウェアは、あなたのコマンドを受け入れるCLIプロセスとは独立しています。つまり、アクティブなデーモン接続なしにコマンドを実行しようとすると、CLIにエラーが表示されます。この記事では、これらのイライラするメッセージをトラブルシューティングするための方法をいくつか紹介します。
問題の症状
Docker CLIはデーモン接続が利用可能であることに依存しています。それはAPI呼び出しを使用してデーモンと対話します。設定されたデーモンが利用できない場合、dockerコマンドのような
docker ps,
docker run
、そして
docker buildこのようなエラーメッセージが表示されます:
docker run hello-world:latest
Cannot connect to the Docker daemon at unix:///var/run/docker.sock
Is the docker daemon running?
これは、CLIが/var/run/docker.sock Unixソケットを使用してDockerデーモンと通信しようとしたことを示しています。ソケットが開いていないため、接続に失敗しました。
1. Dockerデーモンサービスが実行中であることを確認する
Dockerデーモンは通常、ホストが再起動した後に自動的にDockerを開始するsystemdサービスによって管理されています。トラブルシューティングを始めるには、このサービスが実行中かどうかを確認します:
sudo systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: inactive (dead)
サービスは、デーモンが実行中の場合、Active: active (running) と報告する必要があります。上記の例は、デーモンが停止していることを意味する inactive (dead) を示しています。
次のコマンドを使用してDockerを起動します:
sudo systemctl start dockerこれで、docker CLI コマンドを正常に実行できるようになったはずです。
あなたのマシンを再起動した後、Dockerが停止した状態のままであることに気づくかもしれません。これを解決するためには、サービスを有効にしてsystemdに自動的に起動させることができます:
sudo systemctl enable docker
sudo systemctl daemon-reload
daemon-reloadコマンドは、systemdに設定を再読み込みして変更を適用するよう指示します。
2. デーモンを手動で開始する
あなたは時々、Dockerサービスがインストールされていないシステムを使用するかもしれません。その場合、dockerdコマンドを使ってDockerデーモンを手動で起動できます。これは通常、rootとして実行する必要があります。
sudo dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] Starting up
Dockerはコマンドが実行されている限りアクセス可能です。デーモンを停止するにはCtrl+Cを使用してください。
3. CLIが正しいデーモンをターゲットにしているか確認する
CLIがリモートDockerデーモンインスタンスに接続しようとするときに問題が発生することがあります。通常、このエラーメッセージがTCPアドレスを表示する場合が原因です。
docker run hello-world:latest
Cannot connect to the Docker daemon at tcp:///0.0.0.0:2375
この例では、docker CLI が TCP を使用して 0.0.0.0:2375 の Docker デーモンに接続しようとしていますが、ローカルの Unix Docker ソケットではありません。Docker デーモンの TCP サポートが無効にされているか、指定されたホストがネットワーク上でアクセスできない場合、これは失敗します。
通常、使用したいデーモン接続のために正しい Docker CLI コンテキストに切り替えることでこれを解決できます:
docker context use defaultcontext ls コマンドを使用すると、利用可能なすべてのコンテキストとそれらが接続するデーモンエンドポイントを一覧表示できます:
docker context ls
NAME DESCRIPTION DOCKER ENDPOINT
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock
現在選択されているコンテキストはアスタリスクで強調表示されています。
DOCKER ENDPOINT列に予期しない値が表示されるのは、通常、DOCKER_HOST環境変数が設定されていることが原因です。このような場合、警告が表示されます:
export DOCKER_HOST=1.2.3.4
docker context ls
NAME DESCRIPTION DOCKER ENDPOINT
default * Current DOCKER_HOST based configuration tcp://1.2.3.4:2375
Warning: DOCKER_HOST environment variable overrides the active context. To use a context, either set the global --context flag, or unset DOCKER_HOST environment variable.
あなたのシェルにおけるDOCKER_HOST環境変数の存在は、選択したコンテキストで定義されたエンドポイントを上書きします。この例では、dockerコマンドは常にtcp://1.2.3.4:2375のデーモンインスタンスを対象とします。
この問題はDOCKER_HOST変数をクリアすることで解決できます:
export DOCKER_HOST=Dockerは、現在アクティブなコンテキストによって設定されたエンドポイントを使用します。これが、手動でカスタムコンテキストを設定していない限り、デフォルトのローカルUnixソケット/var/run/docker.sockになります。
docker context ls
NAME DESCRIPTION DOCKER ENDPOINT
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock
4. 許可の問題
Dockerのソケットでの不正なユーザー権限は、デーモン接続の問題のもう一つの一般的な原因です。この種の問題は、通常、少し異なるエラーメッセージを示します:
docker run hello-world:latest
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
これは、あなたのUnixユーザーアカウントがDocker APIを公開するソケットとやり取りする権限を持っていないときに発生します。この問題を解決する最善の方法は、dockerグループに自分を追加することです。
sudo usermod -aG docker $USERこの変更を有効にするには、新しいシェルウィンドウを開くか、ログアウトして再度ログインする必要があります。これで、docker コマンドをパーミッションの問題に遭遇することなく実行できるようになるはずです。
要約
"Dockerデーモンに接続できません"は、Docker CLIが現在の構成を使用してDockerデーモンインスタンスと通信できない場合に表示されます。これはしばしば、Dockerデーモンサービスが停止または無効になっているためです。また、オフラインになっているリモートDockerホストに接続しようとしている可能性もあります。
この問題の可能な原因と一般的な解決方法について、今は理解しているはずです。エラーをトラブルシュートするために、Dockerデーモンの設定を確認し、Dockerサービスを再起動し、ユーザーアカウントがDockerのソケットと対話する権限を持っていることを確認してください。
