作った目的

自分の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

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

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

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

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
广告
将在 10 秒后关闭
bannerAds