JupyterLab으로 데이터 과학

JupyterLab으로 데이터 과학

Docker로 Jupyter 노트북을 실행해볼게요.

출처: 문서

본문

Docker와 JupyterLab은 내 데이터 과학 워크플로를 향상시킬 수 있는 두 가지 강력한 도구예요. 이 가이드에서는 이 둘을 함께 사용해 재현 가능한 데이터 과학 환경을 만들고 실행하는 방법을 배워요. 이 가이드는 Supercharging AI/ML Development with JupyterLab and Docker 를 기반으로 해요.

이 가이드에서 배울 내용:

  • 로컬 머신에서 JupyterLab으로 개인 Jupyter Server 실행하기
  • 내 JupyterLab 환경 커스터마이즈하기
  • JupyterLab 노트북과 환경을 다른 데이터 과학자와 공유하기

JupyterLab이란?

JupyterLab 은 계산 노트북 문서 개념을 중심으로 구축된 오픈소스 어플리케이션이에요. 코드 공유·실행, 데이터 처리, 시각화를 가능하게 하고 그래프 생성을 위한 다양한 대화형 기능을 제공해요.

왜 Docker와 JupyterLab을 함께 사용하나요?

Docker와 JupyterLab을 결합하면 두 도구의 이점을 모두 누릴 수 있어요:

  • 컨테이너화는 모든 배포에서 일관된 JupyterLab 환경을 보장해 호환성 문제를 제거해요.
  • 컨테이너화된 JupyterLab은 수동 환경 설정의 필요를 없애 공유와 협업을 단순화해요.
  • 컨테이너는 JupyterLab에 확장성을 제공해 Kubernetes 같은 플랫폼으로 워크로드 분산과 효율적인 리소스 관리를 지원해요.

사전 요구사항

이 가이드를 따라 하려면 최신 버전의 Docker Desktop 을 설치해야 해요.

JupyterLab 컨테이너 실행 및 접근

터미널에서 다음 명령을 실행해 내 JupyterLab 컨테이너를 실행해주세요.

$ docker run --rm -p 8889:8888 quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

명령의 주목할 만한 부분:

  • -p 8889:8888 : 호스트의 포트 8889를 컨테이너의 포트 8888에 매핑해요.
  • start-notebook.py --NotebookApp.token='my-token' : 무작위 토큰 대신 액세스 토큰을 설정해요.

자세한 내용은 Jupyter Server Options 와 docker run CLI 참조 를 참고하세요.

이 이미지를 처음 실행한다면 Docker가 다운로드하고 실행해요. 이미지 다운로드 시간은 네트워크 연결에 따라 달라져요.

이미지가 다운로드되고 실행되면 컨테이너에 접근할 수 있어요. 접근하려면 웹 브라우저에서 localhost:8889/lab?token=my-token 으로 이동해주세요.

컨테이너를 중지하려면 터미널에서 ctrl + c 를 누르세요.

시스템의 기존 노트북에 접근하려면 바인드 마운트 를 사용할 수 있어요. 터미널을 열고 기존 노트북이 있는 디렉터리로 이동한 뒤, 운영 체제에 따라 다음 명령을 실행해주세요.

Mac/Linux:

$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

Windows(Command Prompt):

$ docker run --rm -p 8889:8888 -v "%cd%":/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

Windows(PowerShell):

$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

Windows(Git Bash):

$ docker run --rm -p 8889:8888 -v "/$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

-v 옵션은 Docker에게 현재 작업 디렉터리를 컨테이너 안의 /home/jovyan/work 에 마운트하라고 지시해요. 기본적으로 Jupyter 이미지의 루트 디렉터리는 /home/jovyan 이며, 컨테이너에서는 그 디렉터리에만 노트북을 접근하거나 저장할 수 있어요.

이제 localhost:8889/lab?token=my-token 에 접근해 바인드 마운트된 디렉터리에 포함된 노트북을 열 수 있어요.

컨테이너를 중지하려면 터미널에서 ctrl + c 를 누르세요.

Docker에는 또한 볼륨 이 있는데, 이는 Docker 컨테이너가 생성·사용하는 데이터를 영속화하는 선호되는 메커니즘이에요. 바인드 마운트가 호스트 머신의 디렉터리 구조와 OS에 의존하는 반면, 볼륨은 Docker가 완전히 관리해요.

노트북 저장 및 접근

