Docker: docker 데몬 소켓에 연결할 수 없음 (unix:///var/run/docker.sock)
안녕하세요, BlueByte입니다. docker ps나 docker build가 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?로 멈추면, Docker CLI 자체는 정상입니다 — 모든 명령을 넘겨주는 백그라운드 서비스(데몬)에 닿지 못한 것뿐입니다. 증상은 아무 docker 명령이나 즉시 그 줄과 함께 실패하거나, 가까운 사촌 격인 permission denied while trying to connect to the Docker daemon socket으로 실패하는 것입니다. 오늘은 소켓이 무엇인지, CLI가 소켓에 닿지 못하는 세 가지 이유, 어느 쪽인지 확인하는 법, 원인별 해결과 예방까지 하나씩 짚어보겠습니다.
이 메시지와 permission-denied 변형이 알려주는 것
입력하는 docker 명령은 클라이언트일 뿐입니다. 이 명령은 /var/run/docker.sock의 Unix 소켓을 통해 오래 떠 있는 데몬과 대화하며, 모든 build·run·ps는 사실 그 소켓을 건너 보내는 요청입니다. 두 에러 문자열은 요청이 도착하지 못했음을 뜻합니다:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock비슷해 보이지만 원인은 다릅니다. 첫 번째는 아무도 응답하지 않았다는 뜻 — 데몬이 꺼져 있거나 CLI가 엉뚱한 엔드포인트를 향한 것입니다. 두 번째는 데몬이 떠 있고 응답했지만 커널이 소켓 파일에 대한 당신의 접근을 거부한 것입니다. 무엇을 바꾸기 전에 어느 쪽을 받았는지 먼저 읽으세요.
CLI가 소켓에 닿지 못하는 세 가지 이유
두 변형 모두 다음 중 하나로 귀결됩니다:
- 데몬이 실행 중이 아님 —
docker서비스가 멈췄거나 실패해 소켓에 리스너가 없습니다. - 사용자가
docker그룹에 없음 — 데몬은 떠 있지만 소켓 소유자가root:docker라 당신 계정이 열 수 없어permission denied가 납니다. - CLI가 엉뚱한 엔드포인트를 향함 — Docker context나 남아 있는
DOCKER_HOST가 존재하지 않는 원격·rootless 소켓으로 명령을 보냅니다.
먼저, 데몬이 정말 실행 중인지 확인하기
짐작하지 말고 systemd에 물어보세요:
sudo systemctl status docker● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled)
Active: inactive (dead) since Mon 2026-09-15 09:02:11 KSTActive: inactive (dead)나 failed면 데몬이 꺼진 것 — 그게 Cannot connect의 원인입니다. active (running)이면 데몬은 정상이고 문제는 아래의 권한이나 context입니다.
멈춘 데몬 고치기: 시작하고 부팅 시 자동 시작으로 설정
서비스를 시작하고, 재부팅에 발목 잡히지 않도록 자동으로 올라오게 설정하세요:
sudo systemctl start docker
sudo systemctl enable docker.serviceActive: active (running) since Mon 2026-09-15 09:05:40 KSTstart가 실패하면 journalctl -u docker --no-pager -n 50으로 로그를 읽으세요 — 잘못된 /etc/docker/daemon.json이 데몬이 올라오지 못하는 흔한 이유입니다.
permission denied 고치기: 사용자를 docker 그룹에 추가
데몬이 실행 중인데 permission denied가 나면 당신 계정이 root 소유 소켓을 열 수 없는 것입니다. 자신을 docker 그룹에 넣고 그룹 멤버십을 다시 읽어들이세요:
sudo usermod -aG docker $USER
newgrp dockernewgrp docker는 전체 로그아웃 없이 현재 셸에 새 그룹을 적용합니다. 분명히 짚어둘 점 하나 — docker 그룹은 root 수준 권한을 부여합니다. 그룹에 속한 누구든 호스트 전체를 마운트하는 컨테이너를 띄울 수 있으니 신뢰하는 사용자만 추가하세요.
엉뚱한 context나 DOCKER_HOST를 향한 CLI 고치기
데몬이 떠 있고 그룹에도 속했는데 여전히 연결하지 못하면 CLI가 다른 곳을 향하는 것일 수 있습니다. context를 나열해 무엇이 활성인지 보세요:
docker context lsNAME DESCRIPTION DOCKER ENDPOINT ERROR
default * unix:///var/run/docker.sock
remote tcp://10.0.0.9:2375*가 활성 context를 표시합니다. 닿지 않는 원격·rootless context에 가 있으면 되돌리세요:
docker context use default남아 있는 override도 확인하세요 — echo $DOCKER_HOST. 의도치 않게 설정된 tcp://나 rootless unix://.../docker.sock가 찍히면 unset DOCKER_HOST 후 다시 시도하세요.
실제 사례: sudo로는 되는데 그냥은 안 될 때
Docker를 설치하고 docker ps를 실행하면 permission denied while trying to connect to the Docker daemon socket이 납니다. sudo docker ps는 되니 데몬은 실행 중이고 당신 계정만 접근 권한이 없다는 뜻입니다. 모든 명령 앞에 sudo를 붙이는 대신 sudo usermod -aG docker $USER와 newgrp docker를 실행합니다. 이제 셸이 docker 그룹을 지녀 소켓을 열 수 있으니 docker ps가 sudo 없이 동작합니다.
소켓이 끝까지 응답하는지 확인하기
클라이언트·소켓·데몬 전체 경로가 도는지 증명하세요:
docker run hello-worldHello from Docker!
This message shows that your installation appears to be working correctly.docker version은 조용한 확인법입니다 — Client 섹션만이 아니라 Server 섹션까지 찍히면 CLI가 데몬에 닿은 것입니다. Server 블록이 없으면 아직 연결되지 않은 것입니다.
재발을 막기 — 그리고 "Error response from daemon"과의 차이
재부팅에도 살아남도록 서비스를 enable(systemctl enable docker.service)하고, 평소 쓰는 사용자를 docker 그룹에 유지하고, 셸 프로필에 DOCKER_HOST를 전역으로 설정해 모든 프로젝트를 조용히 리다이렉트하는 일을 피하세요. 끝으로 이것을 docker: Error response from daemon: ...과 혼동하지 마세요. 그 메시지는 CLI가 데몬에 닿았다는 뜻입니다 — 연결은 됐고 데몬이 특정 요청(잘못된 이미지 이름, 포트 충돌)을 거부한 것입니다. Error response from daemon이 보이면 소켓 보기를 멈추세요. 연결은 정상이고 문제는 명령 자체입니다.
관련 질문
sudo docker는 되는데 그냥 docker는 안 됩니다. 왜죠?
데몬은 실행 중이고 당신 계정만 소켓을 열 수 없는 것입니다. sudo usermod -aG docker $USER로 docker 그룹에 자신을 넣고 newgrp docker를 실행(또는 로그아웃 후 재로그인)하세요. 모든 명령에 sudo를 붙여 쓰지 마세요.
docker 그룹에 추가했는데도 permission denied가 납니다.
새 그룹 멤버십이 현재 셸에 아직 실리지 않은 것입니다. newgrp docker로 지금 반영하거나 로그아웃 후 재로그인하세요. groups 명령으로 docker가 목록에 있는지 확인하세요.
systemctl status는 active (running)인데 여전히 연결이 안 됩니다.
CLI가 엉뚱한 엔드포인트를 향하고 있을 가능성이 큽니다. docker context ls로 활성 context를, echo $DOCKER_HOST로 남은 override를 확인하고 docker context use default나 unset DOCKER_HOST로 되돌리세요.
permission denied를 chmod 666으로 소켓을 열어 고쳐도 되나요?
안 됩니다. /var/run/docker.sock을 모두 쓰기 가능하게 하면 호스트의 모든 사용자에게 root 수준 제어를 넘기는 셈이고, 데몬 재시작 때 어차피 사라집니다. 지원되는 경로인 docker 그룹을 쓰세요.
'Error response from daemon'과 어떻게 다른가요?
Cannot connect은 CLI가 데몬에 아예 닿지 못한 것입니다. Error response from daemon은 데몬에 닿았고, 데몬이 특정 요청(잘못된 이미지 이름, 포트 충돌)을 거부한 것입니다. 그 메시지가 보이면 소켓은 정상이니 명령을 고치세요.
참고 자료
Haneul Seo
Infrastructure engineer · 10+ years running Linux fleets
같은 카테고리 다른 글
Git: fatal: detected dubious ownership in repository
Git 2.35.2의 CVE-2022-24765 수정 이후, Git은 작업 트리나 .git 디렉터리의 소유자가 명령을 실행한 사용자와 다르면 저장소를 읽지 않습니다. 컨테이너, CI 작업, sudo 세션, 공유 드라이브에서 주로 나타납니다. 저장소가 내 것이어야 한다면 소유권을 바로잡고, 아니라면 global 설정의 safe.directory에 정확한 경로를 추가하세요 — Git은 이 설정을 저장소 자신의 설정에서는 무시합니다.
Kubernetes: Internal error occurred: failed calling webhook
admission webhook이 쓰기 요청 앞에 서 있는데 API server가 응답을 받지 못했고, 기본값인 failurePolicy: Fail이 그 침묵을 거부로 바꾼 것입니다. 메시지 끝부분이 곧 진단입니다 — context deadline exceeded는 호출이 도달하지 못한 것, no endpoints available은 떠 있는 게 없는 것, x509 줄은 API server가 webhook 인증서를 신뢰하지 않는 것입니다. 원인마다 해결이 다르고, 어느 것도 매니페스트 문제가 아닙니다.
MySQL: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
다른 트랜잭션이 쥐고 있는 행 잠금을 innodb_lock_wait_timeout 만큼 기다리다 포기한 것입니다. sys.innodb_lock_waits 가 막고 있는 세션을 지목하고 KILL 문까지 만들어 주며, blocking_query 가 NULL 이면 블로커가 열린 트랜잭션 위에서 놀고 있다는 뜻입니다. 재시도 로직이 가장 자주 틀리는 지점은 따로 있습니다. 기본값에서는 타임아웃된 문장 하나만 롤백되므로, 트랜잭션은 그대로 열린 채 앞서 잡은 잠금을 전부 쥐고 있습니다.
Redis: MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk
읽기는 되는데 모든 쓰기가 거부됩니다. 마지막 백그라운드 저장이 실패했고 stop-writes-on-bgsave-error 기본값이 yes 이기 때문입니다. 진짜 원인은 로그에 적혀 있습니다 — 디스크 공간 부족, redis 사용자가 쓸 수 없는 dir, rename 시점의 read-only 마운트, 또는 fork 가 Cannot allocate memory 로 실패하는 경우입니다. 원인을 고치고 BGSAVE 한 번만 돌리면 재시작 없이 쓰기가 돌아옵니다. rdb_last_bgsave_status 가 err 에서 ok 로 바뀝니다. stop-writes-on-bgsave-error no 는 쓰기를 즉시 되살리지만 스냅샷은 여전히 실패한 상태로 두므로, 해결이 아니라 의도한 맞교환으로 다뤄야 합니다.
Node.js: FATAL ERROR: Reached heap limit — JavaScript heap out of memory (종료 코드 134)
V8 힙에는 시스템 메모리와 Node 릴리스에서 유도되는 자기만의 천장이 있고, 가진 RAM 보다 훨씬 낮은 경우가 흔합니다. 빌드나 서버가 거기 닿으면 V8 은 FATAL ERROR: Reached heap limit 과 종료 코드 134 로 스스로 중단합니다. v8.getHeapStatistics().heap_size_limit 으로 실제 한도를 읽은 뒤, 큰 작업은 --max-old-space-size(MiB)나 NODE_OPTIONS 로 올리고, 컨테이너 안에서는 cgroup 한도보다 낮게 잡고, 오래 도는 프로세스의 누수는 --heapsnapshot-near-heap-limit 으로 잡으세요. FATAL ERROR 줄 없이 137 로 끝나면 컨테이너 kill 이지 이 오류가 아닙니다.
Docker: 컨테이너 시작 직후 "exec format error" — 플랫폼이 다른 이미지, 에뮬레이터 없음, 셔뱅 없는 스크립트
컨테이너가 첫 명령에서 exec format error 로 끝납니다. 커널의 ENOEXEC, 즉 파일은 있지만 여기서는 실행할 수 없다는 뜻입니다. 실제로는 한 CPU 아키텍처에서 빌드한 이미지(Apple 실리콘 Mac은 linux/arm64 를 만듭니다)를 binfmt_misc 에 QEMU 핸들러가 없는 다른 아키텍처(x86_64 서버)에서 돌리거나, 엔트리포인트 스크립트의 첫 줄이 셔뱅이 아닌 경우입니다. uname -m, docker image inspect, ls /proc/sys/fs/binfmt_misc 로 원인을 가르고, docker buildx build --platform 을 명시(또는 두 플랫폼 매니페스트 목록 발행)하거나, 에뮬레이션이 목적이면 QEMU 등록과 --platform, 스크립트라면 #!/bin/sh 한 줄로 해결합니다.