2025.08.31 - [개발] - [서버] 서버 구축기
[서버] 서버 구축기
최근 사내 GPU 서버가 설치되어서 서버 세팅할 일이 생겼습니다.회사엔 사수가 단한명도 없기때문에 (4개월차 개발자인 제가 제일 오래된 개발자......)맨땅에 해딩하며 사내 개발자들이 사용할
blog.nadosajang.com
앞서 서버 설계에서 설계한 방식대로 rootless docker를 설치하고, 그룹별로 사용가능하게 만드는 과정을 진행하였습니다.
이번에는 Rootless Docker란? 무엇인가 부터 알아보고 넘어가도록 하겠습니다.
리눅스를 쓰다보면 항상 루트루트 하는게 최고권한을 갖는
즉, 절대 빼앗겨서는 안되는 중요한 계정입니다.

1. Rootless Docker란?
먼저 “루트리스 도커”란 무엇인가부터 정의해보겠습니다.
일반적으로 Docker Engine(이하 Docker) 데몬과 컨테이너는 root(슈퍼유저) 권한을 가진 상태에서 실행되는 경우가 많습니다.
이는 편리하지만 보안 측면에서 잠재적인 위험이 있습니다.
반면, 루트리스 모드(Rootless mode)는 Docker 데몬 자체와 컨테이너가 root 권한 없이, 즉 일반 사용자 권한(non-root)으로 실행되도록 하는 모드입니다.
공식 문서에 따르면
“Rootless mode lets you run the Docker daemon and containers as a non-root user to mitigate potential vulnerabilities in the daemon and the container runtime.”
즉, “벗어나자 root 권한”이 핵심 키워드입니다.
Docker는 기본적으로 “루트(root)” 권한을 가진 데몬이 컨테이너를 생성하고 관리합니다.
즉, 우리가 편하게 쓰는 docker run, docker pull 명령 뒤에는 root 권한으로 동작하는 Docker 데몬이 존재하는 것이죠.
문제는 바로 이 지점입니다.
- Docker 데몬은 root 권한을 갖고 있다.
- 만약 Docker 데몬 취약점 또는 컨테이너 탈출이 발생한다면?
→ 호스트 전체가 위험해진다.
이런 구조적 위험을 줄이기 위해 등장한 방식이 바로 Rootless Docker입니다.
Rootless Docker는 이름 그대로 root 권한 없이 Docker를 실행하는 모드입니다.
- Docker 데몬도 root 권한 없이 돌아가고
- 컨테이너도 root 권한 없이 실행되며
- 유저 홈 디렉토리 안에서 모두 동작합니다.
즉, 컨테이너 안에서는 겉보기엔 root처럼 보이지만(UID 0)
호스트 입장에서는 단순한 일반 사용자 권한일 뿐입니다.
이 방식의 핵심 의미는 아주 단순합니다. “컨테이너가 망가져도 내 서버 전체가 위험해지지 않는다.”
개인 개발환경, 멀티유저 서버, 보안이 중요한 서버에서 특히 유용하게 사용될 수 있다고 생각합니다.
2. Rootless Docker의 원리를 간단하게 알아보기

