Docker「Got permission denied while trying to connect to the Docker daemon socket」エラーの解決方法【2026年最新版】

スポンサーリンク

Docker「Got permission denied while trying to connect to the Docker daemon socket」エラーの解決方法【2026年最新版】

Dockerを使い始めた際に最も遭遇しやすいエラーの一つが「Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock」です。この記事では、このエラーの原因と具体的な解決方法を2026年の最新環境に対応した形で詳しく解説します。Linux(Ubuntu、CentOS、Debian等)でDockerを使うすべてのユーザー必見の内容です。

このエラーとは?発生する症状

Dockerをインストールした直後、またはLinuxサーバーで docker コマンドを実行した際に、以下のようなエラーメッセージが表示されることがあります。

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

このエラーは、docker psdocker rundocker-compose up など、ほぼすべてのDockerコマンドで発生する可能性があります。具体的には以下のような症状が見られます。

  • docker run hello-world が失敗する: Dockerインストール後の動作確認で最初に遭遇するケース
  • docker ps でコンテナ一覧が表示されない: 実行中のコンテナがあっても権限エラーで確認できない
  • docker-compose up が起動しない: Docker Composeを使ったマルチコンテナアプリケーションの起動に失敗する
  • CI/CDパイプラインが失敗する: Jenkins、GitHub Actions、GitLab CI等でDockerコマンドが権限エラーで停止する
  • VS CodeのDev Containers拡張が接続できない: リモート開発環境でDockerに接続できない

このエラーが発生すると、Dockerの全機能が使用不能になるため、開発作業が完全にストップしてしまいます。特にDockerを初めて使うユーザーにとっては非常に困惑するエラーです。

このエラーが発生する原因

原因1: 現在のユーザーがdockerグループに所属していない

最も一般的な原因です。DockerデーモンはデフォルトでUnixソケット(/var/run/docker.sock)を使用して通信しますが、このソケットはroot(管理者)ユーザーが所有しています。一般ユーザーがDockerコマンドを実行するには、docker グループに所属している必要があります。Dockerをインストールしただけでは、現在のユーザーはこのグループに自動追加されないため、権限エラーが発生します。

# ソケットの権限を確認
ls -la /var/run/docker.sock
# 出力例: srw-rw---- 1 root docker 0 Feb 12 10:00 /var/run/docker.sock

原因2: グループ変更後にログアウト/再ログインしていない

sudo usermod -aG docker $USER コマンドでdockerグループにユーザーを追加した後、ログアウトして再度ログインしていないケースです。Linuxではグループメンバーシップの変更は、新しいセッション(ログイン)を開始するまで反映されません。これは非常によくある見落としで、「コマンドを実行したのに直らない」という質問がStack OverflowやRedditで頻出しています。

原因3: Dockerデーモンが起動していない

Dockerサービス自体が停止している場合にも同様のエラーが出ることがあります。サーバーの再起動後にDockerが自動起動しない設定になっている場合や、Dockerのインストールが不完全な場合に発生します。

# Dockerサービスの状態を確認
sudo systemctl status docker

原因4: /var/run/docker.sockの権限が不正に変更されている

手動でソケットファイルの権限を変更してしまった場合や、セキュリティツールによって権限がリセットされた場合に発生します。本来 srw-rw----root:docker の所有権であるべきソケットが、異なる権限になっていると正常に接続できません。

原因5: SELinuxやAppArmorによるアクセス制限

セキュリティが強化されたLinuxディストリビューション(RHEL、CentOS、Fedora等)では、SELinuxがDockerソケットへのアクセスをブロックすることがあります。同様に、Ubuntu等ではAppArmorが原因となる場合があります。

解決方法1: dockerグループにユーザーを追加する(推奨)

この方法が最も安全で推奨される解決方法です。Docker公式ドキュメントでも推奨されているアプローチです。

手順1: dockerグループが存在するか確認する

まず、dockerグループがシステムに存在するかを確認します。通常、Dockerのインストール時に自動的に作成されますが、念のため確認しましょう。

# dockerグループの存在を確認
cat /etc/group | grep docker

グループが存在しない場合は、以下のコマンドで作成します。

# dockerグループを作成
sudo groupadd docker

手順2: 現在のユーザーをdockerグループに追加する

以下のコマンドで、現在ログインしているユーザーをdockerグループに追加します。

# 現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER

コマンドの解説:
usermod: ユーザーアカウントを変更するコマンド
-a: 追加モード(既存のグループから削除しない)
-G docker: dockerグループを指定
$USER: 現在のログインユーザー名が自動的に入る

特定のユーザーを追加したい場合は、$USER の部分をユーザー名に置き換えてください。

# 特定のユーザーを追加する例
sudo usermod -aG docker username

手順3: グループ変更を反映させる

方法A: ログアウト&再ログイン(最も確実)

# SSHの場合
exit
# その後、再度SSHで接続

# デスクトップ環境の場合
# ログアウトして再度ログイン

方法B: newgrpコマンドで即時反映(現在のターミナルのみ)

# 現在のシェルセッションでdockerグループを即時有効化
newgrp docker

この方法は現在のターミナルセッションのみで有効です。新しいターミナルを開く際には、ログアウト&再ログインが必要です。

手順4: 設定が正しく反映されたか確認する

# 自分がdockerグループに所属しているか確認
groups

# Dockerが正常に動作するかテスト
docker run hello-world

Hello from Docker! というメッセージが表示されれば、設定は正しく完了しています。

