들어가며
학교에서 HPC(High Performance Computer)를 관리하는 일을 하면서, 여러 난관에 봉착하게 되었다. 가장 신경 쓰였던 점은 사용자들에게 리눅스 기반의 접근을 제공하는데, 모든 사용자들을 커버할 수 없다는 점이다. 예를 들어 pytorch나 tensorflow 기반 사용자들을 고려하여 관련 모듈은 내부적으로 설치가 끝난 상황이지만, 다른 프로그램을 돌리는 사람이 몇몇 있다!
그러한 케이스의 사용자들을 커버하기 위해서 추가한 것은 바로 이 enroot라는 명령어이다. 이는 NVIDA에서 만든 툴로써 권한이 없는 상황에서도 docker image를 기반으로 컨테이너 혹은 OS를 만드는 데, 도움을 주는 sandbox 툴이다. 무엇보다 이름 그대로 enroot 즉, root를 만들어 준다는 것인데, 가상 환경 내에서 root의 권한으로 다양한 명령어를 수행할 수 있다.
본론
가상 환경?
가상 환경은 말 그대로 가상의 환경을 구축하는 것이다. 이러한 가상 환경이 필요한 이유로는 일반적으로 특정 환경이 아니면 안되기 때문이다. 예를 들어 윈도우에서 리눅스 기반에서 동작하는 프로그램을 돌리기 위해서는 리눅스 가상환경이 필요하고, 반대의 경우도 마찬가지이다. 또한 리눅스 환경이라고 하더라도, 레드햇 계열이나 데비안 계열과 같이 약간의 환경 차이로 인해 가상환경이 필요할 수 있다.
위 사진은 linux 환경에서 enroot라는 명령어를 통해서 ubuntu:20.04 버전의 docker image를 불러와서 가상 환경을 만든 것이다. 이와 같은 구조로 가상 환경의 구축이 이루어진다.
이러한 가상 환경을 도와주는 대표적인 툴은 단연 docker이다. docker라는 툴을 통해 특정 환경을 image로 만들 수 있다. 이러한 docker image는 컨테이너를 생성하기 위한 모든 필요한 파일과 설정을 포함하는 템플릿이다. 이렇게 만든 docker image를 docker 환경을 통해서 실행시키면 이미지는 container가 된다. 이는 가상 환경이 실행되어 동작하는 상태를 뜻한다. 이와 같은 docker image 기반의 개발 환경은 굉장히 안정적이고 효율적이기 때문에 최신 개발 환경은 거의 docker image 기반으로 이루어지고 있다.
- dockerhub : https://hub.docker.com/
위 사이트는 docker image를 자유롭게 업로드하는 dockerhub라는 사이트이다. 여기에서 다양한 docker image를 다운로드할 수 있으며, 이미지를 실행시키는 것 만으로 간단하게 서버를 구축할 수 있다.
오늘 우리가 알아볼 enroot라는 툴 또한 docker image를 기반으로 동작하는 툴이다. 따라서 enroot를 다루기 위해서는 docker image에 대한 개괄적인 이해가 필요하다.
enroot와 docker의 차이점
docker가 가장 유명한 가상화 툴인데, 왜 굳이 enroot를 쓰는 걸까? 위에서 서술했듯이 둘 다 docker image를 통해 가상환경을 만드는 것들 도와주는 툴이라는 것을 알 수 있다. 그렇다면 차이점에 대해서 알아보자.
docker
- deamon : docker는 데몬 프로세스를 필요로 한다. root 권한이 필요하다.
- 오케스트레이션 : docker swarm이나 Kubernetes로 확장하기 쉽다.
enroot
- deamon-less : 데몬 프로세스를 필요로 하지 않는다. 따라서 root 권한이 없어도 실행할 수 있다.
- HPC : 슈퍼컴퓨터 환경에서 사용할 때 용이하다.
- 파일 구조 : SquashFS라는 파일 시스템으로 이미지를 관리한다.
이러한 차이점이 있는데, HPC 환경에서는 주로 enroot를 쓰게 된다. 사용자들이 리눅스 계정에 접근할 수 있는 상황이고, root 권한을 줄 수 없는 상황이기 때문에 이러한 환경에서는 enroot가 적합하다고 생각하여 필자는 이를 도입하게 되었다.
또한 enroot는 SquashFS 기반으로 이미지를 관리하는데, 실제로 docker image를 가져오게 되면, 디렉토리에 .sqsh 확장자의 파일이 생기게 된다. 이 이미지를 실행하면서 컨테이너를 만들 수 있고, 컨테이너를 이미지로 만들어서 디렉토리에 .sqsh 확장자로 저장할 수 있다.
enroot의 사용 방법
먼저 enroot를 install 하는 과정은 다음 레퍼런스에서 찾아볼 수 있다.
- enroot installation : https://github.com/NVIDIA/enroot/blob/master/doc/installation.md
커스텀 된 사용 환경을 구축하고 싶다면 위 레퍼런스를 참조하는 것이 도움이 될 것이다. 일반적인 installation 커맨드는 아래와 같다.
# Debian-based distributions
arch=$(dpkg --print-architecture)
curl -fSsL -O https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot_3.5.0-1_${arch}.deb
curl -fSsL -O https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot+caps_3.5.0-1_${arch}.deb # optional
sudo apt install -y ./*.deb
# RHEL-based distributions
arch=$(uname -m)
sudo dnf install -y epel-release # required on some distributions
sudo dnf install -y https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot-3.5.0-1.el8.${arch}.rpm
sudo dnf install -y https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot+caps-3.5.0-1.el8.${arch}.rpm # optional
위 명령어를 통해 enroot를 설치했다면, 이제 enroot를 사용하여 ubuntu 20.04 버전의 가상환경을 구축하는 과정에 대해 살펴보자
1. enroot import를 통한 docker image 다운로드
# dockerhub에서 ubuntu의 20.04 버전 이미지를 다운로드
enroot import docker://ubuntu:20.04
위 명령어로 ubuntu:20.04 버전의 이미지를 다운로드했다면 로컬 디렉터리에 ubuntu+20.04.sqsh 파일이 생겼을 것이다.
2. enroot start를 통해 .sqsh image를 실행하여 가상환경 생성
# 다운로드된 이미지 ubuntu+20.04.sqsh를 통해 ubuntu-test라는 이름의 가상환경 생성
enroot create --name ubuntu-test ubuntu+20.04.sqsh
3. 가상 환경 진입
# root의 권한으로 ubuntu-test라는 가상 환경에 진입
enroot start --root --rw ubuntu-test /bin/bash
enroot 공식 문서를 살펴보면 --mount와 같이 기본 환경의 파일들을 가상 환경에 마운트 할 수 있는 명령어 등 다양한 기능을 제공하는 것을 확인할 수 있다.
4. 컨테이너에서 이미지 추출
# 컨테이너에서의 작업이 끝났다면, ubuntu-test-20240619.sqsh라는 이름으로 이미지를 다시 만듦
enroot export -o ~/ubuntu-test-20240619.sqsh ubuntu-test
컨테이너에서 작업이 끝났다면, exit를 통해 컨테이너의 밖으로 나와서 위의 명령어를 통해 다시 이미지로 저장할 수 있다. 일회용으로 가상환경이 필요한 것이라면 다시 이미지를 말아 올리는 것이 필요가 없겠지만, 가상환경의 세팅을 저장하고 싶은 경우에는 이미지로 저장을 해두는 것이 좋다. 위에서는 날짜를 통해 컨테이너를 이미지로 저장하는 명령어이다.
enroot를 쓰는 이유?
enroot의 가상 환경을 어떨 때 쓰는지 정리하면 일반적으로 다음과 같은 케이스들이 있을 것이다.
- root 권한을 줄 수 없지만 환경을 제공해야 하는 경우 (Deamon-less)
- 경량화된 docker가 필요한 경우
- 다양한 환경을 세팅해야 하고, 특정 환경을 번갈아가면서 작업해야 하는 경우
- HPC를 사용하는 환경
- 클라우드 및 하이브리드 환경
- 리눅스 환경에 미숙한 사용자들을 위해 환경을 제공해야 하는 경우
이 외에도 많은 사용 방법이 있을 것이다.
마치며
이제는 image가 없으면 배포를 할 수가 없을 것 같다. 참 대단한..
'DevOps > docker' 카테고리의 다른 글
[Jenkins] DinD vs DooD 그리고 DooD 설정법 (1) | 2024.10.30 |
---|---|
docker를 사용하는 이유 (0) | 2023.09.03 |
dockerfile 스크립트를 작성하는 방법 (0) | 2023.09.01 |