컨테이너를 제거하면 그 컨테이너의 모든 데이터가 삭제돼요. 노트북을 컨테이너 밖에 저장하려면 볼륨 을 사용할 수 있어요.

볼륨으로 JupyterLab 컨테이너 실행

볼륨으로 컨테이너를 시작하려면 터미널을 열고 다음 명령을 실행해주세요

$ docker run --rm -p 8889:8888 -v jupyter-data:/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'

-v 옵션은 Docker에게 jupyter-data 라는 볼륨을 만들어 컨테이너의 /home/jovyan/work 에 마운트하라고 지시해요.

컨테이너에 접근하려면 웹 브라우저에서 localhost:8889/lab?token=my-token 으로 이동해주세요.

이제 노트북을 볼륨에 저장할 수 있으며, 컨테이너가 삭제되어도 접근 가능해요.

노트북을 볼륨에 저장

이 예제에서는 scikit-learn의 Iris Dataset 예제를 사용할 거예요.

웹 브라우저를 열고 localhost:8889/lab?token=my-token 에서 JupyterLab 컨테이너에 접근해주세요.

Launcher 에서 Notebook 아래의 Python 3 을 선택해주세요.

노트북에서 필요한 패키지를 설치하려면 다음을 지정해주세요.

!pip install matplotlib scikit-learn

재생 버튼을 선택해 코드를 실행해주세요.

노트북에서 다음 코드를 지정해주세요.

from sklearn import datasets
iris = datasets.load_iris()
import matplotlib.pyplot as plt

