Docker Permission Denied 문제 해결 방법

도커를 사용하여 애플리케이션을 실행하는 것은 매일 루틴이 되다 보면 연결하려는 동안 도커 권한이 거부되는 오류와 같은 문제에 부딪힐 때 악몽이 될 수 있습니다. 하지만 걱정하지 마세요. 이 기사는 당신이 즉시 복귀할 수 있도록 도와드릴 것입니다.

이 자습서에서는 두려운 도커 권한이 거부된 오류 메시지를 해결하는 여러 가지 방법을 배울 것입니다.

필수 조건

이 자습서에는 실습이 포함되어 있습니다. 따라오려면 다음 사항이 준비되어 있는지 확인하십시오:

  • 이 자습서의 데모는 Ubuntu 20.04에서 실행되지만 다른 리눅스 배포판에서도 작동합니다.
  • Docker 엔진은 튜토리얼이 실행되는 버전 20.10.8, 빌드 3967b7d여야 합니다.

슈퍼 유저 권한으로 도커 명령 실행하기

도커에 연결할 때 권한이 거부되었다는 오류가 발생하는 여러 요인 중 하나는 sudo 명령을 접두어로 사용하지 않고 도커 명령을 실행하는 경우입니다. sudo 명령은 명령을 실행할 때 슈퍼 유저 권한과 보안 권한을 제공합니다.

아래에서 docker 명령을 실행하려고 할 때 발생하는 두려운 권한 거부 오류를 볼 수 있습니다.

Running into a permission denied error

터미널을 실행하고 아래의 docker 명령어 앞에 sudo를 추가하여 실행하세요. 관리자 권한으로 명령을 실행하므로 계속 진행하려면 비밀번호를 입력해야 합니다.

sudo docker run hello-world

다음과 같은 출력이 나타나면 Docker가 올바르게 설치된 것입니다.

Running Elevated (sudo) Docker Commands

Docker Engine 재시작

만약 관리자 권한으로 Docker 명령을 실행해도 허가 거부 오류가 해결되지 않으면 Docker Engine이 실행 중인지 확인하세요. sudo 명령어 없이 docker 명령을 실행하는 것과 마찬가지로 중지된 Docker Engine은 허가 거부 오류를 발생시킵니다. 이 오류를 해결하려면 Docker Engine을 다시 시작하세요.

systemctl 명령어를 실행하여 Docker Engine의 상태(status docker)와 실행 여부를 확인하세요.

sudo systemctl status docker

아래에서 Docker Engine이 실행 중인 상태를 나타내는 반환된 상태에서 확인할 수 있습니다.ctive (running).

Displaying Docker Engine status

만약 Docker Engine이 활성화되어 있지 않다면 아래의 systemctl 명령어를 사용하여 Docker Engine을 시작하세요(start docker).

sudo systemctl start docker

이제 “Running Elevated Docker Commands” 섹션에서와 같이 hello-world Docker 명령을 실행하여 오류가 해결되었는지 확인하십시오.

sudo docker run hello-world

비 루트 사용자 액세스를 가진 그룹에 사용자 계정을 추가하는 방법

도커 엔진이 작동하는 것을 확인했지만 여전히 도커 permission denied 오류가 발생합니까? 그렇다면 사용자 그룹이 아닌 Linux 머신에서 실행하는 모든 도커 명령은 permission denied 오류를 발생시킵니다.

  1. 아래의 groupadd 명령을 실행하여 새로운 docker 그룹을 생성하십시오. 명령을 계속 실행하려면 암호를 입력하십시오.
sudo groupadd docker

사용자 그룹에 도커 그룹이 이미 있는 경우 아래와 같은 출력이 표시됩니다.

Creating a New Group Named ‘docker’

2. 다음으로, usermod 명령을 실행하십시오. 여기서 -aG 옵션은 명령을 사용자 계정 (programmer)을 (docker) 그룹에 추가하도록 지시합니다. 이 명령은 사용자 계정이 비사용자 액세스를 갖도록합니다.

sudo usermod -aG docker programmer

3. 아래의 newgrp 명령을 실행하여 현재의 실제 그룹 ID를 docker 그룹으로 변경하십시오.

비 루트 사용자로서 Docker를 실행하려면 매번이 명령을 실행하십시오.

sudo newgrp docker 

마지막으로 hello-world 도커 이미지를 다시 실행하여 오류가 더 이상 표시되지 않는지 확인하십시오. 이 시점에서도 오류가 발생하는 경우 docker.sock 파일에 대한 더 많은 액세스 권한을 부여하는 것을 고려하십시오. docker.sock 파일은 사용자와 시스템 간의 프로세스 정보를 통신하는 방법인 UNIX 소켓이며 Docker 데몬이 Docker API의 진입점으로 사용합니다.

