デーモンが実行中に「Dockerデーモンに接続できません」というメッセージが表示されるのはなぜですか?

デーモンが実行中に「Dockerデーモンに接続できません」というメッセージが表示されるのはなぜですか?

Dockerサービスは明らかに実行中です。

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

しかし、Docker自体はDockerとの会話を拒否します。

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

私は走っている基本ドッカーの設定/etcつまり、このサービスに関連するファイルを変更していません。

ここで何が間違っている可能性がありますか?

ベストアンサー1

この質問はすでに回答されていますが、ここに追加情報があります。

Arch を使用しても Fedora や Ubuntu などの他のディストリビューションを使用しても、Docker はソケットファイルを使用して通信します。コマンドを実行すると、dockerこのソケットを使用してDockerデーモンと通信します。もちろん、デーモンは実行中でなければなりませんが(通常はデフォルトでは無効になっています)、ユーザーがソケットにアクセスできない場合はデーモンとも通信できません。

まず、デプロイメントリポジトリからDockerをインストールする必要があります。インストールスクリプトをダウンロードしてシェル(curl ... | sh)にパイプする人もいますが、簡単に更新できるようにリポジトリからインストールすることをお勧めします。

アーチ:

# pacman -S docker

Fedora:

# dnf install docker

上記のように、デーモンはデフォルトで無効になっている可能性があります。 Dockerを使用するには、デーモンが実行されている必要があります。

有効にします(起動時に起動します)。

# systemctl enable docker

今すぐ起動(または再起動):

# systemctl start docker

Dockerソケットはデフォルトでルートが所有します(dockerグループがない場合)。

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

これが一般ユーザーがdockerデーモンと会話できない理由です。一般ユーザーにはソケットにアクセスする権限がありません。デーモンにアクセスできないため、デーモンが実行されていないとし、次のエラーを表示します。Cannot connect to the Docker daemon. Is the docker daemon running on this host?

これは多くの人がsudo

docker理想的には、Dockerをインストールすると、名前付きグループが作成されます。ただし、デーモンの起動時にグループが存在しない場合、ソケットファイルはルートが所有します。

場合によっては、グループが別の名前を持っていたことがありました。dockerrootFedoragrep docker /etc/groupシステムにそのようなグループがあることを確認してください。すでにこのグループを使用している場合(ユーザーがグループに属している場合)、これを使用するようにDockerを設定する必要があります。

/etc/sysconfig/docker以下を追加します-G dockerroot(注:これは回避策であり、最善の解決策ではありません)。

OPTIONS='--selinux-enabled -G dockerroot'

デーモンを再起動すると、ユーザーはソケットにアクセスできます。

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

それ以外の場合、正式な方法は名前付きグループを使用することですdocker。存在する場合、Dockerはそれを自動的に使用します。つまり、ソケットグループをこのグループに設定します。存在しない場合は、それを作成してデーモンを再起動するだけです。

# groupadd docker
# systemctl restart docker

ソケットファイルは次のグループが所有します。

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

dockerソケットにアクセスするには、ユーザーがこのグループに属している必要があります。

# usermod -aG docker (user)

グループにいることを確認するには、ログアウトして再度ログイン(またはsu - (user)実行)する必要があるかもしれません。id

その後、sudo / rootなしでDockerを使用できます。

$ docker version --format '{{.Server.Version}}'
1.9.1

最後に警告の申し上げます。信頼できるユーザーだけがDockerデーモンを制御できる必要があります。。バラよりhttps://docs.docker.com/engine/security/security/
(もちろんsudoも同じです。信頼できるユーザーだけがグループに属しているwheel必要があります。)

おすすめ記事