호스트쪽에서 docker 소켓 접근 권한이 있는 user의 id를 도커 컨테이너의 user로 설정하였다. 이를 통해 docker에 대한 권한이 해당 컨테이너에도 있을 줄 알았다. docker 소켓 접근 권한이 있는 user로 실행하였다고 생각했기 때문이다.
하지만 해당 컨테이너 내부에서 docker ps 명령은 실행하면 unix /var/run/docker.sock: connect: permission denied 라는 에러 메시지가 나왔다.
여러 방법을 해보았으나 최종적으로는 컨테이너 내부의 user를 docker 그룹에 따로 추가해주었다. 아래는 docker compose를 활용한 방법이다.
stat -c '%g' /var/run/docker.sock
docker 그룹에 추가version: '3.8'
services:
your_service_name:
image: <image_name>
volumes:
- /var/run/docker.sock:/var/run/docker.sock
group_add:
- "999" # 호스트의 docker.sock GID를 여기 입력
docker 그룹에 추가 전, 도커 컨테이너에 id 명령어 실행 결과uid=1002(default) gid=0(root) groups=0(root)docker 그룹에 추가 후, 도커 컨테이너에 id 명령어 실행 결과 : docker 그룹으로 포함된 것을 알 수 있다.uid=1002(default) gid=0(root) groups=0(root),998id 명령어 실행 결과 (컨테이너 내부의 사용자를 docker 그룹에 추가 전, 후 결과 같음) :uid=1002(verno) gid=1002(verno) groups=1002(verno),998(docker)getent : 시스템 데이터베이스에서 항목을 검색하는 명령어로, 일반적으로 /etc/passwd, /etc/group, /etc/hosts 등과 같은 파일에서 정보를 가져옴.group : 조회할 데이터베이스의 종류를 지정하며, 여기서는 그룹 정보를 의미docker : 조회할 그룹의 이름getent group docker 명령어 실행 결과 (컨테이너 내부의 사용자를 docker 그룹에 추가 전, 후 결과 같음) : 즉 docker 컨테이너 내부의 user를 도커 group인 998에 포함을 했지만, 실제 docker 그룹에 대한 user는 변함없음. 근데 컨테이너에서의 uid는 1002(verno)이기에 그럴 수도..docker:x:998:dev,verno이 의문점을 chatGPT에게 물었을때 아래와 같은 답변을 해주었다.
user 설정으로는 주로 컨테이너 내부 파일 시스템 권한 조정이나 특정 사용자로서 실행할 필요가 있을때 사용되고, group_add 설정은 컨테이너 내부 사용자가 docker 소켓에 대한 접근을 할 수 있도록 docker 그룹에 추가해야함.
위 답변으로 docker 소켓은 호스트의 docker 그룹을 통해 접근이 가능하기에 group_add 설정이 필요하다고 추측함. 답변으로도 아래와 같이 나왔음
Docker 소켓 파일
/var/run/docker.sock은 호스트의docker그룹에 의해 보호되기 때문에, 컨테이너 내 사용자에게도docker그룹 권한이 필요합니다. 이를 위해서는group_add로 호스트의docker그룹 GID를 컨테이너 내 사용자에게 추가해 주어야 합니다.
도커 컨테이너 권한에 대해서도 더 공부해야겠다……