Docker環境でJupyter Labを立ち上げて使う方法メモ
お久しぶりです.
今回は音楽の話ではなく,プログラミングの話題です.
開発環境を手軽に構成・削除できるDocker環境上でJupyter Labを立ち上げ,ホストOS側のブラウザ(=Dockerコンテナの外)から利用できるようにする方法を紹介します.
- 環境
- 準備
- 手順の概要
- 1 作業フォルダの作成
- 2 Dockerfileを作成
- 3 docker-compose.ymlの作成
- 4 requirements.txtの作成
- 5 Dockerイメージの作成・コンテナの起動
- 6 トークンを取得し,JupyterLabにアクセス
- Dockerコンテナの停止・再開など
- 後からNode.jsとnpmをインストールする
環境
準備
ホストOSにDockerはインストールされているとします. 私と同じくUbuntuの場合は,以下のリンク先を参考にすると良いと思います.
さらに,docker-compose
も利用できるようにしておきましょう.
ホストOSがWindowsかMacなら,Docker-Desktopをインストールした段階で利用できます.
Linuxの場合は自力でインストールします.
手順の概要
Dockerfile
,docker-compose.yml
,requirements.txt
を書く.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.yml
,requirements.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.jsとnpmが必要ですが,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:
の後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-jupyter
のbashに入りたい場合
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
で再起動します.