컨테이너를 이용하면 컴퓨터를 이용한 과학 기술 연구 효율성을 높일 수 있습니다.
컨테이너가 왜 중요할까요?
- 연구 프로젝트들의 작업 공간을 분리하여 관리하기 쉬워집니다.
- 프로그램 설치 및 환경 설정이 간단해집니다.
- 연구 재현성(reproducibility)을 높일 수 있습니다.
컨테이너를 이용하면 컴퓨터를 이용한 과학 기술 연구 효율성을 높일 수 있습니다.
컨테이너가 왜 중요할까요?
정리하는 뇌라는 책에 보면 여러 개의 프로젝트를 진행하고 있을 경우 프로젝트별로 작업 공간을 분리하는 것이 두뇌 활동에 도움이 된다는 이야기가 나옵니다. 2018년 이 책을 읽고 학교 연구실에서 수업 준비 및 행정 업무용 책상과 연구용 책상(그리고 컴퓨터)을 분리했던 적이 있습니다. 수업 준비를 하다가 연구를 하려면 자리를 옮겨야 했고, 이를 통해 두뇌에 작업이 달라졌다는 것을 확실히 알려주기 위해서였죠.
연구용 책상을 따로 분리할 수는 있었지만 공간 제약으로 인해 여러 연구 프로젝트들끼리의 물리적 공간 분리는 할 수 없었습니다. 대신 Tmux를 이용해 클러스터 서버에서 터미널을 분리해서 작업할 수 있었고, 실제로 이 프로젝트 작업하다가 저 프로젝트 작업하면서 뒤죽박죽되는 상황이 많이 줄었습니다. Tmux에서 프로젝트별로 터미널 세션을 만들어 작업했했는데, 세션 전환을 통해 이제 다른 프로젝트 작업을 시작한다는 것을 두뇌에 알려준 셈이죠.
이후 도커 사용법을 배워 컨테이너 가상화도 프로젝트 작업 공간 분리에 함께 사용하기 시작했습니다. 이전에는 같은 호스트 운영체제에서 터미널만 분리해 작업했던 반면, 컨테이너를 사용하면 프로젝트별로 서로 다른 운영체제를 사용하는 셈이기에 작업 공간 분리에 더 좋습니다.
세컨드 브레인 책에도 프로젝트별 파일 정리에 대한 언급이 나옵니다. 트와일라 타프라는 창의적인 안무가도 새로운 작품을 시작하면 새로운 상자를 준비해 작품과 관련된 모든 자료를 상자에 보관했다고 합니다. 프로젝트를 잠시 보류했다가도 나중에 다시 상자를 쉽게 찾아 진행할 수 있었고, 내용물을 공유하기도 좋았다고 합니다.
연구 프로젝트들도 컨테이너 상자를 이용해 정리합시다.
부산에서 부두 근처를 지나다 보면 부두에 쌓인 컨테이너들과 컨테이너선, 컨테이너를 싣고 다니는 트럭들을 볼 수 있습니다. 최초의 컨테이너선은 1956년 운항을 시작한 말콤 맥린이라는 사람의 배였다고 합니다. 당시 컨테이너들은 규격이 일정하지 않았지만 이후 컨테이너의 표준화와 항구 대형 크레인 설치를 통해 화물 운송 효율이 증가하고 선박 운송 비용이 감소하여 국제 무역이 크게 증가했다고 합니다. 컨테이너는 단순한 박스이지만 세계 경제를 바꾼 혁신이었죠(마크 레빈슨, 더 박스).



