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

## 作った目的
自分の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 の入手 &mdash; Docker-docs-ja 17.06.Beta ドキュメント]
(http://docs.docker.jp/engine/installation/linux/docker-ce/centos.html)
[Docker Compose のインストール &mdash; Docker-docs-ja 17.06.Beta ドキュメント]
(http://docs.docker.jp/compose/install.html)
[Releases · docker/compose · GitHub]
(https://github.com/docker/compose/releases)

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

```
$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker
```
一度ログオフして、再ログインします。

参考：
[Dockerコマンドをsudoなしで実行する方法 - Qiita]
(https://qiita.com/DQNEO/items/da5df074c48b012152ee)

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

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

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


## Dockerfile

```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

```json-doc: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

```python: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

```bash:.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