LoginSignup
13
18

More than 5 years have passed since last update.

Python3.7.3 と jupyterLab を入れたコンテナの作成

Last updated at Posted at 2019-04-05

※2019/05/14
Dockerfileで記述ミス・記述漏れがあったため修正。

作った目的

以前、「Python3.7.1 と jupyter notebook を入れたコンテナの作成」という記事を載せていましたが、Python3.7.3が出ていたため作り直しました。
CVE-2019-9947CVE-2019-9948の対応済みでもあるし良い機会かと。
ついでに軽量化目的でイメージを変更しています。

環境

  • CentOS Linux release 7.6.1810(ホストOSです)
  • Docker version 18.09.3
  • docker-compose version 1.23.2
  • Python 3.7.3(コンテナの中)
  • jupyter-lab 0.35.4(コンテナの中)

軽量化について

以前は、CentOSのイメージを使用して、1.31GB とヘビーでした。
今回はイメージをpython:3.7.3-slim-stretchにして、734MBになりました。

DockerHubにpythonイメージがあり、特にpython:3.7.3-alpine3.9は軽量化にかなり貢献できると考えていました。
実際に作ってみると、Pythonモジュールのインストールで、'' not found '' の嵐で諦めました。

最終的に、python:3.7.3-slim-stretchで落ち着きました。
ちなみに、python:3.7.3-slim-stretchのイメージサイズは143MBです。

Dockerのインストール

Dockerのインストールは、以前の記事数多くある素晴らしい記事を参考にしてください。

ファイル構成

以下の5つのファイルを同じディレクトリに置きます。

  • Dockerfile
  • docker-compose.yml
  • jupyter_notebook_config.py
  • requirements.txt
  • .env

ファイルを置いたディレクトリでdocker-composeコマンドを実行します。

Dockerfile

Dockerfile
FROM python:3.7.3-slim-stretch

ENV PYTHONPATH "/opt/python/library"

COPY requirements.txt /tmp/requirements.txt

RUN set -x && \
    pip install -U pip && \
    pip install -r /tmp/requirements.txt && \
    mkdir -p /opt/python/library && \
    mkdir -p /opt/python/jupyter && \
    mkdir -p /opt/python/jupyterlab && \
    mkdir ~/.jupyter && \
    rm /tmp/requirements.txt

COPY ./jupyter_notebook_config.py /root/.jupyter/jupyter_notebook_config.py

EXPOSE 8888
CMD ["jupyter", "lab", "--allow-root"]

docker-compose.yml

docker-compose.yml
version: '3'

services:
  python:
    build:
      context: "./"
      dockerfile: "Dockerfile"
    image: ${TAG}
    hostname: ${TAG}
    container_name: ${TAG}
    ports:
      - "8888:8888"
    volumes:
      - /opt/${TAG}/jupyter:/opt/python/jupyter
      - /opt/${TAG}/jupyterlab:/opt/python/jupyterlab
      - /opt/${TAG}/library:/opt/python/library
    logging:
      driver: "journald"

jupyter_notebook_config.py

jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.notebook_dir = '/opt/python/jupyter'
c.LabApp.user_settings_dir = '/opt/python/jupyterlab/lab/user-settings'
c.LabApp.workspaces_dir = '/opt/python/jupyterlab/lab/workspaces'
c.NotebookApp.password = u'sha1:63cae364b3cd:c4319cba1eeb1bcf011a7d3fabd6448f95ae18c5'

c.NotebookApp.password に設定したパスワードは「password」のhash値です。

パスワードを変更する場合は、コンテナ起動後に以下のコマンドを実行し、パスワード入力後に出力されるhash値に変更します。
コンテナ名を変更した場合は、コマンドも修正します。

$ docker container exec -it python373 bash
[root@python373 /]# python -c 'from notebook.auth import passwd;print(passwd())'
Enter password:
Verify password:
sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  #これに変更
[root@python373 /]# sed -i -e "/^c\.NotebookApp\.password/s/\(sha1:\).*/\1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\'/" ~/.jupyter/jupyter_notebook_config.py 
[root@python373 /]# exit
$ docker-compose restart

コンテナを削除すると、パスワードも消えます。
必要であれば、commitして新しいイメージを作成します。

requirements.txt

コンテナ内にインストールされるpythonのモジュールです。

requirements.txt
jupyterlab==0.35.4
matplotlib==3.0.3
numpy==1.16.2
pandas==0.24.2
plotly==3.7.1
seaborn==0.9.0

.env

このファイルのTAGが、docker-compose.yml内の${TAG}に展開されます。

.env
TAG=python373

コンテナ作成

$ docker-compose build

コンテナ起動

$ docker-compose up -d

コンテナ停止と削除

$ docker-compose down

jupyterへのアクセス

ブラウザから以下へアクセスします。

http://サーバのIPアドレス:8888/

パスワードは、「password」です。
変更した場合は、変更したパスワードを入力します。

ボリュームの話

ホストの/opt/python373/jupyterをコンテナ内の/opt/python/jupyterにマウントしています。
jupyterで入力したコマンドは、ホストのボリュームに保存されます。

ホストの/opt/python373/jupyterlabをコンテナ内の/opt/python/jupyterlabにマウントしています。
jupyterlabの設定(たとえばテーマをdrakに変更)は、ホストのボリュームに保存されます。

また、ホストの/opt/python373/libraryをコンテナの/opt/python/libraryにマウントしており、パスを通しています。
そのため、次の手順でライブラリを追加できます。

ライブラリの追加方法

ライブラリを追加する場合は、ホストで以下のコマンドを実行します。(コンテナは起動したままですよ)
以下の例では、simplejsonライブラリを追加しています。

$ docker container exec -t python373 pip install simplejson -t /opt/python/library

最後に

この環境を作って一週間ほど起動させて使っていますが、特に問題は起きていません。
scikit_learnやtensorflowも追加できています。(私にスキルがないため追加しただけです。またtensorflowは単体でDockerイメージがあるので微妙ですが・・・)
これからPythonならびに機械学習・深層学習の勉強をガンガン進めていければ・・・いいなぁ。

13
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
18