LoginSignup
8
9

More than 5 years have passed since last update.

python3.7.1 と jupyter notebook を入れたコンテナの作成

Posted at

作った目的

自分のDockerの勉強ついでに、最新版のpython環境として作ったコンテナです。
起動するコンテナは1つですが、オプションが多いのでdocker-composeで起動します。

環境

  • CentOS Linux release 7.6.1810
  • Docker version 18.09.1
  • docker-compose version 1.23.2
  • Python 3.7.1(コンテナの中)
  • jupyter 4.4.0(コンテナの中)

Dockerのインストール

Dockerを入れていない場合は、以下のコマンドでインストールします。

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install -y docker-ce
$ docker -v
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose -v

参考:
CentOS 用 Docker CE の入手 — Docker-docs-ja 17.06.Beta ドキュメント
Docker Compose のインストール — Docker-docs-ja 17.06.Beta ドキュメント
Releases · docker/compose · GitHub

buildでエラーが出ないようにする

build時にエラーが出るので、事前に回避のための設定を入れます。

$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker

一度ログオフして、再ログインします。

参考:
Dockerコマンドをsudoなしで実行する方法 - Qiita

ファイル構成

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

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

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

Dockerfile

Dockerfile
FROM centos

ENV PYTHONPATH "/opt/python/library"

ARG version="3.7.1"

COPY ./jupyter_notebook_config.py /tmp/jupyter_notebook_config.py

RUN set -x && \
    yum install -y gcc bzip2-devel libffi-devel make && \
    yum install -y openssl-devel wget sqlite-devel && \
    wget https://www.python.org/ftp/python/${version}/Python-${version}.tgz -O /tmp/python.tgz && \
    tar xzf /tmp/python.tgz -C /tmp && \
    cd /tmp/Python-${version} && \
    ./configure --enable-optimizations && \
    make altinstall && \
    ln -s /usr/local/bin/python3.7 /usr/bin/python3 && \
    ln -s /usr/local/bin/pip3.7 /usr/bin/pip3 && \
    pip3 install -U pip && \
    pip3 install jupyter matplotlib numpy && \
    pip3 install pandas seaborn scikit-learn plotly && \
    mkdir -p /opt/python/library && \
    mkdir -p /opt/python/jupyter && \
    mkdir ~/.jupyter && \
    mv /tmp/jupyter_notebook_config.py ~/.jupyter && \
    rm /tmp/python.tgz && \
    yum -y remove wget && \
    yum clean all

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

docker-compose.yml

docker-compose.yml
version: '3'

services:
  python:
    build:
      context: "./"
      dockerfile: "Dockerfile"
    image: centos/${TAG}
    hostname: ${TAG}
    container_name: ${TAG}
    ports:
      - "8888:8888"
    volumes:
      - /opt/${TAG}/jupyter:/opt/python/jupyter
      - /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.NotebookApp.password = u'sha1:63cae364b3cd:c4319cba1eeb1bcf011a7d3fabd6448f95ae18c5'

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

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

$ docker container exec -it python371 /bin/bash
[root@python371 /]# python3 -c 'from notebook.auth import passwd;print(passwd())'
Enter password:
Verify password:
sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  #これに変更
[root@python371 /]# vi ~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.password = u'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
[root@python371 /]# exit
$ docker-compose restart

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

.env

.env
TAG=python371

コンテナ作成

$ docker-compose build

コンテナ起動

$ docker-compose up -d

コンテナ停止と削除

$ docker-compose down

jupyterへのアクセス

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

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

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

ボリュームの話

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

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

ライブラリの追加方法

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

$ sudo pip3 install simplejson -t /opt/python371/library

ホストにpip3コマンドがない場合は、以下のようにインストールします。

$ sudo yum install -y epel-release
$ sudo yum install -y python34 python34-pip
8
9
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
8
9