【Python】秒殺!Docker仮想環境でPython環境を構築する

Dockerアプリケーションの仮想環境でPython環境を構築する。

Pythonの勉強やちょっとだけ動かしたいけど、PCをあまり汚したくない、というときにDockerアプリケーションの仮想環境が使えるとすぐに準備ができる。

環境

  • macOS Big Sur 11.6 (Chip: Apple M1)
  • Docker Desktop for Mac 4.3.2

[前提]Dockerアプリケーションのインストール

なお、本記事はDockerアプリケーションがインストールされていることが前提となる。

Docker Desktop for Macのインストールに関しては以下の記事を参考にしてもらいたい。意外とすぐにインストールできる。

【Docker】Docker Desktop for Macをインストールする

Python実行環境セットアップ

ここでは、以下の3方法についてセットアップ方法を記載する。上にも記載したがDockerアプリケーションがインストールされている前提である。

※あくまでも表現や方法は個人的に思っていることなので、違和感や誤りがあってもご了承いただきたい。

  • とりあえずpythonコマンドを実行できる環境
  • とりあえずJupyter notebookを起動する環境
  • pythonコマンド実行もJupyter notebook起動もできる環境

また以降の記載で作業するディレクトリは~/docker/workで実施しているので、作業ディレクトリは随時変更してもらいたい。特に気にしない場合は、そのままで良いと思う。

またlocalの~/docker/workをコンテナの/workにマウントするので、コンテナ内の/workで作成したファイルはlocalの~/docker/workに保存されるように設定している。

以下のコマンドで作業ディレクトリの作成。今回は権限エラーを防ぐためにあくまで個人作業フォルダとしてフル権限(-m 777)にしている。

mkdir -p -m 777 ~/docker/work

ディレクトリ移動しておく。

cd ~/docker/work

Udemy >> 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

とりあえずpythonコマンドを実行できる環境

以下の順で準備する。

  1. docker run でpythonイメージをpullしてコンテナを起動
  2. docker exec でコンテナに入る

1. docker run でpythonイメージをpullしてコンテナを起動

以下のコマンドでイメージをpullして、コンテナを起動する。コンテナ名(py39_test)は任意で、タグ(3.9)は適したものをセットする。

docker run -itd --name py39_test -v ~/docker/work/:/work python:3.9

実際に実行すると以下のようになる。

 % docker run -itd --name py39_test -v ~/docker/work/:/work python:3.9
Unable to find image 'python:3.9' locally
3.9: Pulling from library/python
...
(省略)
...
Digest: sha256:c0dcc146710fed0a6d62cb55b92f00bfbfc3b931fff6218f4958bab58333c37b
Status: Downloaded newer image for python:3.9
c90734d04afaf4567b0529b8e7dc7b9c53084871a98b9119d4d56f7dcc0a4909

以下のdocker psコマンドで表示されれば起動している。

 % docker ps
CONTAINER ID   IMAGE        COMMAND     CREATED          STATUS          PORTS     NAMES
c90734d04afa   python:3.9   "python3"   28 minutes ago   Up 28 minutes             py39_test

2. docker exec でコンテナに入る

あとは起動されたコンテナ内の/bin/bashを実行してコンテナに入れば、pythonを実行できる。

以下のコマンドで/bin/bashを実行する。

docker exec -it py39_test /bin/bash

実際に実行するとコンテナ内に入れていることがわかる。

 % docker exec -it py39_test /bin/bash
root@c90734d04afa:/# 

ここで以下のようにテキトーにpythonを実行して確認してみる。

root@c90734d04afa:/# python --version
Python 3.9.9
root@c90734d04afa:/# python
Python 3.9.9 (main, Dec 21 2021, 06:53:23) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello python!")
hello python!
>>> 

上記のようにpythonが正常に動いていればOK。

Udemy >> 独学で身につけるPython〜基礎編〜【業務効率化・自動化で残業を無くそう!】

とりあえずJupyter notebookを起動する環境

以下の順で準備する。

  1. docker run でjupyter/scipy-notebookイメージをpullしてコンテナを起動
  2. ブラウザで http://127.0.0.1:8888/?token={トークン} にアクセス

1. docker run でjupyter/scipy-notebookイメージをpullしてコンテナを起動

以下のコマンドでイメージをpullして、コンテナを起動する。

docker run -p 8888:8888 --name ipynb_test_1 -v ~/docker/work/:/work jupyter/scipy-notebook

実際に起動すると、コンテナ起動ともにJupyter notebookも起動する。

 % docker run -p 8888:8888 --name ipynb_test_1 -v ~/docker/work/:/work jupyter/scipy-notebook
Unable to find image 'jupyter/scipy-notebook:latest' locally
latest: Pulling from jupyter/scipy-notebook
...
(省略)
...
    To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-9-open.html
    Or copy and paste one of these URLs:
        http://b0760fb007a4:8888/?token=43fa4c705eb00067e615507c687ca1e78ef8d6be8ff51626
     or http://127.0.0.1:8888/?token=43fa4c705eb00067e615507c687ca1e78ef8d6be8ff51626

