배경
회사에서 이미 rootful로 구축된 서비스를 rootless로 전환하는 업무를 담당하게 되었다. 그래서 로컬의 virtual box에서 rocky8.4로 rootless docker를 설치하는 실습을 진행해본 후, 최대한 실제 운영 환경과 유사하게 테스트를 진행하기 위해 팀 내부의 GPU 서버에서 다시 동일한 작업을 진행하게 되었다. rootless 도커 설치 과정 포스팅은 여기를 참고 바란다.
그런데 dockerd-rootless-setuptools.sh install을 진행할 때, rocky에서는 문제 없이 진행이 되었으나 centOS에서는 systemd not detected 라는 에러가 표시됐다. 그래서 우선 내 상황에서는 아래 2가지를 고려해야 했다.
1. rocky8.4(virtual box test 환경)와 redhat8.4(작업 대상 운영 서버)에서는 항상 동일한 결과를 기대할 수 있을까?
2. CentOS에서도 rootless docker를 적용하는 방법은?
rocky linux의 공식 홈페이지를 보면 Rocky Linux is an open-source enterprise operating system designed to be 100% bug-for-bug compatible with Red Hat Enterprise Linux. 라고 하니 1번은 걱정하지 않아도 될 것 같다. 그럼 이제 centos에서 테스트를 진행하는 방법을 찾아보도록 하자.
트러블슈팅
아래는 내가 시도해본(그러나 실패한) 방법들이며, 최종적으로는 setuptools가 아닌 일반 sh파일을 실행해서 적용했다. 결론만 보고 싶다면 더 아래쪽 내용을 참고 바란다.
[systemd란?]
Systemd 는 기존 리눅스 시스템에서 사용해왔던 init script 를 대체한다. 배포판마다 적용된 버전이 다른데, CentOS에 경우에는 7 버전부터 적용되기 시작했다. Systemd 는 부팅과정에서 최초로 실행되는 프로세스이며 리눅스 시스템 전체를 움직하게 하는 프로세스이다. 이 프로세스는 또 다른 프로세스들을 제어하는데 이를 위해서 systemd 프로그램을 제공한다.부팅과정에서 자동으로 데몬들을 실행시키는 것도 systemd 가 하는데 이 프로그램은 데몬에 대한 명세서인 unit 파일을 기반으로 실행을 시켜준다. 이러한 파일들은 전역 시스템 영역에 속한다.
출처: https://linux.systemv.pe.kr/linux/systemd-user-사용하기/
정리해보자면 rootless docker 설정 시 systemd가 detected되지 않는다는 메세지가 출력됐고(사실 [INFO]라고 출력되어서 나중에서야 알았다), systemctl --user start docker 시에는 Failed to get D-Bus connection: No such file or directory 에러가 발생하고 있는 상황이었다. DBUS 관련 에러를 먼저 찾아보니, 해당 에러는 사용자 세션용 D-Bus 연결을 찾을 수 없을 때 발생한다고 한다. echo로 확인해보니 DBUS_SESSION_BUS_ADDRESS 환경변수도 없어서, 해당 변수를 설정하고 수동으로 세션을 실행하면 되지 않을까? 라고 생각했다.
# 사용자 전용 세션 DBUS를 실행함
mkdir -p $XDG_RUNTIME_DIR/dbus
# 백그라운드로 실행하고 주소를 반환함
dbus-daemon --session --address=unix:path=$XDG_RUNTIME_DIR/dbus/user_bus_socket --fork --print-address
# 사용자 단 systemd 서비스 등에서 DBUS를 사용할 수 있게 환경 변수 설정
export DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/dbus/user_bus_socket
위 설정 이후 systemdctl --user start docker를 다시 실행해 보았는데 Failed to start docker.service: Process org.freedesktop.systemd1 exited with status 1. See system logs and ‘systemctl status docker.service’ for details 에러가 표시됐다. centos에서 systemctl --user를 사용하는 방법에 대해서 찾아보며 이 블로그를 보고 systemd-pam 관련 설정도 따라해봤지만, 잘 되지 않았다. (다른 OS에서는 될 수도 있다)
그러다가 CentOS는 systemd user 모드를 지원하지 않는다는 글을 발견했다..!
해결
그래서 검색 키워드를 바꿔, 에러 내용이 아니라 CentOS에서 rootless를 설정하는 방법을 구글링해 보았고 이 글을 찾을 수 있었다. (2018년 글인데, 그만큼 내가 지금 쓰려는 OS가 오래됐다는 거겠지.. 아무리 개발 서버라지만 최소한 8버전으로 올려줬음 좋겠다.)
[root@dlp ~]# echo "cent:100000:65536" > /etc/subuid
[root@dlp ~]# echo "cent:100000:65536" > /etc/subgid
[root@dlp ~]# cat /etc/subgid /etc/subgid
# 블로그 명령어
[cent@dlp ~]$ /usr/bin/dockerd-rootless.sh &
# 세션 종료 시에도 실행하는 명령어
[cent@dlp ~]$ nohup /usr/bin/dockerd-rootless.sh > dockerd.log 2>&1 &
우선 dockerd-rootless-setuptools.sh 대신 일반 dockerd-rootless.sh 파일을 실행해야 한다. system가 지원되지 않는 환경이기 때문에 직접 데몬을 실행하는 방식이다.
- setuptools sh파일: systemd 기반의 자동 관리. user mode-systemd 지원 필요
- 일반 sh 파일: systemd에 의존하지 않고 직접 터미널에서 데몬을 실행
그리고 subuid 및 gid를 설정하는 부분이 있는데, setuptools 파일에는 해당 설정을 하는 부분이 포함되어 있으나 일반 쉘 파일에는 없기 때문에 추가로 실행해줘야 한다. 해당 명령어는 사용자 계정의 subuid, gid를 설정하는 것으로, /etc/subuid 및 gid 파일에 관련 데이터를 저장한다. 단, 이미 다른 계정에 할당되어 있는 id는 중복 할당이 불가능하므로, 범위 조정이 필요할 수 있다. 관련 설정은 공식 문서에서도 찾아볼 수 있다.
- cent: 사용자 계정
- 100000: 시작 UID/GID
- 65536: 할당할 uid, gid 범위(개수)
마지막으로, 블로그에는 단순히 “&”를 통해 백그라운드로만 실행을 했지만, 실제 도커 서비스를 운영하고자 하는 경우에는 세션이 종료되어도 서비스는 계속해서 실행되어야 한다. 이를 위해 나는 nohup으로 데몬을 실행시켰고, 로그 파일을 별도로 저장하도록 했다.(이를 고려하긴 했지만 실제로 그런 상황에서 잘 서비스되는지는 확인하지 못했다.) 그 결과 rootless 모드로 도커가 실행되는 것을 확인할 수 있었다. ps -ef | grep dockerd 실행 시 프로세스가 root가 아니라 일반 계정으로 실행되고 있다면 성공한 것이다.
'Infra' 카테고리의 다른 글
docker daemon.json 설정 정리 (0) | 2025.06.21 |
---|---|
폐쇄망 docker설치(rpm 파일 다운로드) (0) | 2025.05.14 |
rootless docker란? 개념 및 설정 방법 (0) | 2025.04.20 |
CUDA/NVIDIA 드라이버와 GPU 별 버전 확인 방법 (0) | 2025.03.07 |