Linux
 Computer >> コンピューター >  >> トラブルシューティング >> Linux

【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

Dockerは、コンテナを使ってアプリケーションを簡単に作成・デプロイ・実行できることから、近年ますます人気が高まっています。コンテナを利用すれば、開発者はアプリケーション本体に加えて必要なライブラリや依存関係をまとめてパッケージ化し、ひとつの完成品として展開できます。

LinuxへのDockerのインストール自体は比較的簡単で、ターミナルで数個のコマンドを実行するだけで利用を始められます。

【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

しかしながら、インストールが正常に完了した後でも、すべてのユーザーがスムーズに使えるとは限りません。特によく報告されるのが次のエラーです。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?(Dockerデーモンに接続できません)

このエラーは、docker rundocker infodocker pulldocker stopなど、さまざまなdockerコマンドの実行時に発生する可能性があります。

Dockerデーモンに接続できないエラーの主な原因

多くの開発者からの報告をもとに原因を調査したところ、このエラーを引き起こす主な要因は以下の3つに絞られました。

  • Dockerデーモンが起動していない
  • Dockerが正常にシャットダウンされていない
  • dockerサービスを開始するためのroot権限がない

原因の概要がわかったところで、状況別の具体的な解決策を見ていきましょう。

解決策1:systemctlでDockerサービスを起動する

UbuntuにDockerを新規インストールした直後や、PCを再起動した直後は、Dockerサービスが起動していない可能性が非常に高いです。Dockerデーモン(dockerd)はDockerの中核となるシステムサービスで、イメージ・コンテナ・ネットワーク・ボリュームなどの各種オブジェクトを管理し、Docker APIへのリクエストを待ち受けています。

systemctlコマンドは従来のSysV initシステムに代わるもので、Linux上で動作するsystemdサービスを管理します。もしシステムにsystemctlが用意されていない場合は、後述のserviceコマンドを使った方法(解決策4)を試してください。

注意: この方法は、APTパッケージマネージャーでDockerをインストールした環境向けです。Snap経由でインストールした場合は、解決策5を参照してください。

  1. ターミナルを開き、まずdockerユニットのマスクを解除します。
sudo systemctl unmask docker

マスクされた状態のままdockerサービスを起動しようとすると、「Failed to start docker.service: Unit is masked.」というエラーが出ることがあります。マスクとは、無効化(disable)よりも強力な状態で、ユニットファイルが/dev/nullにリンクされた状態を指します。すべてのユニットファイルの状態は「$ systemctl list-unit-files」コマンドで一覧確認できます。

2. マスクを解除したら、systemctlコマンドでDockerデーモンを起動します。

systemctl start docker
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

3. Dockerサービスがアクティブかつ実行中になっているかを確認するには、現在のステータスを表示するsystemctl statusコマンドを使います。

systemctl status docker
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

上の画像のように「active (running)」と表示されていれば、Dockerは正常に稼働しています。

解決策2:「失敗したDocker Pull」をクリーンアップしてDockerサービスを起動する

コンテナのプル(pull)中に予期せずDockerを終了してしまうと、docker.serviceおよびdocker.socketの各ユニットファイルがマスクされた状態になることがあります。docker.socketは「/var/run/docker.sock」に配置され、Dockerデーモンとの通信に使われる重要なファイルです。Dockerを起動する前に、まずこれら2つのユニットファイルのマスクを解除する必要があります。

  1. ターミナルを起動し、以下のコマンドを順に実行します。
systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

上記のコマンドを実行してもエラーが解消しない場合は、Dockerを再起動する前にContainerdディレクトリ内のファイルを削除してみてください。ContainerdはDocker 1.11で導入された機能で、Dockerイメージのライフサイクル管理を担っています。

2. ターミナルを開き、以下のコマンドを実行します。root権限が必要になるため、rootパスワードを事前に確認しておいてください。

