Docker "Cannot connect to the Docker daemon" 에러, 5가지 원인별 5분 복구 가이드
개발자라면 한 번쯤 마주치는, 가장 짜증 나고 막막한 에러 메시지가 있습니다. 바로 Cannot connect to the Docker daemon at unix:///var/run/docker.sock 입니다.
이 메시지를 보면 대부분의 개발자는 'Docker가 안 돌아가나?'라고 생각하며 재부팅을 시도하거나, 단순히 sudo docker ps를 쳐보며 시간을 낭비하곤 합니다. 하지만 이 에러는 'Docker가 안 돌아가는' 단일 원인이 아니라, 클라이언트(CLI)가 데몬(Daemon)과 통신하는 과정에서 발생하는 5가지 종류의 연결 문제를 통칭하는 증상일 뿐입니다.
이 글은 단순히 "sudo 권한을 주세요"라는 식의 막연한 해결책을 제시하지 않습니다. 여러분의 환경이 데몬 자체의 문제인지, 권한의 문제인지, 아니면 단순히 연결 경로(Context)를 잘못 보고 있는 문제인지, 진단 명령 한 줄로 정확히 짚어내고 5분 안에 복구하는 실전 가이드입니다.
🚨 30초 진단표: 메시지 패턴별 원인 좁히기
막연하게 에러만 보일 때, 이 표를 먼저 참고하세요. 여러분의 상황과 가장 비슷한 '증상/추가 단서'를 찾아, '진단 명령'을 실행하는 것이 가장 빠릅니다.
| 증상/추가 단서 | 의심 원인 | 진단 명령 (복붙) | 해결 명령 (복붙) |
|---|---|---|---|
에러 메시지에 permission denied 명시 | 권한 문제 | ls -l /var/run/docker.sock | sudo usermod -aG docker $USER 후 재로그인 |
systemctl status docker 시 inactive 또는 failed 출력 | 데몬 미기동 | systemctl status docker | sudo systemctl start docker |
docker context ls에서 활성 컨텍스트가 default가 아닌 경우 | 컨텍스트 불일치 | docker context ls | docker context use default |
docker context ls에 rootless 컨텍스트가 보이고, 권한 문제가 의심될 때 | Rootless 모드 | docker context ls | export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock |
| Mac/WSL2에서 CLI는 되나, 실제 컨테이너가 안 보일 때 | 엔진(Daemon) 미실행 | (GUI/WSL2 상태 확인) | Docker Desktop 재시작 또는 wsl --shutdown |
⚙️ 원인 ①: Docker 데몬 자체가 꺼져 있는 경우 (가장 흔함)
가장 단순하지만, 가장 놓치기 쉬운 경우입니다. Docker 서비스 자체가 운영체제 레벨에서 실행되고 있지 않은 경우입니다.
🔍 진단 명령 (복붙):
systemctl status docker💡 출력 해석:
만약 출력 결과의 Active: 부분이 inactive (dead) 또는 failed로 나온다면, 데몬 프로세스가 현재 작동하지 않고 있다는 명확한 신호입니다.
🛠️ 해결 명령 (복붙):
sudo systemctl start docker
sudo systemctl enable docker # 부팅 시 자동 시작을 원할 경우Tip: 만약 sudo 없이 docker ps를 쳤을 때 권한 에러가 나면서, sudo docker ps는 성공한다면, 이는 권한 문제(원인 ②)일 가능성이 높습니다.
🛡️ 원인 ②: 사용자 권한 문제 (Permission Denied)
리눅스 환경에서 가장 많이 부딪히는 장벽입니다. Docker 소켓 파일(/var/run/docker.sock)의 소유 그룹이 docker로 되어 있는데, 현재 사용자가 이 그룹에 속해 있지 않아 접근 권한이 거부되는 경우입니다.
🔍 진단 명령 (복붙):
ls -l /var/run/docker.sock💡 출력 해석:
출력 결과에서 소유 그룹(Group)이 docker로 되어 있고, 에러 메시지에 명확하게 permission denied가 포함되어 있다면 이 케이스가 99% 확실합니다.
🛠️ 해결 명령 (복붙):
sudo usermod -aG docker $USER
# 변경 사항을 즉시 적용하기 위해 로그아웃 후 재접속하거나, 아래 명령 실행
newgrp docker주의: sudo docker ps로 임시 테스트는 가능하지만, 이는 임시방편일 뿐입니다. 근본적으로 사용자를 docker 그룹에 추가해야 합니다.
🔗 원인 ③: 컨텍스트(Context) 또는 소켓 경로 불일치
Docker는 여러 환경(로컬, 원격 서버, Docker Desktop 등)을 오가며 작업할 수 있도록 '컨텍스트' 개념을 사용합니다. 이 컨텍스트가 엉뚱한 소켓 경로를 바라보고 있을 때 발생합니다.
🔍 진단 명령 (복붙):
docker context ls
echo $DOCKER_HOST💡 출력 해석:
docker context ls를 실행했을 때, 현재 활성화된 컨텍스트(* 표시)가 여러분이 작업하려는 환경(예: 로컬 머신)과 다르게 설정되어 있을 수 있습니다. 혹은 DOCKER_HOST 환경 변수가 잘못 설정되어 있을 수 있습니다.
🛠️ 해결 명령 (복붙):
docker context use default
# 만약 DOCKER_HOST가 설정되어 있다면, 임시로 제거해봅니다.
unset DOCKER_HOST이 경우, 데몬은 정상 작동하지만 클라이언트가 '여기가 아니라 저기'의 소켓을 찾으려고 시도하는 상황입니다.
👤 원인 ④: Rootless 모드 사용 환경의 소켓 경로 문제
보안 강화를 위해 Docker를 rootless 모드로 구동하는 추세가 늘고 있습니다. 이 모드는 시스템 기본 경로(var/run/docker.sock) 대신 사용자별 임시 경로(/run/user/...)를 사용합니다.
🔍 진단 명령 (복붙):
docker context ls
# rootless 관련 컨텍스트가 활성화되어 있는지 확인💡 출력 해석:
만약 rootless 관련 컨텍스트가 활성화되어 있고, 이 환경에서 다른 기본 명령어(docker ps)를 실행할 때 에러가 발생한다면, 클라이언트가 rootless 환경의 소켓을 바라보고 있지만, 실제 데몬이 제대로 시작되지 않았을 수 있습니다.
🛠️ 해결 명령 (복붙):
# 1. 환경 변수를 정확한 rootless 소켓으로 지정
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
# 2. 사용자 레벨에서 데몬 재시작 시도 (systemctl --user)
systemctl --user start docker이 경우, 시스템 전체의 서비스(System Daemon)가 아닌, 현재 사용자 세션(User Daemon) 레벨에서 서비스를 관리해야 합니다.
💻 원인 ⑤: Docker Desktop 또는 WSL2 통합 문제 (Mac/WSL2 한정)
Mac이나 Windows의 WSL2 환경에서 Docker를 사용할 때 가장 흔하게 겪는 문제입니다. CLI는 설치되어 있지만, 실제 컨테이너 엔진(Daemon)이 GUI 애플리케이션(Docker Desktop)에 의해 구동되어야 하는데, 이 엔진이 꺼져 있거나 WSL2 통합이 비활성화된 경우입니다.
🔍 진단 명령 (복붙):
- Mac: Docker Desktop 앱의 상태 표시줄 아이콘 확인
- WSL2:
wsl -d <DistroName>실행 후, Docker Desktop 설정에서 WSL Integration이 켜져 있는지 확인
💡 출력 해석: CLI 명령어만으로는 알 수 없습니다. GUI 애플리케이션의 상태가 'Running'이 아니거나, WSL2 설정에서 해당 배포판에 대한 통합(Integration)이 꺼져 있다면, 클라이언트는 연결할 대상 자체를 찾지 못합니다.
🛠️ 해결 명령 (복붙):
- Mac: Docker Desktop 앱을 완전히 종료했다가 다시 실행합니다.
- WSL2: 터미널에서 다음 명령어를 실행하여 WSL2의 모든 가상 환경을 종료한 후, 다시 시작합니다.
Bash
wsl --shutdown # 이후, WSL2 터미널을 새로 열고 docker 명령 실행
💡 실무자의 경험적 조언:
저는 이 에러를 겪을 때, '내가 지금 어떤 환경에서 작업하고 있는가?'를 가장 먼저 질문합니다. 로컬 개발 환경이라면 Docker Desktop의 상태를, CI/CD 환경이라면 systemctl status를, 그리고 컨테이너 오케스트레이션 환경이라면 docker context를 점검하는 습관을 들이는 것이 좋습니다. 이 에러는 결국 '어디서', '누가', '무엇을' 바라보고 있는지를 묻는 질문이니까요.
📝 재발 방지 체크리스트
- 권한:
sudo사용을 최소화하고, 사용자 계정을docker그룹에 영구적으로 추가했는지 확인합니다. - 환경: 작업 시작 전,
docker context ls를 통해 현재 활성 컨텍스트가 의도한 환경인지 확인하는 습관을 들입니다. - 엔진: Mac/WSL2 사용자는 항상 Docker Desktop의 상태 표시줄을 확인하여 엔진이 살아있는지 시각적으로 확인합니다.
자주 묻는 질문 (FAQ)
Q. sudo docker ps는 왜 되는데, docker ps는 안 되나요?
A. 이는 전형적인 권한 문제입니다. sudo를 사용하면 시스템 관리자 권한(root)으로 명령을 실행하기 때문에, 권한 문제가 발생하지 않고 소켓에 접근할 수 있기 때문입니다. 근본 해결책은 사용자 계정을 docker 그룹에 추가하는 것입니다.
Q. docker context use default를 했는데도 여전히 에러가 납니다.
A. 컨텍스트 설정이 아닌, Docker Desktop(또는 Docker Engine) 자체가 백그라운드에서 제대로 구동되지 않았을 가능성이 높습니다. 이 경우, 해당 엔진을 재시작하거나 WSL2의 경우 wsl --shutdown을 통해 엔진을 초기화해야 합니다.
Q. systemctl status docker가 active (running)인데도 연결이 안 돼요.
A. 이 경우, 소켓 파일의 권한 문제이거나 (원인 ②), 혹은 Docker Desktop과 같은 GUI 레이어가 시스템 서비스와 충돌하고 있을 수 있습니다. 이 때는 ls -l /var/run/docker.sock을 통해 소유 그룹을 재확인하는 것이 필수적입니다.
이 글은 AI 에이전트가 1차 초안을 작성한 뒤, 사람 편집자가 사실관계·출처·톤과 맥락을 검토하여 발행했습니다. 오류나 부정확한 내용이 확인되면 24시간 이내에 정정합니다.
댓글
불러오는 중...