まくんの音楽ノート

自由気ままに音楽とプログラミング

Docker環境でJupyter Labを立ち上げて使う方法メモ

お久しぶりです.

今回は音楽の話ではなく,プログラミングの話題です.

開発環境を手軽に構成・削除できるDocker環境上でJupyter Labを立ち上げ,ホストOS側のブラウザ(=Dockerコンテナの外)から利用できるようにする方法を紹介します.

環境

  • ホストマシン
  • Docker version 20.10.14

準備

ホストOSにDockerはインストールされているとします. 私と同じくUbuntuの場合は,以下のリンク先を参考にすると良いと思います.

さらに,docker-composeも利用できるようにしておきましょう. ホストOSがWindowsMacなら,Docker-Desktopをインストールした段階で利用できます.

Linuxの場合は自力でインストールします.

手順の概要

  1. Dockerfile, docker-compose.ymlrequirements.txtを書く.
  2. docker-composeを使ってDockerイメージの作成&コンテナの起動を行う.

1 作業フォルダの作成

今回はディレクトリ構成を以下のように仮定します.

project-dir
  ├ Dockerfile
  ├ docker-compose.yml
  ├ requirements.txt
  ├ work-dir
    ├ your_notebook.ipynb
    ├ (more ...)
mkdir project-dir
cd project-dir && mkdir work-dir

環境の準備はDockerfile, docker-compose.ymlrequirements.txtの編集だけで行えます.

2 Dockerfileを作成

  • Dockerfileの例(最小構成)
FROM python:latest

WORKDIR ./work-dir

USER root
RUN apt update
ENV TZ=Asia/Tokyo
ENV TERM xterm

### Install python packages
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt

Jupyter Labの長所はいろいろな拡張機能(Extensions)が使える点にあると思います. Jupyter Labの拡張機能をビルドするにはNode.jsnpmが必要ですが,Dockerのpythonイメージにはインストールされていませんので,aptを使ってインストールしておきます.

なお後からインストールすることも可能です.

  • Dockerfileの例(JupyterLab拡張機能をいろいろ入れたい人用)
    • RUN apt -y install nodejs npmが増えただけです.
FROM python:latest

WORKDIR ./work-dir

USER root
RUN apt update
ENV TZ=Asia/Tokyo
ENV TERM xterm

RUN apt -y install nodejs npm

### Install python packages
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt

DockerfileはDockerイメージの設計書のようなものです.

細かいことはあとにして,今回重要なのは次の項目です.

  • FROM python:latest: 基礎となるDockerイメージを指定

    • 今回はpython:latestです.これはDocker Hub上にあるpythonというDockerイメージの最新版を拾ってきて,それをベースにするという意味です.

    • 特定のPythonバージョンを使いたい場合は,FROM python:3.10.4-slimなどのように,タグを指定します.

  • RUN pip install (略)で,requirements.txtからPythonパッケージをまとめてインストール

    • requirements.txtに書いておいたパッケージを,Dockerイメージ作成時にプリインストールしておきます.コンテナ起動後に追加することもできますが,あらかじめrequirements.txtに書いておいたほうが環境の整理が楽だと思います.

3 docker-compose.ymlの作成

docker-compose.ymlの例

version: "3"
services:
  jupyter:
    build: .
    container_name: "py3-jupyter"
    command:
     jupyter-lab --ip 0.0.0.0 --allow-root --no-browser -b localhost
    ports:
      - "8888:8888"
    working_dir: /root/work-dir
    tty: true
    volumes:
      - ./work-dir:/root/work-dir

docker-compose.ymlは,Dockerイメージの作成,コンテナの起動の際のオプション構成をわかりやすくまとめておけるものです.

docker-compose.ymlがなくても対応するオプションをコマンドライン上で適切に指定できれば同じことができるのですが,オプションが多いとわかりにくい上打つのも管理するもめんどくさくなります.

