여기서는 멈추세요
- daemon 시작 시 기존 컨테이너 자동 기동과 포트 노출 영향, 작업 전 서비스 상태를 확인하지 못했다면 start·restart하지 않습니다.
- docker.sock 권한을 666·777로 바꾸거나 TCP 2375를 TLS 없이 열라는 우회만 가능하다면 적용하지 않습니다.
- docker 그룹의 root 수준 권한을 승인받지 못했거나 rootless·rootful 운영 모델이 불명확하면 사용자 그룹을 변경하지 않습니다.
DOCKER ACCESS
SAFE OPERATING BOUNDARY
그룹 변경 전 id·getent 기록에서 docker 그룹원이 아니었고 이번 절차가 실제로 추가한 정확한 사용자만 sudo gpasswd -d '<APPROVED_USER>' docker로 제거합니다. 원래 그룹원이었으면 제거하지 않습니다. 모든 세션을 다시 시작해 검증합니다. daemon 시작은 작업 전 inactive였고 실행 중 컨테이너·의존 서비스가 없다는 승인이 있을 때만 원래 상태로 돌립니다. daemon.json 변경은 별도 백업 파일 복원과 dockerd --validate 성공 후 반영합니다.
BEFORE YOU START
CHECK THE BRANCH
socket 권한을 바꾸기 전에 daemon 로그와 unit 실패 이유를 확인합니다. daemon.json 문법, 디스크 부족, containerd 실패, 중복 dockerd 실행을 먼저 해결해야 합니다.
docker.sock의 소유자·그룹과 현재 사용자의 보조 그룹을 비교합니다. socket을 666·777로 열지 않으며 docker 그룹이 호스트 root 수준 권한을 부여한다는 점을 승인자가 이해해야 합니다.
로컬 socket 문제처럼 보여도 선택된 context나 환경 변수가 잘못된 endpoint를 가리킬 수 있습니다. TLS 원격 context는 인증서를 끄지 말고 원래 context로 복원합니다.
시스템 docker.service와 /var/run/docker.sock이 아니라 사용자 systemd unit과 XDG_RUNTIME_DIR의 socket을 확인합니다. rootful docker 그룹 절차를 섞지 않습니다.
FOLLOW THE FLOW
현재 context와 endpoint, systemd 상태, socket 메타데이터를 확인해 연결 실패와 권한 실패를 구분합니다.
docker context show
docker context inspect --format '{{json .Endpoints.docker.Host}}'systemctl is-active docker.service docker.socket
systemctl status docker.service docker.socket --no-pager -lstat -Lc '%A %a %U:%G %n' /var/run/docker.sock
iddaemon inactive·failed면 서비스 분기, active인데 socket group과 사용자 group이 다르면 권한 분기, endpoint가 unix:///var/run/docker.sock이 아니면 context 분기입니다.
chmod나 재설치부터 하지 말고 해당 분기의 읽기 전용 진단으로 이동합니다.
서비스 시작 실패 시 최근 로그, unit, daemon 설정을 확인합니다. 설정 파일을 수정하거나 daemon을 재시작하지 않습니다.
sudo journalctl -u docker.service -u containerd.service --since '-20 min' --no-pagersystemctl cat docker.service docker.socket
systemctl is-active containerd.servicesudo dockerd --validate --config-file=/etc/docker/daemon.jsondaemon.json이 없다는 오류는 별도 설정 파일을 사용하지 않는 환경일 수 있습니다. 실행 중 dockerd를 새로 시작하는 명령이 아닙니다.df -hT / /var
df -ih / /varinvalid configuration, no space, containerd 연결 실패, unit override 충돌 중 어느 메시지가 최초 원인인지 봅니다.
설정 오류면 백업·diff를 준비하고, 디스크·containerd 원인이면 관련 가이드로 먼저 해결합니다.
socket까지의 디렉터리 권한, 실제 socket, 사용자 그룹을 비교합니다. ACL·chmod·chown은 아직 변경하지 않습니다.
namei -l /var/run/docker.sock
getfacl /var/run/docker.sock 2>/dev/nullid '<APPROVED_USER>'
getent group docker변경 전 docker 그룹 포함 여부와 전체 출력을 작업 기록에 남깁니다. 이미 구성원이면 usermod를 실행하지 않고, 이후 rollback에서도 기존 권한을 제거하지 않습니다.ps -C dockerd -o pid,user,group,etime,cmd
sudo ss -lxnp | grep docker.socksocket이 root:docker 660이고 사용자가 docker 그룹이 아니면 정책상 그룹 권한이 필요한지 결정합니다. 다른 소유권이면 비공식 설치·unit override 여부를 먼저 확인합니다.
docker 그룹의 root 수준 위험을 허용할 수 없다면 sudo 정책 또는 rootless 모드를 선택합니다.
원격 context와 rootless user unit을 시스템 daemon과 구분합니다. 환경 변수 값에는 내부 주소가 있을 수 있어 공유 전 마스킹합니다.
docker context lsenv | sed -n 's/^\(DOCKER_[A-Z_]*\)=.*/\1=<set>/p'값을 출력하지 않아 TLS 경로·원격 주소·민감정보 노출을 줄입니다.systemctl --user status docker.service --no-pager -l
loginctl show-user "$(id -un)" -p Lingerrootless가 active면 사용자 socket/context를, 원격 context면 해당 endpoint TLS·접근 경로를 점검합니다. 둘 다 아니면 system daemon 분기로 돌아갑니다.
운영 모델을 rootful group, 제한된 sudo, rootless 중 하나로 명확히 정한 뒤 최소 변경만 승인합니다.
아래 두 분기 중 원인과 운영 정책에 맞는 하나만 실행합니다. docker 그룹은 root 수준 권한이며 socket 전체 공개는 금지합니다.
sudo systemctl start docker.service
systemctl is-active docker.service로그와 설정 검증이 통과했고 기존 컨테이너의 자동 시작·포트 노출 영향을 승인받은 경우에만 실행합니다.sudo usermod -aG docker '<APPROVED_USER>'변경 전 기록에서 해당 사용자가 docker 그룹원이 아니었고 이번 추가를 승인받은 경우에만 실행합니다. docker 그룹은 호스트 root 수준 권한이며, 반영하려면 모든 세션에서 로그아웃한 뒤 다시 로그인해야 합니다.id
docker context show
docker version
docker info --format '{{json .ServerVersion}}'usermod 직후 현재 세션에서 실패하는 것은 그룹 정보가 아직 갱신되지 않았기 때문일 수 있습니다.Client와 Server 버전이 모두 표시되고 의도한 context에서만 명령이 성공해야 합니다. chmod 666/777이나 TCP 2375 무인증 노출은 정상 복구가 아닙니다.
실패하면 A는 daemon 로그와 작업 전 active 상태를 기준으로 복구합니다. B는 작업 전에는 그룹원이 아니었고 이번 절차가 실제로 추가한 사용자만 sudo gpasswd -d '<APPROVED_USER>' docker로 제거한 뒤 새 세션에서 확인합니다. 재발 방지를 위해 daemon.json 검증, 디스크·서비스 알림, docker 그룹 정기 감사를 운영 체크에 넣습니다.
PRIMARY REFERENCES
배포판과 버전에 따라 옵션·로그 위치가 다를 수 있습니다. 실행 전 서버의 --help와 로컬 매뉴얼을 함께 확인하세요.