_, ax = plt.subplots()
scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target)
ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1])
_ = ax.legend(scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes")

재생 버튼을 선택해 코드를 실행해주세요. Iris 데이터셋의 산점도가 보여야 해요.

상단 메뉴에서 File 을 선택한 다음 Save Notebook 을 선택해주세요.

노트북을 볼륨에 저장하려면 work 디렉터리에 이름을 지정해주세요. 예: work/mynotebook.ipynb .

Rename 을 선택해 노트북을 저장해주세요.

이제 노트북이 볼륨에 저장됐어요.

터미널에서 ctrl + c 를 눌러 컨테이너를 중지해주세요.

이제 볼륨으로 Jupyter 컨테이너를 실행할 때마다 저장된 노트북에 접근할 수 있어요.

새 컨테이너를 실행하고 데이터 플롯 코드를 다시 실행할 때는 !pip install matplotlib scikit-learn 을 실행하고 패키지를 다운로드해야 해요.

새 컨테이너를 실행할 때마다 패키지를 다시 설치하지 않으려면 패키지가 이미 설치된 나만의 이미지를 만들면 돼요.

JupyterLab 환경 커스터마이즈

Docker를 사용해 나만의 JupyterLab 환경을 만들고 이미지로 빌드할 수 있어요. 나만의 이미지를 빌드하면 필요한 패키지와 도구로 JupyterLab 환경을 커스터마이즈하고, 여러 배포에서 일관되고 재현 가능하게 보장할 수 있어요. 나만의 이미지를 빌드하는 것은 JupyterLab 환경을 다른 사람과 공유하거나 추가 개발의 기반으로 사용하기도 더 쉽게 해줘요.

Dockerfile에서 환경 정의하기

이전 볼륨에 노트북 저장하기 의 Iris Dataset 예제에서 새 컨테이너를 실행할 때마다 의존성인 matplotlib 와 scikit-learn 을 설치해야 했어요. 그 작은 예제의 의존성은 빠르게 다운로드·설치되지만, 의존성 목록이 늘어나면 문제가 될 수 있어요. 환경에 항상 원하는 다른 도구, 패키지, 파일이 있을 수도 있어요.

이 경우 의존성을 이미지의 환경의 일부로 설치할 수 있어요. 그러면 컨테이너를 실행할 때마다 의존성이 항상 설치되어 있어요.

Dockerfile에서 환경을 정의할 수 있어요. Dockerfile은 Docker에게 내 JupyterLab 환경의 이미지를 만드는 방법을 지시하는 텍스트 파일이에요. 이미지는 JupyterLab을 실행할 때 원하고 필요한 모든 것(파일, 패키지, 도구)을 포함해요.

원하는 디렉터리에 Dockerfile 이라는 새 텍스트 파일을 만들어주세요. IDE 또는 텍스트 편집기에서 Dockerfile 을 열고 다음 내용을 추가해주세요.

# syntax=docker/dockerfile:1
FROM quay.io/jupyter/base-notebook
RUN pip install --no-cache-dir matplotlib scikit-learn

이 Dockerfile은 quay.io/jupyter/base-notebook 이미지를 베이스로 사용하고, 그다음 pip 로 의존성을 설치해요. Dockerfile의 지침에 대한 자세한 내용은 Dockerfile 참조 를 참고하세요.

계속하기 전에 Dockerfile 에 대한 변경 사항을 저장해주세요.

환경을 이미지로 빌드

환경을 정의하는 Dockerfile 이 있으면 docker build 를 사용해 Dockerfile 로 이미지를 빌드할 수 있어요.

터미널을 열고 Dockerfile 이 있는 디렉터리로 이동한 다음 다음 명령을 실행해주세요.

$ docker build -t my-jupyter-image .

이 명령은 Dockerfile 과 컨텍스트에서 Docker 이미지를 빌드해요. -t 옵션은 이미지의 이름과 태그를 지정하며, 이 경우 my-jupyter-image 예요. . 은 현재 디렉터리가 컨텍스트임을 나타내며, 즉 그 디렉터리의 파일이 이미지 생성 과정에서 사용될 수 있다는 뜻이에요.

Docker Desktop의 Images 뷰를 보거나 터미널에서 docker image ls 명령을 실행해 이미지가 빌드됐는지 확인할 수 있어요. my-jupyter-image 라는 이미지가 보여야 해요.

이미지를 컨테이너로 실행

이미지를 컨테이너로 실행하려면 docker run 명령을 사용해요. docker run 명령에서 나만의 이미지 이름을 지정해주세요.

$ docker run --rm -p 8889:8888 my-jupyter-image start-notebook.py --NotebookApp.token='my-token'

컨테이너에 접근하려면 웹 브라우저에서 localhost:8889/lab?token=my-token 으로 이동해주세요.

이제 노트북에서 패키지를 설치하지 않고도 사용할 수 있어요.

Launcher 에서 Notebook 아래의 Python 3 을 선택해주세요.

노트북에서 다음 코드를 지정해주세요.

from sklearn import datasets
iris = datasets.load_iris()
import matplotlib.pyplot as plt

_, ax = plt.subplots()
scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target)
ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1])
_ = ax.legend(scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes")

재생 버튼을 선택해 코드를 실행해주세요. Iris 데이터셋의 산점도가 보여야 해요.

터미널에서 ctrl + c 를 눌러 컨테이너를 중지해주세요.

Compose로 컨테이너 실행

Docker Compose는 멀티 컨테이너 어플리케이션을 정의하고 실행하는 도구예요. 이 경우 어플리케이션은 멀티 컨테이너 어플리케이션이 아니지만, Docker Compose는 모든 docker run 옵션을 파일에 정의해 실행을 더 쉽게 만들어줘요.

Compose 파일 만들기

Compose를 사용하려면 compose.yaml 파일이 필요해요. Dockerfile 과 같은 디렉터리에 compose.yaml 이라는 새 파일을 만들어주세요.

IDE 또는 텍스트 편집기에서 compose.yaml 파일을 열고 다음 내용을 추가해주세요.

services:
  jupyter:
    build:
      context: .
    ports:
      - 8889:8888
    volumes:
      - jupyter-data:/home/jovyan/work
    command: start-notebook.py --NotebookApp.token='my-token'
volumes:
  jupyter-data:
    name: jupyter-data

이 Compose 파일은 docker run 명령에서 사용한 모든 옵션을 지정해요. Compose 지침에 대한 자세한 내용은 Compose 파일 참조 를 참고하세요.

계속하기 전에 compose.yaml 파일에 대한 변경 사항을 저장해주세요.

Compose로 컨테이너 실행

터미널을 열고 compose.yaml 파일이 있는 디렉터리로 이동한 다음 다음 명령을 실행해주세요.

$ docker compose up --build

이 명령은 compose.yaml 파일에 지정된 지침대로 이미지를 빌드하고 컨테이너로 실행해요. --build 옵션은 이미지가 재빌드되게 보장하며, Dockerfile 을 변경했다면 필요해요.

컨테이너에 접근하려면 웹 브라우저에서 localhost:8889/lab?token=my-token 으로 이동해주세요.

터미널에서 ctrl + c 를 눌러 컨테이너를 중지해주세요.

작업 공유하기

이미지와 노트북을 공유하면 이식 가능하고 재현 가능한 연구 환경을 만들 수 있어 다른 데이터 과학자들이 쉽게 접근하고 사용할 수 있어요. 이 과정은 협업을 촉진할 뿐 아니라 호환성 문제 없이 실행할 수 있는 환경에서 내 작업이 보존되게 보장해요.

이미지와 데이터를 공유하려면 Docker Hub 를 사용할 거예요. Docker Hub는 컨테이너 이미지를 공유·배포할 수 있는 클라우드 기반 레지스트리 서비스예요.

이미지 공유

Docker Hub 에 가입 하거나 로그인 해주세요.

Docker가 푸시할 리포지토리를 알 수 있도록 이미지 이름을 바꾸세요. 터미널을 열고 다음 docker tag 명령을 실행해주세요. YOUR-USER-NAME 을 내 Docker ID로 바꾸세요.

$ docker tag my-jupyter-image YOUR-USER-NAME/my-jupyter-image

다음 docker push 명령을 실행해 이미지를 Docker Hub에 푸시해주세요. YOUR-USER-NAME 을 내 Docker ID로 바꾸세요.

$ docker push YOUR-USER-NAME/my-jupyter-image

이미지를 Docker Hub에 푸시했는지 확인해주세요.

Docker Hub 로 이동해주세요.

My Hub > Repositories 를 선택해주세요.

리포지토리의 Last pushed 시간을 확인해주세요.

이제 다른 사용자가 docker run 명령으로 내 이미지를 다운로드·실행할 수 있어요. YOUR-USER-NAME 을 내 Docker ID로 바꿔야 해요.

$ docker run --rm -p 8889:8888 YOUR-USER-NAME/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'

볼륨 공유

이 예제는 Docker Desktop 그래픽 사용자 인터페이스를 사용해요. 대안으로 명령줄 인터페이스에서 볼륨을 백업 하고 ORAS CLI 로 푸시 할 수 있어요.

Docker Desktop에 로그인해주세요.

Docker Dashboard에서 Volumes 를 선택해주세요.

이름을 선택해 jupyter-data 볼륨을 선택해주세요.

Exports 탭을 선택해주세요.

Quick export 를 선택해주세요.

Location 에서 Registry 를 선택해주세요.

Registry 아래의 텍스트 상자에 내 Docker ID, 볼륨 이름, 태그를 지정해주세요. 예: YOUR-USERNAME/jupyter-data:latest .

Save 를 선택해주세요.

볼륨을 Docker Hub로 내보냈는지 확인해주세요.

Docker Hub 로 이동해주세요.

My Hub > Repositories 를 선택해주세요.

리포지토리의 Last pushed 시간을 확인해주세요.

이제 다른 사용자가 내 볼륨을 다운로드·가져올 수 있어요. 볼륨을 가져온 다음 이미지로 실행하려면:

Docker Desktop에 로그인해주세요.

Docker Dashboard에서 Volumes 를 선택해주세요.

Create 를 선택해 새 볼륨을 만들어주세요.

새 볼륨의 이름을 지정해주세요. 이 예제에서는 jupyter-data-2 를 사용해요.

Create 를 선택해주세요.

볼륨 목록에서 이름 을 선택해 jupyter-data-2 볼륨을 선택해주세요.

Import 를 선택해주세요.

Location 에서 Registry 를 선택해주세요.

Registry 아래의 텍스트 상자에 볼륨을 내보낸 리포지토리와 같은 이름을 지정해주세요. 예: YOUR-USERNAME/jupyter-data:latest .

Import 를 선택해주세요.

터미널에서 docker run 을 실행해 가져온 볼륨으로 내 이미지를 실행해주세요. YOUR-USER-NAME 을 내 Docker ID로 바꾸세요.

$ docker run --rm -p 8889:8888 -v jupyter-data-2:/home/jovyan/work YOUR-USER-NAME/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'

요약

이 가이드에서 Docker와 JupyterLab을 활용해 재현 가능한 데이터 과학 환경을 만들고, 데이터 과학 프로젝트의 개발과 공유를 촉진하는 방법을 배웠어요. 개인 JupyterLab 서버 실행, 필요한 도구와 패키지로 환경 커스터마이즈, 다른 데이터 과학자와 노트북·환경 공유가 포함되었어요.

관련 정보:

  • Dockerfile 참조
  • Compose 파일 참조
  • Docker CLI 참조
  • Jupyter Docker Stacks 문서

더 알아보기 (Learn more)

  • JupyterLab
  • Jupyter Docker Stacks
  • Docker Compose