Rootless Docker는 단순히 “root 권한을 안 쓴다”가 아닙니다.
그 뒤에는 리눅스 커널의 몇 가지 기술이 조합되어 있습니다.
여기서 가장 중요한 개념이 바로 User Namespace(유저 네임스페이스)입니다.
User Namespace
User Namespace는 리눅스가 제공하는 “가짜 권한 구역”이라고 보면 됩니다.
도커를 생성하여 내부에 들어가 uid를 확인하면 아래와 같은 상황이 발생합니다.
- 컨테이너 내부에서는 UID 0 → root처럼 보인다
- 하지만 실제 호스트에서는 UID 1000번 일반 사용자
즉, 겉은 root이지만 속은 일반 유저인 셈입니다.
Rootless Docker는 이 메커니즘을 이용해 Docker 데몬과 컨테이너가 정말로 root 없이도 root처럼 보이게 만들어 줍니다.
SubUID / SubGID: 숨겨진 ID 범위
User Namespace를 쓰기 위해 필요한 것이 /etc/subuid 와 /etc/subgid 입니다.
위 파일을 조회하면 아래 내용과 같은것이 기록되어 있습니다.
dongwook:100000:65536
이 뜻은?
- dongwook 사용자에게 10만부터 65,536개 정도의 UID/GID를 ‘네임스페이스 안에서 마음대로 쓰게 허용’한다는 의미입니다.
Rootless Docker는 이 영역을 기반으로 컨테이너 내부의 가짜 사용자/그룹들을 구성합니다. 즉, Rootless Docker의 핵심은
“호스트의 UID/GID 일부를 네임스페이스 안에서 가짜 root로 매핑하는 것"
이라고 보면 됩니다.
Rootless 네트워킹: 왜 80/443을 못 쓰는가?
Rootless Docker에서 가장 처음 맞닥뜨리는 불편함이 바로 이것입니다.
포트 80, 443을 바인딩할 수 없다.
왜냐면 리눅스에서는 1024 이하의 포트는 항상 root만 사용할 수 있도록 제한하기 때문입니다.
Rootless 모드는 root 권한을 의도적으로 사용하지 않기 때문에, slirp4netns 라는 사용자 공간 네트워크 레이어를 통해 네트워크를 우회적으로 처리합니다. 그래서 실제 느낌은 이렇습니다
- Rootful Docker: 서버 네트워크에 직접 연결됨
- Rootless Docker: 사용자 공간 ↔ 호스트 네트워크를 “NAT처럼 우회”
이 과정에서 약간의 성능 저하가 생길 수 있습니다.
정리하면 Rootless Docker의 원리는 간단히 말해 “안전한 가짜 root”입니다.
User Namespace로 가짜 root 환경을 만든 뒤 실제로는 일반 사용자 권한으로 격리된 프로세스만 실행시키고
네트워크, 파일시스템, UID/GID 등을 사용자가 통제 가능한 영역에 한정한다
이렇게 해서 root 없이 root처럼 컨테이너를 실행할 수 있게 되는 것입니다.
3. Rootful vs Rootless — 장단점 비교
Rootless를 써보면 분명한 장점이 있지만, 한편으로는 제약도 많습니다.
개발/운영 환경에서 어떤 모드를 선택해야 할지 한눈에 이해할 수 있도록 비교해보겠습니다.
Rootless Docker의 장점
1) 보안성 비약적 향상
가장 큰 장점입니다.
Docker 데몬이 root 권한을 포기한다는 것은 컨테이너를 통한 호스트 침해 가능성을 구조적으로 차단한다는 의미입니다.
즉,
- 데몬 취약점
- 컨테이너 탈출
- 악성 이미지 실행
- 잘못된 마운트
- 오버레이 네트워크 공격
이러한 사고들이 발생해도 호스트 전체 root 권한이 털릴 가능성을 크게 줄여 줍니다.
2) 멀티 유저 환경에 적합
개발팀 서버처럼 여러 유저가 함께 사용하는 경우 Rootless Docker는 유저별로 독립된 Docker 데몬을 가집니다.
→ 유저 A의 실수나 공격이 유저 B, C 등 다른 계정에 영향을 주지 않습니다.
3) root 권한을 요구하지 않는 개발 환경
VM이나 사내 연구 서버처럼
root 권한을 받을 수 없는 상황에서도 Docker를 사용할 수 있습니다.
Rootless Docker의 단점
1) 포트 제한
가장 큰 단점은 여전히 이겁니다. 80, 443 같은 well-known port 사용 불가, 8080 포트 → Nginx 리버스 프록시 → 서비스
이렇게 우회해야 합니다.
2) 일부 기능 제약
다음 기능들은 rootless에서 동작하기 어렵거나 성능이 떨어집니다.
- overlay 네트워크
- 오케스트레이션(Docker Swarm)
- 특정 스토리지 드라이버
- GPU나 USB 같은 하드웨어 리소스 접근
- 퍼포먼스가 중요한 서비스 등
3) Rootful 대비 약간의 성능 저하
특히 네트워크 레이어가 사용자 공간 기반이라 대량 트래픽/고성능 워크로드에서는 손해가 있습니다.
그러면 어떤 환경에서 어떤 선택을 해야할까요?
Rootless Docker가 더 적합한 경우
- 멀티 유저 서버
- 보안이 최우선인 내부 서버
- root 권한을 못 받는 환경
- 개발/테스트 서버
- CI/CD 에이전트처럼 권한 최소화가 중요한 시스템
Rootful Docker가 더 적합한 경우
- 고성능이 중요한 서비스
- GPU/USB 장치 접근
- Kubernetes 클러스터 노드
- 프로덕션 시스템에서 네트워크/스토리지 기능을 많이 쓰는 환경
- Low port(80/443)를 직접 바인딩해야 하는 환경
위와 같은 이유로 인해 사내 개발 및 배포서버를 설정함에 있어서 Rootless Docker를 사용해서 환경분리를 진행하였습니다.
보안적 이점을 가져가면서도 각 사용자에게 꼭 필요한 권한만 부여하라는 요구사항에 맞추어
Rootless Docker를 사용해본 경험을 공유합니다.
읽어주셔서 감사합니다.
'개발' 카테고리의 다른 글
| [python] 파이썬 작동 원리와 메모리 구조 (0) | 2025.10.26 |
|---|---|
| [서버] 서버 구축기 (0) | 2025.08.31 |
| 가비아 이용해서 도메인등록하기 (15) | 2025.01.16 |
| [배포] 포트포워딩 LG+ 공유기 (9) | 2025.01.15 |
| [배포] 포트포워딩 + Nginx + Gunicorn (11) | 2025.01.10 |