"Docker 데몬에 연결할 수 없음" 오류를 해결하는 방법

게시 됨: 2022-08-14

Docker 로고를 보여주는 그래픽

Docker는 소프트웨어 컨테이너를 구축하고 실행하기 위한 최고의 플랫폼 중 하나입니다. Swarm 모드의 단일 호스트 또는 여러 분산 노드에서 컨테이너를 사용하는 데 필요한 모든 것이 함께 제공됩니다.

Docker에는 데몬 기반 아키텍처가 있습니다. 컨테이너 생성 및 시작을 담당하는 소프트웨어는 명령을 수락하는 CLI 프로세스와 무관합니다. 즉, 활성 데몬 연결 없이 명령을 실행하려고 하면 CLI에 오류가 표시됩니다. 이 문서에서는 이러한 답답한 메시지를 해결하기 위한 몇 가지 방법을 공유합니다.

문제 증상

Docker CLI는 사용 가능한 데몬 연결에 의존합니다. API 호출을 사용하여 데몬과 상호 작용합니다. 구성된 데몬에 액세스할 수 없는 경우 docker ps , docker rundocker build 와 같은 docker 명령은 다음과 유사한 오류 메시지를 표시합니다.

 $ docker run hello-world:latest
unix:///var/run/docker.sock에서 Docker 데몬에 연결할 수 없습니다.
도커 데몬이 실행 중입니까?

이것은 CLI가 /var/run/docker.sock Unix 소켓을 사용하여 Docker 데몬과 통신을 시도했음을 나타냅니다. 소켓이 열려 있지 않아 연결에 실패했습니다.

1. Docker Daemon 서비스가 실행 중인지 확인

Docker 데몬은 일반적으로 호스트가 재부팅된 후 Docker를 자동으로 시작하는 systemd 서비스에 의해 관리됩니다. 이 서비스가 실행 중인지 확인하여 문제 해결을 시작할 수 있습니다.

 $ sudo systemctl 상태 도커
docker.service - Docker 애플리케이션 컨테이너 엔진
     로드됨: 로드됨(/lib/systemd/system/docker.service; 활성화됨, 공급업체 사전 설정: 활성화됨)
     활성: 비활성(죽음)

서비스는 데몬이 실행 중인 경우 Active: active (running) 을 보고해야 합니다. 위의 예는 데몬이 중지되었음을 의미하는 inactive (dead) 을 보여줍니다.

다음 명령을 사용하여 Docker를 시작합니다.

 $ sudo systemctl 도커 시작

이제 docker CLI 명령을 성공적으로 실행할 수 있어야 합니다.

시스템을 재부팅한 후 Docker가 중지된 상태로 유지되는 것을 확인할 수 있습니다. 서비스를 활성화하여 systemd가 자동으로 시작할 수 있도록 하여 이 문제를 해결할 수 있습니다.

 $ sudo systemctl 도커 활성화
$ sudo systemctl 데몬 다시 로드

daemon-reload 명령은 변경 사항을 적용하기 위해 구성을 다시 로드하도록 systemd에 지시합니다.

2. 수동으로 데몬 시작

Docker 서비스가 설치되지 않은 시스템을 사용하는 경우가 있습니다. dockerd 명령을 사용하여 Docker 데몬을 수동으로 시작할 수 있습니다. 이것은 일반적으로 root 로 실행해야 합니다.

 $ sudo 도커드
INFO[2022-06-29T15:12:49.303428726+01:00] 스타트업

Docker는 명령이 실행되는 동안 계속 액세스할 수 있습니다. Ctrl+C를 사용하여 데몬을 중지합니다.

3. CLI가 올바른 데몬을 대상으로 하는지 확인

CLI가 원격 Docker 데몬 인스턴스에 연결하려고 할 때 문제가 발생할 수 있습니다. 이것은 일반적으로 오류 메시지에 TCP 주소가 표시될 때 발생합니다.

 $ docker run hello-world:latest
tcp:///0.0.0.0:2375에서 Docker 데몬에 연결할 수 없습니다.

