데몬이 실행 중일 때 왜“Docker 데몬에 연결할 수 없습니다”가 표시됩니까?


29

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 info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

기본 Docker 구성을 실행 중입니다. 즉, /etc이 서비스와 관련된 파일을 변경하지 않았습니다 .

여기서 무엇이 문제가 될 수 있습니까?

답변:


36

명령 을 실행 하려면 docker그룹 에 자신추가하고 그룹 을 활성화 (로그 아웃했다가 다시 실행하거나 실행 newgrp docker)해야 docker합니다. 오류 메시지는 오해의 소지가 있습니다.


1
실제로 오도하지 않습니다. 그것은 수없는 고정 표시기 데몬에 연결합니다. "데몬이 실행 중입니까?" 그냥 추측했다.
Bratchley

2
sudo gpasswd -a alex docker
Alex Punnen

1
sudo gpasswd -a $ USER docker # 모든 사용자 이름에서 작동
priomsrb

나는 이것을했는데 여전히 작동하지 않았다. 러닝 sudo systemctl start docker을 고정 데몬은 정말 실행되지 ...
nakamin

32

이 질문은 이미 답변되었지만 추가 정보가 있습니다.

Archer 또는 Fedora 또는 Ubuntu와 같은 다른 배포판에 관계없이 Docker는 소켓 파일을 사용하여 통신합니다. docker명령 을 실행할 때이 소켓을 사용하여 Docker 데몬과 통신합니다. 물론 데몬이 실행 중이어야하며 기본적으로 자주 비활성화되어 있지만 사용자가 소켓에 액세스 할 수 없으면 데몬과도 통신 할 수 없습니다.

먼저 배포 저장소에서 Docker를 설치합니다. 어떤 사람들은 설치 스크립트를 다운로드하여 쉘 ( curl ... | sh)로 파이프 하지만 저장소에서 설치하여 쉽게 업데이트 할 수 있도록하는 것이 좋습니다.

아치:

# pacman -S docker

페도라 :

# dnf install docker

위에서 언급했듯이 데몬은 기본적으로 비활성화되어 있습니다. Docker를 사용하려면 데몬이 실행 중이어야합니다.

활성화 (부팅시 시작) :

# systemctl enable docker

지금 시작하십시오 (또는 재부팅).

# systemctl start docker

이제 기본적으로 (Docker 그룹이없는 경우) Docker 소켓은 root가 소유합니다.

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

이것이 일반 사용자가 도커 데몬과 대화 할 수없는 이유입니다. 일반 사용자에게는 소켓에 액세스 할 수있는 권한이 없습니다. 데몬에 도달 할 수 없으므로 실행 중이 아니라고 가정 하고이 오류를 표시합니다.Cannot connect to the Docker daemon. Is the docker daemon running on this host?

많은 사람들이 단순히 모든 Docker 명령을 루트로 시작하는 이유 sudo입니다. 그러나 다른 답변에서 설명한 것처럼 Docker에는 자체 메커니즘이 있으므로 sudo를 사용할 필요가 없습니다.

이상적으로 docker는 Docker를 설치할 때라는 그룹 이 생성됩니다. 그러나 데몬이 시작될 때 해당 그룹이 존재하지 않으면 소켓 파일은 루트가 소유합니다.

경우에 따라 해당 그룹 dockerroot은 Fedora 와 같이 다른 이름을 사용했습니다 . grep 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가 있으면 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그룹에 있어야합니다 .)


1
이것은 원래 질문에 대답하지 않는 것 같습니다.
l0b0

4
@ l0b0 : 글쎄, 왜 이런 일이 일어나고 있는지 설명하고 싶었습니다. 누군가에게 도움이되기를 바랍니다. 사용자를 그룹에 추가하는 usermod 명령은 답변의 중간 부분에 숨겨져 있습니다. 이 답변이 도움이되지 않으면 알려주세요. 삭제할 수 있습니다.
basic6

4
예, 아치에 대한 해결책을 제시하고 설명합니다.
kodeart

이 모든 작업을 수행했지만 여전히 OP에서 언급 한 문제가 발생합니다. 권한 관련 단계 중 어느 것도 문제를 해결하지 못했습니다.
mopsyd

3

sudo usermod -aG docker [사용자 이름]

그런 다음 로그 아웃 한 후 다시 로그인하십시오.


1

내 리눅스 시스템 에서이 문제를 해결하기 위해 약간의 연구를 한 후에 나는이 대답을 쓸 것이라고 생각했습니다. 다음은 문제를 해결하기 위해 수행 한 작업입니다.

페도라 22에서

Docker 설치 :

$> curl -fsSL https://get.docker.com/ | sh

Docker를 설치 한 후 :

docker 그룹에 사용자를 추가해야합니다.

$> sudo usermod -aG docker

도커 데몬을 시작해야합니다

$> sudo service docker start

부팅 할 때 데몬을 시작하도록 설정할 수 있습니다

$> sudo chkconfig docker on

도커 서비스가 실행 중인지 확인할 수 있습니다

$> service docker status

그리고 마지막 마지막 확인

$> docker run hello-world

완전한 예를 보려면 +1이지만, 이러한 명령 중 많은 것이 내 상황에 적용되지 않습니다 ( + 대신을 pacman사용하여 설치 ). systemctlservicechkconfig
l0b0

1

Fedora 23 또는 Redhat 변형을 사용 /etc/sysconfig/docker하는 경우 다음을 편집 하고 수정하십시오.

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

도커를 다시 시작하십시오.

이 그룹을 시스템에 추가하고 자신을 그룹에 추가하십시오.



1

다음과 같이 도커 엔진을 시작한 경우 : sudo service docker start

'docker'그룹에 자신을 추가 한 경우에도 일반 사용자와 연결할 수 없습니다.

sudo service docker stop으로 간단히 중지 할 수 있습니다.

일반 사용자로 시작하십시오 : service docker start


docker group지금까지 사용자를 추가 할 필요가 없었습니다 . sudo service start나를 위해 일했다. 그러나 새로운 것이 있는지 관찰 할 것입니다.
stupidnetizen

0

나도 같은 문제가 있었다. docker-daemon 및 docker-client에 할당 된 소켓에 문제가 있습니다.

  1. 먼저 docker.sock의 docker-client에 대한 권한이 설정되지 않았습니다. sudo usermod -aG docker $USER

  2. 그런 다음 docker-client가 실행중인 bash 파일을 확인하십시오. 나를 위해 docker-daemon이 유닉스 소켓에서 실행되는 동안 0.0.0.0:2375로 설정되었습니다. dockerd의 구성 파일에서 설정되었습니다.

  3. 문제의 행을 주석 처리하면 제대로 작동합니다.

  4. 그러나 유닉스 소켓 대신 TCP 포트에서 작동하게하려면 dockerd의 구성 파일을 변경하고 0.0.0.0.2375로 설정 한 다음 줄을 그대로 bash에 그대로 두거나 0.0으로 설정하십시오. 0.0 : 2375.


0

다음은 다음을 수정하기 위해 수행 한 단계입니다.

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. 도커 그룹에 자신을 추가하십시오

    usermod -aG docker $USER

  2. docker socker 및 명령에 대한 권한을 수정하십시오.

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. docker 명령을 위해 구성 환경에 변수 추가

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. 나머지 도커

    sudo systemctl restart docker

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.