2. ブラウザで http://127.0.0.1:8888/?token={トークン} にアクセス

ブラウザで、最後に出力されているhttp://127.0.0.1:8888/?token={トークン}にアクセスするとJupyter notebook環境を開くことができる。ここにアクセスできればOK。

pythonコマンド実行もJupyter notebook起動もできる環境

この場合は、1つ目の「とりあえずpythonコマンドを実行できる環境」を実施し、pip installでnotebookライブラリをインストールしても良いが、ここではDockerfileを準備する方法を記載する。

以下の順で準備する。

  1. Dockerfileを作成
  2. docker build でDockerfileからイメージをビルド
  3. docker run でコンテナを起動
  4. docker exec でコンテナに入る
  5. Jupyter notebookを起動し、ブラウザで http://127.0.0.1:8888/?token={トークン} にアクセス(Jupyternotebookを使用する場合)

1. Dockerfileを作成

作業ディレクトリ ~/docker/work にDockerfileという名前のファイルを作成し、以下の内容を保存する。

FROM python:3.9
RUN pip install --upgrade pip
RUN pip install notebook

2. docker build でDockerfileからイメージをビルド

以下のコマンドでイメージをビルドする。

docker build -t py39_ipynb .

実行するとDockerfileを元にイメージがビルドされる。

 % docker build -t py39_ipynb .
[+] Building 2.6s (7/7) FINISHED                                           
 => [internal] load build definition from Dockerfile                  0.0s
 => => transferring dockerfile: 36B                                   0.0s
 => [internal] load .dockerignore                                     0.0s
 => => transferring context: 2B                                       0.0s
 => [internal] load metadata for docker.io/library/python:3.9         2.5s
 => [1/3] FROM docker.io/library/python:3.9@sha256:c0dcc146710fed0a6  0.0s
 => CACHED [2/3] RUN pip install --upgrade pip                        0.0s
 => CACHED [3/3] RUN pip install notebook                             0.0s
 => exporting to image                                                0.0s
 => => exporting layers                                               0.0s
 => => writing image sha256:95f9077bf31dc95f0cc7384064ff6214b93b92d0  0.0s
 => => naming to docker.io/library/py39_ipynb                         0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

Udemy >> 米国データサイエンティストが教える統計学超入門講座【Pythonで実践】

3. docker run でコンテナを起動

以下のコマンドでコンテナを起動する。

docker run -itd --name py39_ipynb_test -v ~/docker/work/:/work -p 8888:8888 py39_ipynb

実行すると、IDが表示される。

 % docker run -itd --name py39_ipynb_test -v ~/docker/work/:/work -p 8888:8888 py39_ipynb
d6300cc7de4cd00a8844effdbbe14ec7f5e56be77d98132a68dbd6982a40696b

以下のdocker psコマンドで表示されれば起動している。

 % docker ps
CONTAINER ID   IMAGE        COMMAND     CREATED          STATUS          PORTS                    NAMES
d6300cc7de4c   py39_ipynb   "python3"   18 minutes ago   Up 18 minutes   0.0.0.0:8888->8888/tcp   py39_ipynb_test

4. docker exec でコンテナに入る

以下のコマンドでコンテナに入る。

docker exec -it py39_ipynb_test /bin/bash

実行すると、コンソールの表示が代わりコンテナに入ったことがわかる。

 % docker exec -it py39_ipynb_test /bin/bash
root@d6300cc7de4c:/# 

以下のようにpythonコマンドを確認する。

root@d6300cc7de4c:/# python --version
Python 3.9.9
root@d6300cc7de4c:/# python
Python 3.9.9 (main, Dec 21 2021, 06:53:23) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello python!")
hello python!
>>> 

5. Jupyter notebookを起動し、ブラウザで http://127.0.0.1:8888/?token={トークン} にアクセス(Jupyternotebookを使用する場合)

次にJupyter notebookを起動し、アクセスできるかを確認する。

以下のコマンドでJupyter notebookを起動する。

jupyter notebook --ip=0.0.0.0 --allow-root

起動すると、アクセスするためのパス・URLが表示される。

root@d6300cc7de4c:/# jupyter notebook --ip=0.0.0.0 --allow-root
[I 11:02:14.882 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 11:02:15.051 NotebookApp] Serving notebooks from local directory: /
[I 11:02:15.051 NotebookApp] Jupyter Notebook 6.4.6 is running at:
...
(省略)
...
    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-28-open.html
    Or copy and paste one of these URLs:
        http://d6300cc7de4c:8888/?token=bee3109c5af6a5fd98eca50b947e67b80e841cba7b8ab404
     or http://127.0.0.1:8888/?token=bee3109c5af6a5fd98eca50b947e67b80e841cba7b8ab404

出力されたhttp://127.0.0.1:8888/?token={トークン}にアクセスしてブラウザにJupyter notebook が表示されればOK。

参考

Docker Hub
Jupyter Docker Stacks — docker-stacks latest documentation
コマンドライン・リファレンス — Docker-docs-ja 19.03 ドキュメント