airflow docker 컨테이너에서 호스트 docker 소켓 접근 권한 부여

vernolog·2024년 11월 2일

배경

호스트쪽에서 docker 소켓 접근 권한이 있는 user의 id를 도커 컨테이너의 user로 설정하였다. 이를 통해 docker에 대한 권한이 해당 컨테이너에도 있을 줄 알았다. docker 소켓 접근 권한이 있는 user로 실행하였다고 생각했기 때문이다.

하지만 해당 컨테이너 내부에서 docker ps 명령은 실행하면 unix /var/run/docker.sock: connect: permission denied 라는 에러 메시지가 나왔다.

권한 부여 방법 (해결방법)

여러 방법을 해보았으나 최종적으로는 컨테이너 내부의 user를 docker 그룹에 따로 추가해주었다. 아래는 docker compose를 활용한 방법이다.

1. 호스트에서 docker 소켓 파일의 GID 확인

stat -c '%g' /var/run/docker.sock

2. 컨테이너 내부의 사용자를 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를 여기 입력

그 외 사용 명령어

id : 현재 사용자의 UID, GID 및 그룹 정보 출력

  • 컨테이너 내부의 사용자를 docker 그룹에 추가 전, 도커 컨테이너에 id 명령어 실행 결과
    uid=1002(default) gid=0(root) groups=0(root)
  • 컨테이너 내부의 사용자를 docker 그룹에 추가 후, 도커 컨테이너에 id 명령어 실행 결과 : docker 그룹으로 포함된 것을 알 수 있다.
    uid=1002(default) gid=0(root) groups=0(root),998
  • 호스트에 id 명령어 실행 결과 (컨테이너 내부의 사용자를 docker 그룹에 추가 전, 후 결과 같음) :
    uid=1002(verno) gid=1002(verno) groups=1002(verno),998(docker)

getent group docker : 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

의문점

왜 docker 권한이 있는 user를 설정해 주었음에도 docker socket에 대한 권한이 없는가

이 의문점을 chatGPT에게 물었을때 아래와 같은 답변을 해주었다.

user 설정으로는 주로 컨테이너 내부 파일 시스템 권한 조정이나 특정 사용자로서 실행할 필요가 있을때 사용되고, group_add 설정은 컨테이너 내부 사용자가 docker 소켓에 대한 접근을 할 수 있도록 docker 그룹에 추가해야함.

위 답변으로 docker 소켓은 호스트의 docker 그룹을 통해 접근이 가능하기에 group_add 설정이 필요하다고 추측함. 답변으로도 아래와 같이 나왔음

Docker 소켓 파일 /var/run/docker.sock은 호스트의 docker 그룹에 의해 보호되기 때문에, 컨테이너 내 사용자에게도 docker 그룹 권한이 필요합니다. 이를 위해서는 group_add로 호스트의 docker 그룹 GID를 컨테이너 내 사용자에게 추가해 주어야 합니다.

도커 컨테이너 권한에 대해서도 더 공부해야겠다……

0개의 댓글