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


とりあえずpythonコマンドを実行できる環境
以下の順で準備する。
- docker run でpythonイメージをpullしてコンテナを起動
- 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。


とりあえずJupyter notebookを起動する環境
以下の順で準備する。
- docker run でjupyter/scipy-notebookイメージをpullしてコンテナを起動
- ブラウザで 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を準備する方法を記載する。
以下の順で準備する。
- Dockerfileを作成
- docker build でDockerfileからイメージをビルド
- docker run でコンテナを起動
- docker exec でコンテナに入る
- 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


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。


参考
