インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

Docker daemonに接続できない・Permission deniedの原因と安全な確認手順

Cannot connect to the Docker daemonやpermission denied while trying to connectが出たときに、接続先の違い・daemon状態・ソケットの権限を切り分けます。コンテナ内アプリの起動失敗とは別の問題です。

この記事の目的

接続先の設定、Docker Engine・rootlessモード、UNIXソケット権限を変更せずに確認します。

まず確認すること

docker context show、docker context inspect、docker versionを確認して接続先を特定します。

本番作業前:単に権限エラーを消すためにdockerグループへ無条件に追加したり、Dockerソケットの権限を777にしないでください。 web01・app-data・ポート番号などは説明用です。Docker context・対象コンテナ・データ保存先を照合してください。

1. エラー文から接続経路を分類

エラー例最初の確認先
Cannot connect to the Docker daemonDocker context・DOCKER_HOST・daemonの実行状態
permission denied ... docker.sockCLI実行ユーザー・ソケット所有者とアクセス権
connection refused接続先アドレス・ソケット・リモートdaemonの状態
error loading config.json: permission deniedユーザーの~/.docker所有者・権限
TLS / SSH authentication failedリモート認証・証明書・接続先と権限

Docker Desktop、通常のrootful Docker Engine、rootless Engineでは、接続先ソケットやサービス管理方法が違います。

2. 実際のDocker接続先を調べる

# CLIの向き先を確認(参照のみ) docker context show docker context ls docker context inspect docker version # DOCKER_HOSTなどの接続情報は値を共有せず、運用管理者が安全な経路で確認

DOCKER_HOSTはCLIの接続先を上書きする場合があります。docker contextで選んだ対象と一致しないときは、環境変数・CLIオプション・コンテキスト優先順位を調べます。勝手にcontext use defaultへ切り替えると操作先が変わるため、作業前の変更管理が必要です。

3. UNIXソケットの所有者・権限

# Linux上の通常Engineの例 id ls -l /var/run/docker.sock stat /var/run/docker.sock # 管理権限がある場合の参照 systemctl status docker --no-pager systemctl status docker.socket --no-pager

docker.sockが存在しない、または別パスならrootless Engine・Docker Desktop・リモート接続などの可能性もあります。systemctl statusが見られない構成や、Dockerが別のサービス名で管理される構成もあります。

危険操作:chmod 666 /var/run/docker.sockなどの全員書き込み許可は避けてください。Docker daemon制御権限はホスト上で非常に強い権限となります。

4. dockerグループを使う前のセキュリティ確認

Docker公式はdockerグループに属する利用者が実質的にroot相当の権限を得ることを説明しています。管理者が認めたユーザーだけに権限を与え、付与方法・監査ログ・代替手段(rootless、限定された運用経路)を検討します。

現在のユーザーのグループ所属はidで確認できます。sudoを付ければ解決、dockerグループ追加が正解、と機械的に判断しないことが重要です。

5. rootless・リモートDockerでは確認点が変わる

# rootlessを利用する環境で、現在のユーザー管理を参照 systemctl --user status docker --no-pager # Docker CLI構成とユーザー id docker context ls

rootlessはユーザーサービス・ユーザーごとのソケットを利用する構成が多く、rootful Engine用の/var/run/docker.sockを前提に調査すると誤診します。リモートDockerならSSH/TLSの認証と接続先ホストの権限を確認します。

6. 変更後は接続先と影響範囲を再確認

docker context show docker version docker ps -a

権限・daemon・contextを変更した場合、意図したDocker Engineへ接続できるかを確認します。docker psが成功しても、別ホストを操作している可能性があるため、接続先を必ず明示的に照合してください。

接続後にコンテナがすぐ終了する場合はDockerコンテナ起動失敗の原因確認へ切り替えます。

7. 接続方式ごとに復旧条件を固定する

接続方式確認対象完了条件
Linux rootfulcontext、Unix socket、docker.service、利用ユーザーの権限意図したdaemonに接続でき、権限緩和せず対象コンテナ一覧を確認
Linux rootlessユーザー単位のsocket、systemctl --user、実行ユーザーと環境変数rootful側を誤操作せず、正しいユーザーEngineに接続
remote(SSH/TLS)接続先ホスト、資格情報、SSH/TLS設定と認証暗号化・認証を維持したまま対象ホストへ接続

障害前のcontextやユーザー権限を記録していない場合は、復旧前に運用管理者へ対象Engineを確認してください。エラー解消のためにchmod 666や無認証TCP公開へ切り替えることはしません。

8. 接続失敗の結果別対処

CLIがインストールされていても、Engineが稼働しているとは限りません。まず接続先と権限を参照操作で分けます。例はLinuxのrootful Engine向けで、Docker Desktopやrootlessでは確認対象が変わります。

docker context show docker context ls docker version id # 標準的なLinux rootful Engineの場合 stat -c '%U %G %a %n' /var/run/docker.sock systemctl is-active docker
# 出力例(想定、実測ではありません) Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
調査結果次に必要な対処・判断
daemonがinactiveでrootful systemd管理systemctl status dockerとjournalctl -u dockerで停止理由を確認。管理者が復旧を承認した場合だけサービス起動を検討
daemonはactiveだがpermission denied現在のユーザーの所属グループとsocket所有権を照合。運用管理者に権限設計を確認し、無条件にグループ追加・権限緩和しない
context/DOCKER_HOSTが期待と違う誤ったDocker Engineを操作しないよう対象ホストを確認し、接続設定の管理元から修正
socketがなくsystemctlも対象外rootlessのユーザーsocket・サービスやDocker Desktop/remote接続を確認し、rootful用の修正を適用しない
SSH/TLS認証エラー資格情報の管理元、接続先の証明書期限・SSH権限を確認。TLS無効化・無認証TCP公開は行わない

9. 変更前の安全確認と復旧判定

次は、rootful Docker Engineが停止しており、管理者が起動を承認した場合に限る例です。daemon起動でコンテナや公開ポートが復活する場合があるため、業務影響とRestartPolicyを事前確認します。

# 参照のみ systemctl status docker --no-pager journalctl -u docker --since '1 hour ago' --no-pager # 作業承認後、管理者が実施する例 # sudo systemctl start docker # その後に参照 docker context show docker version docker ps -a
結果完了・次の判断
Docker ClientとServerの双方が表示され、contextも対象ホストと一致daemon接続は復旧候補。必要なコンテナと意図しない外部公開がないことを確認
Clientだけ表示されServerへ接続できない未解決。daemonログ・socket・環境変数・rootless/remoteの切り分けへ戻る
daemonへ接続できるがコンテナはExited接続は復旧、アプリは別障害。コンテナ起動失敗を調査
避ける対応:chmod 666 /var/run/docker.sock、root相当のdockerグループへの無条件追加、認証なしTCP接続の公開。設定変更に失敗した場合は管理者が変更元へ戻し、アクセス制御を再検証してください。

公式・一次資料

対象と実行前チェックを継続する

読み取り操作、設定変更、削除操作を分け、作業後の状態と業務影響を確認します。

柱ガイドへ戻る