注意点

  • -a オプション(append)を忘れると、ユーザーがdockerグループ「のみ」に所属することになり、他のグループから外れてしまいます。必ず -aG をセットで使用してください
  • dockerグループに所属すると、そのユーザーはroot相当の権限を持つことになります。信頼できるユーザーのみを追加してください
  • WSL2(Windows Subsystem for Linux)環境では、WSLの再起動(wsl --shutdown)が必要な場合があります

解決方法2: sudoを使用してDockerコマンドを実行する

グループ設定を変更できない環境や、一時的にDockerを使いたい場合の対処法です。

すべてのDockerコマンドの前に sudo を付けることで、root権限で実行できます。

# sudoを使ってDockerコマンドを実行
sudo docker run hello-world
sudo docker ps
sudo docker-compose up -d

この方法はすぐに実行できますが、以下のデメリットがあります。

  • 毎回 sudo を入力する手間がかかる
  • Docker Composeやスクリプト内での実行が煩雑になる
  • CI/CDパイプラインでは sudo が使えない場合がある
  • 環境変数やDockerのコンテキスト設定が root ユーザーのものが使われる

長期的には解決方法1のdockerグループへの追加を行うことを強く推奨します。

Docker Composeを使う場合は以下のように実行します。

# Docker Composeの場合
sudo docker compose up -d

# 旧バージョンのDocker Compose(v1)の場合
sudo docker-compose up -d

解決方法3: Docker Rootlessモードを使用する(上級者向け)

Docker 20.10以降で正式サポートされたRootlessモードは、Dockerデーモン自体を一般ユーザー権限で実行する方法です。2026年現在、Docker Engine 27.x系でさらに安定性が向上しており、セキュリティを重視する本番環境で推奨されるアプローチです。

Rootlessモードのメリット

  • root権限が一切不要
  • セキュリティリスクの大幅な軽減
  • コンテナ内からのホスト侵害リスクの低減

インストール手順

まず、必要な依存パッケージをインストールします。

# Ubuntu/Debianの場合
sudo apt-get install -y uidmap dbus-user-session

# CentOS/RHELの場合
sudo yum install -y shadow-utils fuse-overlayfs

次に、Rootlessモード用のセットアップスクリプトを実行します。

# 既存のDocker(rootful)を停止
sudo systemctl disable --now docker.service docker.socket

# Rootlessモードのインストール
dockerd-rootless-setuptool.sh install

環境変数を設定します。

# ~/.bashrcまたは~/.zshrcに追加
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
# 設定を反映
source ~/.bashrc

# 動作確認
docker run hello-world

注意点

  • Rootlessモードではいくつかの機能に制限があります(特権ポート80/443のバインド、一部のストレージドライバー等)
  • 既存のroot権限で作成されたイメージやボリュームは直接使用できません
  • ネットワークの設定が通常モードと異なる場合があります

エラーを予防するには

Dockerの権限エラーを未然に防ぐために、以下の対策を日頃から実施しましょう。

1. Dockerインストール直後にグループ設定を行う

Dockerをインストールしたら、最初のコマンドを実行する前にdockerグループへの追加を済ませましょう。これを手順書やセットアップスクリプトに含めておくと、毎回のセットアップが効率的になります。

# インストール後のセットアップスクリプト例
#!/bin/bash
sudo groupadd docker 2>/dev/null
sudo usermod -aG docker $USER
echo "ログアウトして再度ログインしてください"

2. Ansibleやシェルスクリプトで自動化する

チーム開発やサーバー構築を自動化している場合、Dockerのインストールとグループ設定を自動化スクリプトに組み込んでおきましょう。

3. CI/CDパイプラインの権限設定を確認する

GitHub Actions、GitLab CI、Jenkinsなどでは、Dockerソケットへのアクセス権限が適切に設定されているか事前に確認しましょう。多くのCI/CDプラットフォームでは、Dockerの使用に専用の設定が必要です。

4. 定期的にDockerサービスの状態を確認する

# Dockerの自動起動を有効にする
sudo systemctl enable docker

# Dockerサービスの状態確認
sudo systemctl status docker

5. chmod 666は絶対に使わない

インターネット上で chmod 666 /var/run/docker.sock という「解決方法」を見かけることがありますが、これはセキュリティ上非常に危険です。すべてのユーザーにDockerデーモンへのアクセス権を付与してしまい、実質的にroot権限を全ユーザーに与えることと同じです。本番環境では絶対に使用しないでください。

まとめ

Docker「Got permission denied while trying to connect to the Docker daemon socket」エラーは、Dockerを使い始めるほぼすべてのLinuxユーザーが遭遇する非常に一般的なエラーです。しかし、原因と解決方法を正しく理解していれば、数分で解決できます。

最も重要なポイント:
推奨: sudo usermod -aG docker $USER でdockerグループにユーザーを追加し、ログアウト&再ログイン
一時的: sudo docker で即座にコマンドを実行
セキュリティ重視: Docker Rootlessモードを検討

解決できない場合は以下を確認してください。
1. Dockerサービスが起動しているか(sudo systemctl status docker
2. ソケットファイルの権限が正しいか(ls -la /var/run/docker.sock
3. SELinux/AppArmorの設定が影響していないか

それでも解決しない場合は、Docker公式フォーラムやStack Overflowで環境情報(OS、Dockerバージョン、エラーメッセージ全文)を添えて質問することをおすすめします。

参考資料

コメント

タイトルとURLをコピーしました