注意する項目は次のとおり.

  • container_name: コンテナ名です.ここは自由に決めてください.

  • services:の直後にあるjupyter:

    • これはdocker-composeを使う時に指定する名前になります.
  • command:の後

    • command:は,Dockerコンテナ起動時に最初に実行する命令です.ここではjupyter-labをそのまま指定していますので,起動直後にjupyter serverが立ち上がるようになっています.

    • 例えばここをpythonにすると,pythonインタプリタが起動します.

  • ports: (重要)

    • DockerコンテナがホストOSとやりとり可能なポート番号を指定します.

    • 今回はJupyter Serverをポート8888で起動する(デフォルト)なので,ports: - "8888:8888"でホストOSの8888番ポートとDockerコンテナの8888番ポートをマップします.ホストOSのどのポートをマップするかは自由です.

    • 同じDockerコンテナ上で複数のJupyter Serverを立ち上げて使い分ける…という使い方をしない限りは,Jupyter側のポートは8888のままで問題ないと思います.

    • 例えばホスト側から見てlocalhost:9999でJupyter serverにアクセスしたい場合は,ports: - "9999:8888"としておけばOKです.

  • おまけ: build:などと同じ階層にrestart: alwaysを指定すると,Jupyterが終了したときに勝手にコンテナが再起動するようになります.たとえば,ブラウザのJupyter LabからShut Downをかけた場合,このオプションがなければコンテナは停止します.このオプションをつけとくと勝手に再起動してくれます.

4 requirements.txtの作成

何かコピーしたい環境があるなら,そのPython環境のpip freezeの出力をそのままrequirements.txtに書けば完成です.

Jupyter Labのインストールには最低限jupyterlabを指定しておけばOKです. 今回はついでにnumpyとmatplotlibも入れます.

requirements.txtの例

numpy
matplotlib
jupyterlab

5 Dockerイメージの作成・コンテナの起動

準備はできたので,Dockerイメージを作ってDockerコンテナを起動します.

docker-composeを使えば一発です.

cd project-root
docker-compose up -d jupyter
  • -dをつけているのでバックグラウンド起動になります.これはただ操作しているターミナルが使えなくなるのが嫌なので付けてるだけです.

    • つけないと,普段jupyter-labとかjupyter notebookを打った時のように,そのターミナルはJupyterのログが出力され続けます.バックグラウンドに回したい場合は,ctrlを押しながらP, Qと叩けば回ってくれます.

6 トークンを取得し,JupyterLabにアクセス

Dockerコンテナ(とJupyter)は起動しましたが,アクセスするにはトークンが必要です.

docker logs <CONTAINER NAME or ID>を使うと,そのコンテナの出力ログを見れるので,これを使ってJupyter Labのトークンを確認しましょう.

py3-jupyterというコンテナ名の場合は,

docker logs py3-jupyter | tail

適当にtailをつけてますが,grepなどを使ってトークンのある行を抜き出すのも良いでしょう.

    To access the server, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/jpserver-1-open.html
    Or copy and paste one of these URLs:
        http://e07fb99e87fb:8888/lab?token=AAAAA(DEMO)
     or http://127.0.0.1:8888/lab?token=AAAAA(DEMO)

トークンはごまかしましたが,こんな感じでトークンが確認できます.

あとはホストOS側のブラウザからアクセスしてみてください.

Dockerコンテナの停止・再開など

この記事で構成したJupyter環境は,「コンテナがJupyterサーバーとして振る舞っている」という認識で使います. せっかくDocker環境でやってますので,Dockerコンテナごと停止・再開をかけると楽です.

停止

docker stop py3-jupyter

再開

docker start py3-jupyter

特定の命令を実行 - 例: py3-jupyterbashに入りたい場合

docker exec -it py3-jupyter bash

起動中のコンテナの一覧

docker ps

存在する全てのコンテナの確認

docker ps -a

コンテナの削除(コンテナは停止しておいてください.)

docker rm py3-jupyter

Dockerイメージの一覧

docker images

Dockerイメージの削除(対象のイメージを元に作成したコンテナは全て削除しておいてください.)

docker rmi <IMAGE ID>

後からNode.jsとnpmをインストールする

既に構築してしまったJupyter環境上で,拡張機能のインストール用にNode.js,npmをインストールする方法です.

まずdockerコンテナのbashに入ります. Jupyter Lab上のTerminalでも大丈夫です.

docker exec -it py3-jupyter bash

次にapt updateからのapt installです.

apt update
apt install nodejs npm

インストールが終わったら,念のためJupyter Labを再起動します. docker stop py3-jupyterからのdocker start py3-jupyterで再起動します.