이 예에서 docker CLI는 로컬 Unix Docker 소켓 대신 TCP를 사용하여 0.0.0.0:2375 에서 Docker 데몬에 연결하려고 합니다. Docker 데몬의 TCP 지원이 비활성화되어 있거나 네트워크에서 지정된 호스트에 액세스할 수 없는 경우 실패합니다.

일반적으로 사용하려는 데몬 연결에 대한 올바른 Docker CLI 컨텍스트로 전환하여 이 문제를 해결할 수 있습니다.

 $ docker 컨텍스트 사용 기본값

사용 가능한 모든 컨텍스트와 context ls 명령을 사용하여 연결하는 데몬 끝점을 나열할 수 있습니다.

 $ 도커 컨텍스트 ls
이름 설명 도커 엔드포인트             
기본값 * 현재 DOCKER_HOST 기반 구성 unix:///var/run/docker.sock

현재 선택된 컨텍스트는 별표로 강조 표시됩니다.

DOCKER ENDPOINT 열의 예기치 않은 값은 일반적으로 설정되는 DOCKER_HOST 환경 변수로 인해 발생합니다. 다음과 같은 경우 경고가 표시됩니다.

 $ 내보내기 DOCKER_HOST=1.2.3.4
$ 도커 컨텍스트 ls
이름 설명 도커 엔드포인트
기본값 * 현재 DOCKER_HOST 기반 구성 tcp://1.2.3.4:2375
경고: DOCKER_HOST 환경 변수가 활성 컨텍스트를 재정의합니다. 컨텍스트를 사용하려면 전역 --context 플래그를 설정하거나 DOCKER_HOST 환경 변수를 설정 해제하십시오.

셸에 DOCKER_HOST 환경 변수가 있으면 선택한 컨텍스트에서 정의한 끝점을 재정의합니다. 이 예에서 docker 명령은 항상 tcp://1.2.3.4:2375 의 데몬 인스턴스를 대상으로 합니다.

이 문제는 DOCKER_HOST 변수를 지우면 해결할 수 있습니다.

 $ 내보내기 DOCKER_HOST=

Docker는 이제 활성 컨텍스트에 의해 구성된 엔드포인트를 사용합니다. 사용자 정의 컨텍스트를 수동으로 설정하지 않는 한 이것은 /var/run/docker.sock 의 기본 로컬 Unix 소켓이 됩니다.

 $ 도커 컨텍스트 ls
이름 설명 도커 엔드포인트             
기본값 * 현재 DOCKER_HOST 기반 구성 unix:///var/run/docker.sock

4. 권한 문제

Docker 소켓에 대한 잘못된 사용자 권한은 데몬 연결 문제의 또 다른 일반적인 원인입니다. 이러한 종류의 문제는 일반적으로 약간 다른 오류 메시지를 표시합니다.

 $ docker run hello-world:latest
unix:///var/run/docker.sock에서 Docker 데몬 소켓에 연결하는 동안 권한이 거부되었습니다.

이것은 Unix 사용자 계정에 Docker API를 노출하는 소켓과 상호 작용할 수 있는 권한이 없을 때 발생합니다. docker 그룹에 자신을 추가하는 것이 이 문제를 해결하는 가장 좋은 방법입니다.

 $ sudo usermod -aG 도커 $USER

이 변경 사항을 적용하려면 새 셸 창을 열거나 로그아웃했다가 다시 로그인해야 합니다. 이제 권한 문제 없이 docker 명령을 실행할 수 있습니다.

요약

Docker CLI가 현재 구성을 사용하여 Docker 데몬 인스턴스와 통신할 수 없는 경우 "Cannot connect to the Docker daemon"이 나타납니다. 이는 종종 Docker 데몬 서비스가 중지되었거나 비활성화되었기 때문입니다. 오프라인 상태가 된 원격 Docker 호스트에 연결을 시도할 수도 있습니다.

이제 이 문제의 가능한 원인과 이를 해결하는 일반적인 방법을 알고 있어야 합니다. Docker 데몬 설정을 확인하고 Docker 서비스를 다시 시작하고 사용자 계정에 Docker 소켓과 상호 작용할 수 있는 권한이 있는지 확인하여 오류를 해결하십시오.