Docker permission denied /var/run/docker.sock 에러 5분 해결법
그 빨간 에러 문구, 또 만났나요?
서버에 접속해서 가볍게 docker ps 한 줄을 쳤는데 이런 메시지가 뜬 경험, 다들 있으실 겁니다.
permission denied while trying to connect to the Docker daemon socket at
unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.43/containers/json":
dial unix /var/run/docker.sock: connect: permission denied그래서 결국 sudo docker ps로 임시 회피하고, CI 러너에서는 또 막히고... 이 글은 그 무한 반복을 끝내기 위한 것입니다. 에러 문구 → 원인 진단 → 복붙 명령어 순서로 5분 안에 영구 해결까지 끌고 가겠습니다.
왜 막히는가 — docker.sock 소켓 권한의 원리
먼저 범인을 직접 봅시다.
ls -l /var/run/docker.sock
# srw-rw---- 1 root docker 0 Jun 24 09:12 /var/run/docker.sock이 출력을 분해하면 모든 게 설명됩니다.
s: 일반 파일이 아니라 유닉스 소켓rw-(소유자 root) /rw-(그룹 docker) /---(그 외) : 즉 root이거나 docker 그룹에 속한 유저만 읽고 쓸 수 있음- 소유권
root:docker
Docker는 데몬(dockerd)이 root 권한으로 떠 있고, docker CLI는 사실 이 소켓에 명령을 써넣는 클라이언트일 뿐입니다.
[docker CLI] --(소켓에 write)--> /var/run/docker.sock --> [dockerd (root)]
소유권: root:docker
권한: srw-rw----그러니까 내 계정이 docker 그룹 멤버가 아니면 소켓에 쓸 권한이 없어서 permission denied가 나는 겁니다. 결론은 단순합니다. docker 그룹 멤버십이 핵심이에요.
원인별 5분 진단표
증상을 보고 자기 케이스를 먼저 특정하세요.
| 케이스 | 증상 / 확인 명령어 | 해결책 |
|---|---|---|
| ① 그룹 미가입 | id 출력에 docker가 없음 | sudo usermod -aG docker $USER 후 재로그인 |
| ② 그룹 추가했으나 세션 미반영 | getent group docker엔 내가 있는데 groups엔 docker 없음 | newgrp docker 또는 SSH 완전 재접속 |
| ③ 소켓 권한/소유권 손상 | ls -l에 root docker가 아니거나 권한이 rw가 아님 | sudo chmod 660 ... + sudo systemctl restart docker |
| ④ rootless 모드 | 일반 소켓 대신 사용자 소켓을 써야 함 | DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock 설정 |
| ⑤ WSL / macOS Desktop | Docker Desktop 백엔드 구조 차이 | Desktop 설정·WSL integration 확인 (그룹 무관) |
복붙 해결 명령어 모음
케이스 ① 그룹에 추가하기
# 현재 그룹 확인
id
# docker 그룹에 현재 유저 추가
sudo usermod -aG docker $USER
# 즉시 반영 (재로그인 대체)
newgrp docker
# 반영 확인 - docker가 보이면 성공
groups가장 깔끔한 건 exit 후 SSH 재접속입니다. 새 셸이 갱신된 그룹 정보를 들고 시작하니까요.
케이스 ③ 소켓이 손상됐을 때
ls -l /var/run/docker.sock # 상태 확인
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
sudo systemctl restart docker # 데몬 재시작으로 소켓 재생성케이스 ④ rootless docker
# rootless는 사용자 전용 소켓을 사용
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
docker context use rootless"usermod 했는데도 안 돼요" — 가장 흔한 함정
이게 진짜 많이 막히는 지점입니다. usermod -aG docker까지 했는데 여전히 permission denied가 난다면, 원인은 거의 100% 현재 셸 세션이 옛날 그룹 정보를 그대로 들고 있기 때문입니다.
그룹 멤버십은 로그인 시점에 셸에 박히는 정보라서, 이미 떠 있는 셸은 자동으로 갱신되지 않아요. 다음 두 명령으로 직접 비교해 보세요.
id # 현재 "셸 세션"에 적용된 그룹 → docker 없음
groups # 마찬가지로 현 세션 기준
getent group docker # 시스템 DB 기준 → 여기엔 내가 들어있음!getent에는 있는데 id에 없다면 세션 미반영이 확정입니다. 해결은 셋 중 하나:
newgrp docker— 새 그룹으로 서브셸 진입 (즉시)- 완전 로그아웃 후 SSH 재접속 — 가장 확실
sudo systemctl restart docker후 재접속 (소켓 문제까지 겸한 경우)
실무 팁:
tmux/screen세션 안에서 작업 중이라면newgrp만으로 안 풀릴 때가 있습니다. 이땐 세션을 완전히 죽였다가 다시 attach해야 깔끔하게 반영됩니다. 저는 이걸 모르고 30분을 날린 적이 있어요.
임시 우회 vs 영구 해결 vs rootless
| 방식 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
sudo docker | 즉시 동작, 설정 불필요 | 매번 입력, CI/스크립트에 부적합 | 일회성 점검 |
| docker 그룹 추가 | 영구, sudo 불필요 | 세션 갱신 필요, 사실상 root 권한 | 개인/전용 개발 서버 |
| rootless docker | 보안 우수, root 미사용 | 일부 기능 제약(특권 포트 등) | 공유·프로덕션 서버 |
환경별 주의점 (CI/CD)
- GitHub Actions: 공식 ubuntu 러너는 이미 권한이 잡혀 있어 그냥 됩니다. self-hosted 러너는 러너 실행 유저를
sudo usermod -aG docker <runner-user>후 러너 서비스를 재시작해야 합니다. - GitLab Runner: DinD(
docker:dind) 대신 호스트 소켓을 마운트(-v /var/run/docker.sock:...)하는 경우, 컨테이너 내부 유저 GID가 호스트 docker 그룹 GID와 맞아야 합니다. - 트렌드: 요즘은 CI에서 DinD의 보안·성능 부담 때문에 BuildKit / socket 마운트 방식이 늘고 있습니다. Docker Desktop 라이선스 이슈로 Podman·colima 대안도 활발히 쓰이고요.
결론: 영구 해결 체크리스트 + 보안 경고
□ id 에 docker 그룹이 보이는가
□ ls -l /var/run/docker.sock 이 srw-rw---- root docker 인가
□ usermod 후 재로그인(또는 newgrp)으로 세션 갱신했는가
□ sudo 없이 docker ps 가 동작하는가마지막으로 단호하게 짚고 갑니다. docker 그룹 멤버는 컨테이너에 호스트 루트 파일시스템(-v /:/host)을 마운트해 사실상 root 권한을 탈취할 수 있습니다. 즉 docker 그룹 = root입니다.
따라서 공유 서버나 프로덕션에서는 무분별한 그룹 추가를 피하고, rootless docker나 sudo + 감사 로깅 정책을 권장합니다. 개인 개발 서버라면 그룹 추가가 가장 편하지만, 그 의미는 알고 쓰세요.
한 줄 요약: 막히면 id로 그룹 확인 → 없으면 usermod -aG docker $USER → 재로그인 → docker ps. 즐겨찾기 해두면 다음에 또 헤매지 않습니다.
참고: 공식 문서
이 글에서 다루는 동작·설정·에러의 1차 출처는 다음 공식 문서입니다. 버전별 옵션과 정확한 동작은 여기서 확인하세요.
자주 묻는 질문 (FAQ)
Q. usermod 했는데도 계속 permission denied가 떠요.
A. 현재 셸 세션에 옛 그룹 정보가 남아서입니다. getent group docker엔 있는데 id엔 없다면 세션 미반영입니다. newgrp docker 또는 SSH 완전 재접속으로 해결됩니다.
Q. sudo 없이 쓰는 게 보안상 괜찮나요? A. docker 그룹은 사실상 root와 동급 권한입니다. 개인 서버는 무방하지만, 공유·프로덕션 서버에서는 rootless docker나 sudo 감사 정책을 권장합니다.
Q. WSL/Mac에서도 같은 명령으로 해결되나요? A. 아니요. Docker Desktop은 별도 백엔드를 쓰므로 그룹 문제와 무관한 경우가 많습니다. Desktop 설정과 WSL integration 활성화 여부를 먼저 확인하세요.
이 글은 AI 에이전트가 자료 조사와 1차 초안 작성을 담당하고, 사람 편집자가 사실관계·출처·톤과 맥락을 검토한 뒤 발행했습니다. 환경(OS·버전)에 따라 결과가 다를 수 있으니 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.
댓글
첫 번째 댓글을 남겨보세요.