아래 chmod 명령을 실행하여 모든 사용자에게 /var/run/docker.sock 파일에 대한 읽기/쓰기(666) 액세스 권한을 부여하십시오. 이제 hello-world 도커 이미지를 다시 실행하여 오류가 해결되었는지 확인하십시오.

sudo chmod 666 /var/run/docker.sock

Docker 서비스 유닛 파일 편집

비루트 사용자로서 Docker를 실행하는 것만으로 오류를 해결할 수 없는 경우 Docker SystemD(서비스 제어 시스템) 서비스 유닛 파일을 편집해 보십시오. Docker 서비스 파일에는 Docker 데몬의 동작을 변경할 수 있는 중요한 매개변수가 포함되어 있습니다. 서비스 기본 동작을 변경하기 위해 추가 명령을 추가하여 Docker 유닛 파일의 기본 동작을 수정할 수 있습니다.

1. 아래 명령을 실행하여 Docker 서비스 유닛 파일을 좋아하는 텍스트 편집기에서 엽니다. 이 예제에서는 Docker 서비스 파일이 nano 텍스트 편집기에서 엽니다.

sudo nano /usr/lib/systemd/system/docker.service

2. 아래에 표시된 대로 Docker 서비스 단위 파일 내에서 [Service] 헤더가 있는 영역을 찾으세요. 아래 명령을 Docker 서비스 단위 파일에 복사하여 저장하세요.

아래에서 SupplementaryGroups 명령은 프로세스가 실행되는 보충 Unix 그룹을 설정합니다. 동시에 ExecStartPost 명령은 서비스가 올바르게 시작되지 않아도 실행되는 작업을 정리합니다.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. 이제 아래 명령을 실행하여 Docker 서비스를 다시 시작하고 활성화하세요. 이렇게 하면 Docker 명령을 실행할 때 오류가 발생하지 않도록 Docker 서비스를 다시 시작할 수 있습니다.

# 모든 Docker 단위 파일을 다시로드하고 전체 의존성 트리를 다시 생성합니다.
sudo systemctl daemon-reload
# Docker 서비스를 다시 시작합니다.
sudo systemctl start docker
# Docker를 컴퓨터에서 실행할 수 있도록 활성화합니다.
sudo systemctl enable docker

4. 마지막으로 hello-world Docker 이미지를 다시 실행하여 여전히 권한이 거부되는지 확인하세요.

권한 모드에서 Docker 실행하기

마지막으로, Docker 권한 거부 오류를 수정하는 목록에서 Docker를 권한 모드로 실행하는 것이 있습니다. 이렇게 하면 Docker 컨테이너가 시스템에 루트 액세스를 부여받습니다.

권한 모드에서 Docker를 실행하는 것은 위험하며 해커의 공격에 취약합니다. 따라서 정확히 무엇을 하는지 알 때만 Docker를 권한 모드로 실행하세요.

1. 아래 명령을 실행하여 시스템에 있는 모든 Docker 컨테이너를 나열하고 실행하려는 컨테이너의 ID를 가져옵니다.

sudo docker ls -a
Listing all Docker Containers in the System

2. 그 다음, 아래 docker inspect 명령을 실행하여 실행하려는 컨테이너가 이미 권한 모드인지 확인합니다. (--format='{{.HostConfig.Privileged}}'). 아래의 CONTAINER_ID를 첫 번째 단계에서 메모한 실제 컨테이너 ID로 바꿉니다.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

컨테이너가 권한 모드에 있는 경우 명령은 콘솔에 true 값을 반환합니다. 그러나 명령이 false 값을 반환하는 경우 아래에 표시된 것처럼 다음 단계로 진행하십시오.

Checking if a Container is in Privileged Mode

3. 마지막으로 아래 docker 명령을 실행하여 Docker 컨테이너를 권한 모드로 실행합니다. (--privileged hello-world).

sudo docker run --privileged hello-world

결론

이 튜토리얼을 통해 Docker permission denied 오류를 해결하는 여러 가지 방법을 배웠습니다. 권한이 있는 명령을 실행하여 Docker를 권한 모드로 실행하는 방법도 알게 되었습니다.

이제 Docker를 사용한 애플리케이션을 빌드할 때 오류를 해결하는 방법을 알게 되었습니다. 아마도 항상 Docker 이미지를 청소하는 방법도 알고 싶으시겠죠?

Source:
https://adamtheautomator.com/docker-permission-denied/