数学的にどうなのさ?

大学時代にちょっと長く数学を勉強した人の雑記。数学のこと(主に統計)や趣味、メモなどが多くなります

WSL上のDocker上で動いてるjupyterにアクセスしたい

概要

以下のページでWSL上にDockerの環境を立ち上げた.

lua0810.hatenablog.com

これだけでもいろいろできるのだが,何かの開発をしようとすると結構面倒.
そこでとりあえずDocker image内でjupyterを立ち上げて,そこにWindowsからアクセスする方法をメモしておく.

Docker imageの作成

少し面倒だが,以下のような内容のDockerfileファイルをWSL上に作成する.

FROM nvidia/cuda:11.8.0-base-ubuntu22.04

RUN apt update
RUN apt install python3.10 -y
RUN apt install python3-pip -y
RUN pip install jupyterlab

FROMは元となるDocker image,以降は追加で処理するコマンドをRUNで指定する.
内容としては、python3.10とpython3-pipをインストールして,jupyterlabをインストールする.
そしてこのDockerfileがある場所で以下を使ってビルド作業を行う.

docker build -t jupyter .

これでDocker imagesを実行してもらうと,jupyterというコンテナができている.

Docker runの実行で注意すること

必要なのはホスト側とコンテナ側のポート接続が必要になる.こうしないとホスト側でそのポートを認識できなくなる.実行例は以下.

docker container run -it --rm --gpus all --publish 18888:8888 jupyter

色々とオプションを付けてるが,ここで重要なのは--publish 18888:8888で,ホストの18888ポートとコンテナの8888ポートを接続することになる.

jupyter lab立ち上げ時に注意すること

後はコンテナが立ち上がったらjupyterlabを立ち上げるだけなのだが,ここでも注意点がある.
以下が大丈夫なコマンド.

jupyter lab --ip=0.0.0.0 --allow-root

--allow-rootは無いとつけないとエラーが起きる.
--ip=0.0.0.0は無いとアクセスができない.原因はよくわからない.

とりあえずこれでDocker上で実行しているjupyterにアクセスできるようになる.

もっと簡単にしたい

あれこれと実行時に指定していくのは結構面倒なので,それを簡略化する方法を記載する.

コンテナに入った後にjupyter labを立ち上げる部分を省略する

Dockerfilesを以下のように修正する.

FROM nvidia/cuda:11.8.0-base-ubuntu22.04

RUN apt update
RUN apt install python3.10 -y
RUN apt install python3-pip -y
RUN pip install jupyterlab
RUN cd mnt
RUN mkdir host_src

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]

RUN cd mntRUN mkdir host_srcは別のところで使うので一応記載している部分.
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]はこのコマンドをコンテナ立ち上げ時に実行する命令文になっている.
これでコンテナ立ち上げ時に毎回jupyterlabを手動で実行する必要がなくなる.

docker-composeの利用

後はやりたいこととして - ホストとコンテナのport接続 - ついでにホスト側のディレクトリをコンテナ側でマウントしてソースコードを読み込めるようにする

この2点を自動化することになる.
これらを行うのにdocker-compose.ymlを利用する.
以下のページを参考にdocker-compose.ymlを作成してみた.

qiita.com

version: '2.21'

services:
  jupyter:
    container_name: jupyter
    build:
      context: .
    ports:
      - '18888:8888'
    volumes:
      - type: bind
        source: /home/lua/src
        target: /mnt/host_src

各箇所の解説は上のページを参照してもらいたい.
ともかくこれで開発は少し楽ができることが分かった.docker-compose.ymlはGPUの利用宣言なんかもできて便利.

最後に

VSCodeを利用するともっと楽できるかもしれないとのことなので,今度はそっちについても調べてみようと思う.