Computer >> 컴퓨터 >  >> 문제 해결 >> Linux

[해결] 'unix:///var/run/docker.sock'에서 Docker 데몬에 연결할 수 없는 오류 수정 방법

Docker는 컨테이너를 활용해 애플리케이션을 손쉽게 생성, 배포, 실행할 수 있다는 장점 덕분에 그 인기가 날로 높아지고 있습니다. 컨테이너를 사용하면 개발자가 애플리케이션과 필요한 모든 라이브러리, 의존성을 하나의 완전한 패키지로 묶어 배포할 수 있습니다. Linux에 Docker를 설치하는 일은 비교적 간단합니다. 터미널에서 몇 가지 명령어만 실행하면 바로 사용할 준비가 끝납니다.

하지만 설치가 성공적으로 완료된 후에도 모든 사용자에게 순조롭지만은 않습니다. 가장 흔히 발생하는 오류 중 하나가 바로 다음과 같습니다: Cannot connect to the Docker daemon at (unix:///var/run/docker.sock. Is the docker daemon running?) 이 오류는 docker run, docker info, docker pull, docker stop 등 다양한 docker 명령을 실행할 때 나타날 수 있습니다.

Docker 데몬 연결 오류의 원인은 무엇일까요?

수많은 개발자들의 불만 접수를 받고 문제를 깊이 분석하여 효과적인 해결책을 마련했습니다. 이 오류를 유발하는 주요 원인은 다음과 같습니다.

  • Docker 데몬이 실행 중이 아닌 경우
  • Docker가 정상적으로 종료(shutdown)되지 않은 경우
  • docker 서비스를 시작할 루트 권한(root privileges)이 없는 경우

문제의 원인을 어느 정도 파악했으니, 이제 사용 가능한 여러 해결 방법을 하나씩 살펴보겠습니다.

해결 방법 1: systemctl 명령으로 Docker 서비스 시작하기

Ubuntu에 Docker를 새로 설치했거나 PC를 재부팅한 직후라면 Docker 서비스가 실행 중이 아닐 가능성이 매우 높습니다. Docker 데몬(dockerd)은 Docker의 시스템 서비스로, 이미지, 컨테이너, 네트워크, 볼륨 같은 다양한 Docker 객체를 처리하고 Docker API 요청을 수신하는 역할을 합니다.

systemctl 명령은 기존 SysV init 시스템을 대체하는 도구로, Linux 시스템에서 실행 중인 systemd 서비스를 관리합니다. 시스템에 systemctl이 없더라도 걱정하지 마세요. 아래에서 설명하는 service 명령을 사용하면 됩니다.

참고: 이 방법은 APT 패키지 관리자로 Docker를 설치한 사용자에게만 적용됩니다. SNAP으로 Docker를 설치했다면 아래의 해결 방법 5를 참조하세요.

  1. 터미널을 열고 첫 번째 명령인 docker unmask를 실행합니다.
sudo systemctl unmask docker

docker가 masked(마스크) 상태일 때 docker 서비스를 시작하려고 하면 'Failed to start docker.service: Unit is masked.'라는 오류가 발생할 수 있습니다. 마스크는 비활성화(disable)보다 더 강력한 조치로, 유닛 파일이 마스크되면 해당 유닛은 '/dev/null'에 연결됩니다. '$ systemctl list-unit-files' 명령으로 모든 유닛 파일의 상태를 확인할 수 있습니다.

2. docker 유닛이 마스크 해제(unmask)되면 systemctl 명령으로 Docker 데몬을 시작할 수 있습니다. Docker 데몬은 이미지, 컨테이너 같은 Docker 객체와 Docker API 요청을 관리합니다. 아래 명령을 터미널에서 실행하세요.

systemctl start docker

3. docker 서비스가 활성화되어 정상적으로 실행 중인지 확인하려면 특정 서비스의 현재 상태를 보여주는 systemctl status 명령을 사용합니다. 터미널에서 아래 명령을 실행하세요.

systemctl status docker

출력 결과에서 docker가 활성화(active)되어 실행 중(running)임을 확인할 수 있습니다.

해결 방법 2: 'Docker Pull 실패' 정리 후 Docker 서비스 시작하기

컨테이너를 pull하는 도중 Docker를 예기치 않게 종료하는 경우가 있을 수 있습니다. 이런 상황에서는 docker.servicedocker.socket 파일이 마스크될 수 있습니다. Docker.socket은 '/var/run/docker.sock' 경로에 위치한 파일로, Docker 데몬과 통신하는 데 사용됩니다. 따라서 Docker를 시작하기 전에 docker.service와 docker.socket 두 유닛 파일을 먼저 마스크 해제해야 합니다.

  1. 터미널을 실행하고 아래 명령어를 차례대로 입력하세요.
systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service

위 명령어를 실행한 후에도 여전히 오류가 발생한다면, Docker를 다시 시작하기 전에 Containerd 디렉터리의 파일을 삭제해야 합니다. Containerd는 Docker 1.11부터 도입된 기능으로, Docker 이미지의 라이프사이클을 관리하는 데 사용됩니다.

2. 터미널을 열고 아래 명령어를 실행하세요. 명령 실행에 상승된 권한(elevated privileges)이 필요하므로 루트 비밀번호를 미리 확인해 두어야 합니다.

sudo su
service docker stop
cd /var/run/docker/libcontainerd
rm -rf containerd/*
rm -f docker-containerd.pid
service docker start

해결 방법 3: Dockerd(Docker 데몬) 서비스 직접 시작하기

Dockerd는 Docker API 요청을 수신하고 다양한 Docker 객체를 관리하는 Docker 데몬입니다. dockerd는 Docker 데몬을 시작하는 '$ systemctl start docker' 명령의 대안으로 활용할 수 있습니다.

  1. 터미널을 열고 아래 명령을 실행하여 dockerd를 시작합니다.
sudo dockerd

해결 방법 4: service 명령으로 Docker 시작하기

SysV init 시스템을 사용 중이라면 systemctl 명령이 작동하지 않습니다. 이 경우 service 명령을 사용해 Docker 데몬을 시작해야 합니다.

  1. 터미널을 실행하고 아래 명령어를 입력하세요.
sudo service --status-all
sudo service docker start

해결 방법 5: Snap으로 Docker 서비스 시작하기

Snap 패키지 관리자로 Docker를 설치한 경우에는 snap 명령을 사용해 Docker 데몬을 관리해야 합니다.

일반적으로 Snap은 서비스를 자동으로 관리하지만, 이번 오류처럼 특정 상황에서는 수동 개입이 필요할 수 있습니다. snap 명령과 함께 사용할 수 있는 인자로는 stop, start, restart 등이 있으며, 여기서는 start 파라미터를 사용하겠습니다.

  1. 터미널을 열고 아래 명령을 실행하여 Docker를 시작합니다.
sudo snap start docker

2. 아래 명령을 실행하여 Docker 서비스가 시작되었는지 확인합니다.

sudo snap services

이 명령을 실행하면 현재 실행 중인 모든 snap 서비스 목록이 표시됩니다.

위 명령어들이 작동하지 않는다면, 기본적으로 자동 연결되지 않는 docker:home 플러그를 수동으로 연결해 보세요. 연결이 완료되면 Docker 서비스를 시작합니다.

3. 터미널을 실행하고 아래 명령어를 입력하세요.

sudo snap connect docker:home :home
sudo snap start docker

해결 방법 6: 루트 권한이 없는 사용자를 위한 Docker 시작 방법

이 오류는 상승된 권한이 없어 사용자가 'unix:///var/run/docker.sock' 소켓 파일에 접근할 수 없는 경우에도 발생할 수 있습니다. 다행히 이를 우회할 방법이 있습니다. Docker Host 변수를 로컬호스트의 2375 포트로 내보내는(export) 것입니다.

  1. 터미널을 열고 아래 명령을 실행합니다.
export DOCKER_HOST=tcp://localhost:2375

해결 방법 7: Docker 재설치하기

위의 해결 방법들로도 오류가 해결되지 않는다면, 초기 설치 과정에서 오류가 발생했을 가능성이 높습니다. 이 경우 Linux 시스템에 Docker를 올바르게 재설치하는 것이 좋으며, Docker 공식 웹사이트에서 제공하는 설치 가이드의 단계를 그대로 따르는 것이 가장 안전합니다.