DockerでCouldn't connect to Docker daemonが出る場合の原因と解決方法

公開日:2019/07/13 更新日:2019/07/13
DockerでCouldn't connect to Docker daemonが出る場合の原因と解決方法のサムネイル

はじめに

Dockerをいざ使おうとした時に、Dockerのコマンド実行時にERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?というエラーが表示されました。この記事ではこのエラーの原因と解決方法をまとめます。

エラーの内容

DockerとDocker Composeをインストールし、いざDockerとDocker Composeを使おうとコマンドを実行したところ、以下のようなエラーが表示されました。

$ docker-compose run web rails new . --force --database=mysql --skip-bundle
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

上記はRails環境を構築しようとした際に使ったDocker Compoesのコマンドですが、他のDockerコマンドやdocker-composeに続く内容に関わらず表示されるエラーです。

Couldn't connect to Docker daemonの原因

これは、「Dockerデーモンに接続できなかった」という内容で、Dockerの使用権限がデフォルトではrootのみに与えられており、root権限を持たない通常ユーザでDockerのコマンドを実行したことが原因です。なぜデフォルトではrootにのみ使用権限が与えられているかというと、DockerではUnixソケットを使用しますが、このUnixソケットの使用権限がrootにしか付与されていません。 そのため、Docker、Docker Composeは実行時にroot権限が必要となります。

したがって、解決方法は以下の2つが考えられます。

  • sudoを使う
  • dockerグループを作成して、そこに通常ユーザを加える

上記2つについてそれぞれ説明します。

sudoを使う

これは簡単で、具体的には以下のようにsudoを付けて実行すれば解決です。

$ sudo docker-compose run web rails new . --force --database=mysql --skip-bundle

毎回sudoを使うのが面倒な場合は、2番目の解決策が参考になると思います。

dockerグループを作成して、そこに通常ユーザを加える

dockerという名前のグループを作成し、そこに通常ユーザを追加します。

dockerグループを確認、作成する

環境によってはすでにdockerグループが作成されている場合もありますので、以下のコマンドで一度グループ一覧を確認してみます。

$ cat /etc/group | grep docker
docker:x:999:

私の環境では、DockerとDocker Compoesをインストールした時点で上記のようにすでにdockerグループが作成されていました。 もし、上記コマンド結果に何も出力されない場合は、以下でdockerグループを作成します。

$ sudo groupadd docker

通常ユーザをdockerグループに追加する

続いて以下のコマンドで通常ユーザをdockerグループに追加します。

$ sudo usermod -aG docker $USER

上記の$USERは、環境変数で現在ログイン中の通常ユーザのユーザ名です。 上記を実行後、以下で通常ユーザが属するグループを確認してみると、dockerグループが所属するグループとして含まれていることを確認できます。tarouというのが通常ユーザです。

$ groups $USER
tarou : tarou adm cdrom sudo dip plugdev lpadmin sambashare kvm libvirt docker

グループの追加を反映させるには、ログインし直す必要があるので、一度ログアウトして再ログインしてください。 後は以下のようにsudoなしでもDocker、Docker Composeを使用できるようになります。

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

WARNINGが出る場合

もし上記のdockerグループに追加する対策をする前に、sudoを実行してDockerコマンドを実行した場合は、ホームディレクトリ直下に.dockerというディレクトリが作成されています。このディレクトリが残った状態で上記のdockerグループに追加する対策をした後に、sudoなしでDockerのコマンドを実行すると以下のような警告が出る場合があります。

WARNING: Error loading config file: /home/tarou/.docker/config.json -
stat /home/tarou/.docker/config.json: permission denied

これは、作成された.dockerディレクトリのパーミッションがroot権限になってしまっているために出る警告です。これを解決するには、一度.dockerディレクトリを削除します。.dockerは、削除してもDockerコマンド実行時に自動で再作成されます。 もしくは、以下のようにroot権限から通常ユーザに権限を付与してももちろん大丈夫です。

$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R

参考文献

以下の公式ドキュメントにしっかりと書いてありました。

docs.docker.com

This section contains optional procedures for configuring Linux hosts to work better with Docker. Manage Docker as a non-root user The Docker daemon binds to a Unix socket instead of...

まとめ

Dockerを使い始めた時に遭遇しやすいエラーだと思います。同じようなエラーに遭遇している方の参考になれば幸いです。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。