sudo su
service docker stop
cd /var/run/docker/libcontainerd
rm -rf containerd/*
rm -f docker-containerd.pid
service docker start
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

解決策3:dockerd(Dockerデーモン)を直接起動する

dockerdは、Docker APIを待ち受けて各種オブジェクトを管理するDockerデーモンの本体です。「$ systemctl start docker」の代わりとして、dockerdを直接起動することも可能です。

  1. ターミナルを開き、以下のコマンドでdockerdを起動します。
sudo dockerd
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

解決策4:serviceコマンドでDockerを起動する

SysV initシステムを採用している環境では、systemctlコマンドは使えません。代わりにserviceコマンドを使ってDockerデーモンを起動します。

  1. ターミナルを起動し、以下のコマンドを実行します。
sudo service --status-all
sudo service docker start
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

解決策5:SnapでDockerサービスを起動する

SnapパッケージマネージャーでDockerをインストールした場合は、snapコマンドでDockerデーモンを管理する必要があります。

通常、Snapはサービスを自動的に管理してくれますが、今回のようなエラーが発生した場合は手動での介入が必要です。snapコマンドではstopstartrestartなどの引数が使えます。ここではstartを使用します。

  1. ターミナルを開き、以下のコマンドでDockerを起動します。
sudo snap start docker
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

2. 次のコマンドで、Dockerサービスが起動したかどうか確認します。

sudo snap services

これにより、実行中のsnapサービスの一覧が表示されます。

【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

それでも解決しない場合は、デフォルトで自動接続されないdocker:homeプラグインを手動で接続してから、Dockerサービスを起動してみてください。

3. ターミナルを起動し、以下のコマンドを実行します。

sudo snap connect docker:home :home
sudo snap start docker
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

解決策6:root権限がないユーザー向けの対処法

権限不足により、ユーザーが「unix:///var/run/docker.sock」にアクセスできない場合にも、このエラーは発生します。幸い、回避策があります。TCPのポート2375経由でlocalhostにDocker Host変数をエクスポートしましょう。

  1. ターミナルを開き、以下のコマンドを実行します。
export DOCKER_HOST=tcp://localhost:2375
【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

解決策7:Dockerを再インストールする

上記のいずれの方法でもエラーが解消しない場合は、インストール時点で問題が発生している可能性が高いです。LinuxシステムにDockerを正しく再インストールするために、Docker公式ドキュメントの手順に沿って作業を行ってください。

  1. Windows 8のパスワードを忘れたときのリセット方法|画像・PIN・テキストパスワード完全ガイド

    Windows 8は、Microsoft史上最もセキュリティ性の高いOSとして、ログイン時に利用できる新しいパスワード方式を2つ導入しました。それが「4桁のPIN」と「ピクチャパスワード(画像パスワード)」です。PINを使えば素早くサインインでき、ピクチャパスワードなら写真をなぞるジェスチャで、より直感的かつ楽しくログインできます。とはいえ、従来のテキストパスワードも依然として重要です。ピクチャパスワードやPINをリセットする際には、通常のパスワードが必要になる場面があるためです。 Windows 8のパスワードを忘れてしまった方もご安心ください。本記事では、テキストパスワード、ピクチャパスワ

  2. Windows・Mac・オンラインでGoogle Earthを録画する方法【完全ガイド】

    世界は思っているよりずっと小さいもの。なぜそう言えるのか、ご存じですか?世界中を旅することが夢なら、旅行チケットに何千円も何万円も費やす必要はないかもしれません。Google Earthのようなプラットフォームが、あなたの世界一周の憧れを叶えてくれるからです。場所を入力するだけで、その土地のバーチャルな絶景を楽しむことができます。もちろん、実際にその場所へ足を運ぶ体験には及びません。しかし、例えば近いうちに家族や友人と一緒に旅行に行く予定の場所を、事前にGoogle Earthでバーチャルツアーとして共有したいと思ったことはありませんか?そんなとき、Google Earthの動画はどうやって撮