도커에서 말하는 컨테이너가 바로 이 컨테이너입니다. 그래서 도커의 로고도 컨테이너선을 따라 만들었죠. 컴퓨터에서 컨테이너는 가상화 기술의 일종입니다. 실제로는 격리된 프로세스들의 집합이지만, 호스트 운영체제와 구분된 별도의 운영체제인 것처럼 생각할 수 있습니다. 컨테이너 기술은 도커 전에도 존재했지만 2013년 공개된 도커에서 컨테이너 기술을 쉽게 쓸 수 있도록 만든 후 컨테이너 기술이 널리 쓰이게 되었습니다.
종류별로 컨테이너들을 쌓아놓고 작업에 따라 필요한 컨테이너를 꺼내서 그 안에서 작업하고, 다 쓴 후에는 다시 넣어놓는 방식으로 일하는 경우를 생각해봅시다. 도커에서 쌓아놓은 컨테이너에 해당하는게 이미지입니다. 도커에는 필요한 프로그램들을 미리 설치해놓은 이미지들이 있습니다. 필요할 때 원하는 이미지를 실행해서 메모리에 올리면 그게 도커 컨테이너입니다. 메모리에 올린 후에는 컨테이너 안의 프로그램들을 이용해 작업을 할 수 있죠. 작업이 끝나면 컨테이너를 정지시키는데, 이미지는 그대로 남아 있어서 나중에 필요할 때 다시 쓸 수 있습니다. 이미지가 필요 없다면 지울 수도 있고, 직접 원하는 프로그램을 설치해서 나만의 이미지를 만들 수도 있습니다.
컨테이너는 해상 운송 뿐 아니라 컴퓨터 가상화 방식도 바꿨습니다.
저는 대학원생 때부터 수학적/공학적 알고리즘을 개발하고 프로그래밍을 통해 구현해서 검증하는 방식의 연구를 많이 해왔습니다. 컴퓨터를 이용해 연구를 수행하다 보니 다양한 소프트웨어 관련 문제들을 겪어 왔습니다.
대학원생 때는 이러한 문제들로 인해 시간을 많이 빼앗겼는데, 새로운 기술들로 인해 이제는 위의 상황들이 발생하지 않거나 발생해도 심각한 문제가 되지 않습니다.
1-3번 문제는 소스 코드 버전 관리 시스템을 이용해, 4-6번 문제는 Docker 컨테이너를 이용해 예방/해결할 수 있습니다. 1, 2번은 Git 로컬 저장소와 GitHub 원격 저장소에 2중으로 코드를 백업하기 때문에 소스 코드가 지워져도 금방 복구가 가능합니다. 3번의 경우 git diff 명령으로 수정 부분을 쉽게 확인할 수 있습니다. 한꺼번에 많은 부분을 수정하기보다는 작게 나눠서 수정하고 자주 commit하는게 좋습니다. 4, 5번은 서버의 라이브러리나 컴파일러 등이 달라서 생기는 문제인데, Docker 컨테이너 가상환경을이용해 서버의 환경을 동일하게 만들어 주면 연구 결과 재현성(reproducibility)을 높일 수 있습니다. 6번 또한 시스템에 Docker만 설치해 놓으면 금방 Docker 이미지를 받아 컨테이너를 실행하여 다른 서버와 동일한 연구 환경을 준비할 수 있습니다.
Git과 GitHub는 제가 대학원에 있을 때 공개 되었습니다. 버전 관리 소프트웨어는 그 전부터 존재했죠. 박사과정 때는 Mercurial이라는 소프트웨어를 잠깐 이용했었는데, 이후 Git과 GitHub가 버전 관리 업계를 거의 평정(?)했죠. Docker는 제가 박사과정을 마친 후에 나왔습니다. 컨테이너 기술은 그 이전에도 있었지만 Docker가 컨테이너 기술을 대중화했죠. 연구에서 프로그래밍을 진지하게 다룬다면 Git은 거의 필수입니다. Docker는 서버 컴퓨터를 많이 다루는 연구실에서 유용하게 쓸 수 있습니다.
탄성파탐사 연구실에서 연구할 때 많이 사용하는 라이브러리들을 설치해놓은 도커 이미지를 공개해두었습니다. 도커 허브에서 이미지를 받거나, 깃허브에서 도커 파일을 받을 수도 있지만, Docker와 GitHub를 이용한 소프트웨어 연구 환경 구축에서 설명한 연구 프로젝트 템플릿을 통해 이용하는 것을 추천합니다.
설치된 주요 라이브러리들은 다음과 같습니다.
소프트웨어를 이용한 연구와 수업을 위해 도커와 깃허브를 이용한 연구 프로젝트 템플릿을 만들어서 공개했습니다. 도커를 이용하면 소프트웨어와 관련된 라이브러리를 설치하고 환경을 설정하는 과정을 쉽게 만들 수 있고, 깃과 깃허브를 이용하면 도커 설정 파일과 프로그래밍 소스 코드를 안전하게 관리할 수 있습니다. 도커 사용 경험이 없는 연구자들이 도커를 쉽게 사용할 수 있도록 프로젝트 템플릿에 도커 관련 리눅스 스크립트들을 추가하였습니다.
프로젝트 템플릿은 깃허브 계정을 만들고 Fork하면 됩니다.
사용 방법은 리눅스 컨테이너와 버전 관리 시스템을 이용한 소프트웨어 연구 환경 구축 논문이나 유튜브에서 확인할 수 있습니다.
소프트웨어 기술 발달에 따라 점점 더 많은 과학자와 공학자들이 연구를 위해 컴퓨터 소프트웨어와 프로그래밍 도구들을 사용하고 있다. 소프트웨어를 이용한 연구에서는 환경 설정, 재현성 및 소스 코드 손실과 같은 문제들이 발생할 수 있다. 이 해설에서는 리눅스 컨테이너와 버전 관리 시스템을 사용하여 이러한 문제를 방지하는 방법에 대해 조사하였다. 연구 프로젝트 단위로 클라우드 저장소를 통해 코드를 관리하고 리눅스 컨테이너에 연구 환경을 구축하면 위의 문제들을 방지하고 협동 연구를 더 쉽게 만들 수 있다. 리눅스 컨테이너 사용경험이 없는 연구자들을 위해 컨테이너 생성과 실행에 필요한 스크립트를 포함한 연구 프로젝트 템플릿 저장소를 공개하였다.
//리눅스 컨테이너와 버전 관리 시스템을 이용한 소프트웨어 연구 환경 구축 – 초록