Docker + Python の実行環境を作ってみた
こんにちは、おおとろ(@digiangler)です。
昨年から Docker を使って開発環境を整えて Web 開発をしています。
Docker は、自分のパソコン環境を汚すことなく隔離された環境を作って、そこでプログラムを動かすことができます。トライアンドエラーも簡単で、その作った環境はシェアすることでどこでも実行できるという点がメリットです。
本当に便利で簡単なので、これから Python を学びたい駆け出しエンジニアさんやチームで開発しているエンジニアさんには最後まで読んでほしいです。
今回は Python 環境を作りつつ JupyterLab を動かせるようにしたいと思います。
Docker のインストール
まずは環境に合った Docker Desktop をダウンロードします。
インストールしたら Docker Desktop を起動して、Terminal などで docker compose コマンドが使えるようになっていることを確認します。
$ docker
Docker の設定
ファイル構成は以下のようにしたいと思います。
ファイル構成
docker_python/ ⇦ フォルダ
├ Dockerfile ⇦ テキストデータ
├ docker-compose.yml ⇦ テキストデータ
├ requirements.txt ⇦ テキストデータ
└ opt/ ⇦ フォルダ
└ sample.py ⇦ テキストデータ
任意の場所に作成してください。
docker_python というフォルダ名は任意なので好きな名前に変更して大丈夫です。
Dockerfile
Dockerfile には、利用する開発環境を指定したり、コンテナ作成時に先にインストールしておきたい OS 用のライブラリや、Python のモジュールなどをインストールするための記述をします。
最初の FROM python:3 は、Docker が公式で用意している Python のコンテナをベースとして読み込んでいます。デフォルトで使われる環境は Linux の Debian のようです。詳しくはこちらから。
FROM python:3
USER root
RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less \
&& pip install --upgrade pip \
&& pip install --upgrade setuptools
# pip で requirements.txt に指定されているパッケージを追加する
COPY ./requirements.txt requirements.txt
RUN pip install -r requirements.txt
docker-compose.yml
ここでは、作成するコンテナの情報を書いていきます。
バージョンやコンテナの名前を決めます。working_dir というのはコンテナの中に入った直後の作業フォルダのことです。volumes はローカルフォルダとコンテナのフォルダと同期するための設定です。ここでは、opt という名前のフォルダが、コンテナ上の root/opt フォルダと同期されます。これにより、ローカルで作成したデータをコンテナ上の環境で読むことができるようになります。
version: "3"
services:
python3:
restart: always
build: .
container_name: "python3"
working_dir: "/root/"
tty: true
volumes:
- ./opt:/root/opt
requirements.txt
この時点で使いたい Python のモジュールが既に決まっていれば、requirements.txt を使って指定のパッケージを指定のバージョンで一括インストールすることができます。
設定ファイル名は任意だが requirements.txt という名前が使われることが多いです。requirements.txt はコマンドを実行するディレクトリ直下に置きます。別ディレクトリにある場合は、絶対パスか、カレントディレクトリからの相対パスを指定します。
今回は、JupyterLab のみを有効にし、他はコメントアウトしておきます。
# はコメントになります。== や > , >= , < , <= などでバージョンを指定したりもできます。バージョン指定を省略すると最新バージョンがインストールされます。カンマで区切ると二つの条件を AND で指定できます。
# 便利ツール
# pip-review
# tqdm
# joblib
jupyterlab
# 分析系
# pandas
# numpy
# scipy
# xlrd
# XlsxWriter
# python-math
# scikit-learn
# 画像系
# matplotlib
# japanize-matplotlib
# Pillow
# opencv-python
# folium
# plotly
# wordcloud
# スクレイピング系
# requests
# beautifulsoup4
# lxml
# selenium
# web系
# Flask
# Flask-Bootstrap4
# Django
# PyMySQL
# tweepy
書き方は人それぞれなので、参考程度で。
sample.py
何でもいいのですが、今回は sample.py にしました。
このファイルには実行したいPythonのプログラムを記述します。今回は省きます。Hello World でも何でもいいので、適当に書いておいてください。
イメージの作成、コンテナのビルド、そしてコンテナの起動
先ほど作成した docker_python フォルダを作業フォルダにした上で Docker イメージの作成をします。そのイメージを利用して Docker のコンテナを起動します。Dockerfile と docker-compose.yml を自動的に参照し Docker のイメージが作成されます。
このコマンドでイメージ作成 → コンテナ作成 → コンテナ起動となりますが、現状はまだコンテナの環境はバックグラウンドで走っている状態です。
$ cd docker_python/
$ docker compose up -d --build
作られたイメージとコンテナの確認
実際に作られた Docker イメージとコンテナを確認しよう。次のコマンドでイメージのリストを取得しよう。
$ docker image ls
次のようなメッセージが出ていたら成功です。
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_python_python3 latest 88f7beb0e93c 6 hours ago 1.23GB
ここでは docker_python_python3 というのが作成した Docker のイメージの名前となります。コンテナを作るためのテンプレートの名前、みたいに覚えるとわかりやすいかもしれません。
次に現在起動しているコンテナのリストを取得したいので、以下のコマンドを打ちましょう。
$ docker container ls
次のようなメッセージが出てくるかと思います。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed953077e265 docker_python_python3 "python3" 10 hours ago Up 10 hours python3
コンテナに接続
コンテナが起動していることを確認できたところで、次のコマンドでコンテナへ接続をします。python3 というのは docker-compose.yml で指定したコンテナ名です。
$ docker compose exec python3 bash
これで次からターミナルで打つコマンドはコンテナ内の環境下で実行されるようになります。
以下のような表示になれば成功です。
root@ed953077e265:~#
コンテナの終了・削除
コンテナを使い終わったらコンテナとの接続を切り、いらなくなったコンテナを削除します。まず次のコマンドでコンテナとの接続を切ります。
$ exit
その上で次のコマンドでDockerのコンテナを終了し、削除します。
$ docker compose down
次のようなメッセージが出ると思います。
[+] Running 2/2
⠿ Container python3 Removed
⠿ Network docker_python_default Removed
この後に次のようにコマンドを打ち、コンテナのリストから作ったコンテナが消えていたら無事削除できたことになります。
$ docker container ls
再度コンテナを起動したい場合
すでに Dockerfile と docker-compose.yml でイメージを作ってある場合は、--build オプションを外して次のようなコマンドを入力してすでに作られている Docker イメージからコンテナを作成して起動することができます。
$ docker compose up -d
イメージの削除
ビルドしたイメージがいらな場合は削除できます。以下のコマンドで、先にイメージのリストを取得します。IMAGE ID が表示されているのを確認してください。
$ docker image ls
次のコマンドで、いらないイメージを削除します。<imageid> には自分のイメージの ID を入力してください。
$ docker image rm <imageid>
ブラウザ経由で JupyterLab を起動してみる
今回はコンテナの中に入らず、自分のパソコン(ブラウザ)からコンテナ内の環境にアクセスします。ローカルの作業フォルダになっていることを確認して以下のコマンドを入力してください。
$ docker run -v $PWD/opt:/root/opt -w /root/opt -it --rm -p 7777:8888 docker_python_python3 jupyter-lab --ip 0.0.0.0 --allow-root -b localhost
成功すれば次のようなメッセージが出ると思います。
To access the server, open this file in a browser:
file:///root/.local/share/jupyter/runtime/jpserver-1-open.html
Or copy and paste one of these URLs:
http://4b5bfce22c91:8888/lab?token=xxxxxxxxxx
or http://127.0.0.1:8888/lab?token=xxxxxxxxxx
ウェブブラウザを開き、URL 欄に localhost:7777 と入力して JupyterLab のサーバーにアクセスしてみましょう。すると Token authentication is enabled というページが出ると思うので、そこに上のメッセージで token=に続くコードをコピーして Password or token の入力欄に入力して Log in ボタンを押します。 うまくいけば JupyterLab にログインされ、無事使えるようになります。
もしブラウザ経由ではなく、docker run コマンドで立ち上げたコンテナに接続したい場合は、別のターミナルウィンドウで次のコマンドで接続します。このとき <docker-container-id> には docker container ls で確認した現在起動しているコンテナの ID を入力します。
$ docker exec -it <docker-container-id> bash
サーバーを停止したい場合は、Control キー + C を押すと、次のようなメッセージが出ます。
Shutdown this Jupyter server (y/[n])? y
y と入力して Enter キーを押すと、サーバーが止まります。同時に一時的に作られていたコンテナも削除されます。
以上で Docker で Python の環境を作成してみました。
最後まで、読んで頂きありがとうございました❗
読んだ証明として、1 日 1 回クリックをお願い致します m(_ _)m
👇
それでは、また。
是非、感想をコメントや SNS でくださると嬉しいです。
また、スキボタンを ”こっそり” 押したり、サポートしてくださるのも、とても嬉しいです。
"こっそり" Twitter からのリツイートでの感想もくださると嬉しいです。