作った目的
自分の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 ドキュメント]
(http://docs.docker.jp/engine/installation/linux/docker-ce/centos.html)
[Docker Compose のインストール — 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)
ファイル構成
以下の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