파이썬 개발 도구로 아주 유용한 Jupyter Notebook이 있다. (소개 글) 웹 기반의 툴로 코딩과 실행, 시각화까지 가능하여 특히 과학/통계 분야에서 특히 폭넓게 사용되고 있다고 한다.
배경
파이썬은 virtualenv, anaconda 등을 통해 실행환경의 독립화가 쉬운 편이고 pip 등 패키지 툴도 강력하여 의존성 관리도 쉽다. 복잡한 패키지 의존성 때문에 하나의 머신에서 여러 애플리케이션을 개발할 경우 문제가 생길 가능성이 있다. 프로그래밍 언어의 버전에 따른 문제, 애플리케이션이 사용하는 라이브러리의 버전에 따른 문제 등등. 게다가 오픈소스의 경우 라이브러리와 프레임워크 등 외부 종속성이 상당히 많은 편이다. 이때 필요한 것이 실행환경의 독립화 이다. 하나의 머신에서 각 애플리케이션이 동작하는 환경을 독립적으로 만들 수 있는 것이다.
물론 virtualenv, anaconda으로도 충분히 Jupyter Notebook을 안정적으로 실행할 수 있다. 하지만 새로운 머신마다 이러한 실행환경 독립화 설정 과정을 반복하는 것도 번거로운 일이다. 이때 유용한 방법 중 하나가 Docker 이다. 도커는 쉽게 말해 한 대의 물리적 컴퓨터 위에 여러 개의 가상 컴퓨터를 만들 수 있도록 해주는 것이다(너무 간단히 얘기한거라 좀 틀린 내용이 있다). 특히 Docker Hub라는 가상 머신을 패키징(컨테이너라고 함)하고 배포할 수 있는 기능이 있기 때문에 특정한 환경을 준비할 때 그냥 다운로드 받고 실행하는 것으로 마칠 수 있도록 해준다. 번거로운 일들을 상당히 간편하게 마칠 수 있도록 해주는 것이다.
Jupyter Notebook Container의 경우 https://hub.docker.com/r/jupyter/ 이곳에서 다운로드 받을 수 있다. 여러 종류가 있는데 보통 주요 개발 환경에 필요한 패키지들을 묶어놓은 형태이다. 간단히 Jupyter Notebook만 들어간 것도 있고, 스파크가 포함된 것도 있고, 데이터과학이 들어간 datascience도 있고, 구글의 딥러닝 패키지인 tensorflow 도 있고…기계학습을 학습(?) 하기 위해 scipy-notebook을 사용하고 있는데 실행환경 독립화 툴과는 또 다른 장점들이 있는 것 같아 이렇게 소개하게 되었다.
사용하기
Docker의 설치는 이곳(Mac OS, Windows, Ubuntu)을 참고하면 된다. Mac에서 간단한 컨테이너인 minimal-notebook을 기준으로 설명을 진행한다.
- 터미널에서 아래 코드를 실행해서 docker 컨테이너(정확히는 이미지)를 다운로드 받는다. 도커 이미지와 컨테이너는 프로그램-프로세스의 관계처럼 저장된 형태와 실행 중인 형태를 의미한다.
$ docker pull jupyter/minimal-notebook
-
pull complete 되면 다음 커맨드를 입력하여 노트북을 실행한다.
$ docker run -it --rm -p 8888:8888 jupyter/minimal-notebook
- 실행되면 출력의 마지막 부분에 아래와 같이 접속 주소가 표시된다.
[C 06:25:59.076 NotebookApp] Copy/paste this URL into your browser when you connect for the first time, to login with a token: http://localhost:8888/?token=450ff002c805518162c2a72a0d4a9cf0eb36ff7a571ae58b
- 위 주소에 접속하면 Jupyter Notebook을 사용할 수 있습니다!
그런데 Docker는 컨테이너를 종료하면 그 안에 있던 파일들도 초기화된다. 이는 도커의 특징으로 언제나 동일한 컨테이너가 실행될 수 있도록 하는데 도움을 준다. 하지만 작업한 노트북 파일을 잃는것은 우리가 원하는 것이 아니다. 이를 위해 노트북 컨테이너는 몇 가지 옵션을 제공한다.
중요한 몇 가지 옵션들
- -v [로컬 디렉터리]:/home/jovyan/work : 로컬 디렉터리를 컨테이너의 특정 디렉터리로 연결한다. 이를 통해 노트북 파일을 로컬 머신의 디렉터리에 생성되도록 할 수 있다.
- 이를 위해서는 로컬 디렉터리의 owner를 1000으로 바꿔줘야 한다.
sudo chown 1000 [Directory]
- 추가로 -e NB_UID=1000 옵션을 줘서 위의 owner를 지정해줘야 한다.
- 이를 위해서는 로컬 디렉터리의 owner를 1000으로 바꿔줘야 한다.
- –NotebookApp.password=’sha1:xxxx’ : 패스워드를 지정할 수 있다. 패스워드는 sha1 해시 값으로 mac 의 경우 아래의 커맨드로 만들 수 있다.
$ echo -n "password" | shasum
- 많은 경우 필요하게 될 위의 두 옵션을 엮으면 아래와 같은 형태가 된다.
$ docker run -d -p 8888:8888 -v [Directory]:/home/jovyan/work -e NB_U ID=1000 jupyter/scipy-notebook start-notebook.sh --NotebookApp.password='sha1:password_sha1_hash_value'
결론
어쩌다 보니 Jupyter Notebook에 대한 내용 보다는 Docker 가 중심이 된 것 같다. 몇년 전 부터 Docker는 간편하게 실행환경을 준비(Provisioning)하는데 아주 유용하게 사용되고 있다. 운영체제 설치하고 필요한 패키지를 설치하는 등 반복적이고 복잡한 일들을 줄여주기 때문이다. 특정 오픈소스 애플리케이션을 사용하기 위해 프로그래밍 언어와 의존성 있는 패키지들을 설치하는 것은 리스크도 있고 번거로운 일이었다. 도커의 등장 후 다양한 오픈소스 서버 앱들이 컨테이너 형태로 도커 허브에 등록되고 있으며 안전하고 편리하게 서버를 구동하는데 큰 도움을 주고 있다. 본인이 만든 앱도 컨테이너를 패키징하여 배포할 수 있다. 아마존 AWS와 MS Azure 등에서도 Docker Container를 지원하기 때문에 한 번 배워두면 클라우드에서도 활용하기 쉬울 것이다.