WEB制作
DockerでPythonを実行するコンテナを作る
コンテナイメージをビルドしてコンテナを起動するまでの流れを通して、DockerでPythonの実行環境を構築する方法について解説します。
この記事のポイント
- コンテナの設計図となるDockerfileを作成する
- コンテナイメージをビルド
- コンテナを起動して、ブラウザで出力を確認する
目次
Pythonを実行するコンテナを作る
今回はPythonで書かれたアプリケーションを実行することができるコンテナを作っていきます。
次の2つのファイルが必要になります。
- Dockerfile
- cgi-bin/index.py
コンテナイメージの設計図となる「Dockerfile」とPythonのプログラムファイル「index.py」を用意します。
今回はPythonの標準ライブラリでWebサーバーを動かしてPythonの実行環境を構築するため、Pythonのファイルは「cgi-bin」というディレクトリに配置します。
なお、Dockerはすでにインストールされていることを前提としています。
これからインストールする場合は、「Dockerをインストールする」よりインストールを行なってください。
Dockerfileを作成する
まずはDockerfileから作成していきます。
コンテナに使用できるPythonのコンテナイメージを確認するために、まずはDockerHubを開いてください。
DockerHub
DockerHubのページ上部にある検索スペースに、「python」と入力してみてください。

入力すると、候補一覧が表示されます。
この中から、一番上にある「python」を選択してください。
「python」を選択すると、Pythonのコンテナイメージのページが表示されます。

「python」の下に「Docker Official Images」と書かれていますが、これはDocker公認のコンテナイメージであることを示しています。
公認で提供されるコンテナイメージは基本的に安心して活用できるため、もし使いたいコンテナイメージを検索した時に公認のものがあったら、特別な理由がある場合を除いてそちらを使うことをオススメします。
コンテナイメージのページをスクロールすると、「DESCRIPTION」「REVIEW」「TAGS」の3つのタブがあります。
「DESCRIPTION」には使用できるアプリケーションのイメージタグ(バージョン)、クイックリファレンス、コンテナイメージの概要が書かれています。

使用したいバージョンはここのタグより確認できます。
また、各タグをクリックするとGithubに移動し、コンテナイメージの「Dockerfile」を閲覧することができます。
コンテナイメージが使用しているコマンドやインストールしているソフトウェアを確認したいときは、こちらのGithubより確認してください。
初めてコンテナイメージを使う際は、「How to use this image」を確認しておくと導入がスムーズになります。

コンテナイメージのイメージタグやバージョンは「DESCRIPTION」から確認できますが、一覧の形式で確認したい場合は「TAGS」を参照します。

こちらに記載のある「rc-slim-buster」や「3.7.3」などは「イメージタグ」と呼び、これをDockerfileに記載することで、該当するイメージタグがついたコンテナイメージを引用してコンテナイメージを作ることができます。
今回は安定版の「3.7.3」を使用していきます。
「Dockerfile」というファイルを作成し、次のコードを入力してください。
Dockerfile
FROM python:3.7.3
用意されたコンテナイメージを使う場合はFROMコマンドを記述し、その後に「コンテナイメージ名:イメージタグ」の形式で指定します。
続いて、公開ディレクトリを指定していきます。
Dockerfile
FROM python:3.7.3
WORKDIR /app
COPY ./cgi-bin /app/cgi-bin
WORKDIRコマンドでコンテナ内の公開ディレクトリを指定しています。
今回は「/app」としています。
続いてCOPYコマンドで、Dockerfileと同じ階層にある「cgi-bin」ディレクトリを、コンテナ内の「/app/cgi-bin」に複製します。
これで、Dockerfileと同じ階層に「cgi-bin」というディレクトリが作成され、その中にPythonコード「index.py」が設置されます。
Dockerfile
FROM python:3.7.3
WORKDIR /app
COPY . /app
CMD ["python", "-m", "http.server", "8888", "--cgi"]
最後に、CMDコマンドでPythonのコマンドを実行します。
これは、次のコマンドと同じ内容です。
コマンド例
# python -m http.server 8888 --cgi
通常のpythonコマンドはオプションや引数を半角スペースで区切って指定しますが、これをDockerfileでは「”(ダブルクォーテーション)」と「,(カンマ)」で区切る形に変更します。
コマンドの内容はポート番号「8888」のHTTP(Web)サーバーを「-m http.server」で起動しています。
Pythonコードを実行するために、CGIを実行するオプション「–cgi」も付与します。
以上で、Dockerfileは完成しました。
Pythonのプログラムファイルを作成する
続いて、Pythonコードを入力していきましょう。
先ほど作成したDockerfileと同じ階層に「cgi-bin」というディレクトリを作成し、その中に「index.py」というファイルを作成してください。
そしてファイルを開いて、次のコードを入力していきます。
index.py
#!/usr/bin/python
print "Content-type: text/plain\n"
print "Hello, Python on Docker!"
1行目は先頭に「#」が付いていてコメントに見えますが、Pythonインタプリタの使用を指定するためのshebang(シェバン)です。
この指定は必須になるため、必ず入力してください。
なお、環境によって「#!/usr/bin/env python」のように異なる場合もあるため、もし上記の入力でうまく実行できなかった場合は変更してみてください。
その後に2つのprint関数が続きますが、1つ目は出力形式の指定です。
2つ目のprint関数の文字列「Hello, Python on Docker!」を、通常テキストの「text/plain」で出力する内容になります。
以上でコンテナイメージを作る準備ができました。
現在、Dockerfileがあるディレクトリに「cgi-bin」ディレクトリがあり、その中にindex.pyがある構成になります。

コンテナイメージをビルドする
いよいよコンテナイメージをビルドしていきます。
PowerShellやターミナルを開き、次のコマンドを入力してください。
まずはcdコマンドなどで、上記のDockerfileがあるディレクトリに移動してください。
移動したら、次のビルドコマンドを入力して実行します。
コマンド入力例
# docker build --tag=hellopython .
Dockerのコマンドなので、先頭には「docker」が入ります。
続いて、半角スペースを空けて「build」と入力し、続いてオプション「–tag」でイメージタグを「hellopython」に指定しました。
最後に、Dockerfileの場所を指定します。
今回は先ほどcdコマンドでDockerfileのあるディレクトリに移動しているため、現在のディレクトリである「.(ドット)」を指定します。
ビルドが成功すると、次のような「Successfully …」のメッセージが表示されます。
ディレクトリの一覧表示例
# docker build --tag=hellopython .
Sending build context to Docker daemon 6.656kB
Step 1/4 : FROM python:3.7.3
---> 34a518642c76
Step 2/4 : WORKDIR /app
---> Running in 85798dea3d5f
Removing intermediate container 85798dea3d5f
---> 5b331089bb9f
Step 3/4 : COPY ./cgi-bin /app/cgi-bin
---> 1700fc837714
Step 4/4 : CMD ["python", "-m", "http.server", "8888", "--cgi"]
---> Running in 0da27f778edb
Removing intermediate container 0da27f778edb
---> 76471d889547
Successfully built 76471d889547
Successfully tagged hellopython:latest
コンテナイメージが正常に作成されているか、「docker image ls」コマンドで確認します。
コンテナイメージの一覧表示例
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellopython latest 76471d889547 2 hours ago 929MB
先ほど「–tag」で指定したイメージ名「hellopython」のコンテナイメージが表示されていれば成功です。
コンテナを起動する
作成したコンテナイメージを使って、実際にコンテナを起動してみましょう。
コマンド入力例
# docker container run --rm -p 4000:8888 -v /Users/s/Sites/test/cgi-bin/:/app/cgi-bin/ -d hellopython
コンテナの起動にはdockerコマンドで「container run」、もしくは「run」を使います。(どちらも同じ)
今回のコマンドはオプションの指定が多いため、先頭から解説していきます。
コンテナを停止したら自動的に削除するオプション
まず、1つ目のオプション「–rm」は、コンテナを停止したら自動的に削除します。
もしこのオプションがない場合は、コンテナは停止しても削除されませんので、すぐに再起動ができる状態となります。
常用するコンテナでは不要なオプションですが、今回のように試験的な使用を目的としたコンテナでは指定しておくと、停止した後に余計なコンテナが残らないので便利です。
ポート番号を指定するオプション
2つ目の「-p 4000:8888」はサーバーのポート番号を指定します。
Dockerfileのコマンドでポート番号を「8888」にしていますが、ここで「4000」に変更しています。
すでに他のコンテナが同じ番号のポートを使用している場合はエラーになるため、重複しない番号を割り振る必要があります。
特に標準のポート番号のままで問題がなければ、こちらのオプションは不要です。
ローカル環境とコンテナのボリュームを結びつけるオプション
3つ目の「-v /Users/s/Sites/test/cgi-bin/:/app/cgi-bin/」は、ローカル環境とコンテナ内のボリュームを結びつけるオプションです。
「ローカルボリューム:コンテナボリューム」の形式で指定することで、ローカル環境とコンテナ内のファイルを紐づけることができます。
今回はローカル環境のボリュームを適当な「/Users/s/Sites/test/cgi-bin/」としていますが、お使いの環境にあわせて変更してください。
なお、必ずルートパスで指定する必要があります。
コンテナをデタッチモードで起動するオプション
4つ目の「-d」は、コンテナをデタッチモードで起動して、バックグラウンドで起動したままの状態にするためのオプションです。
全てのオプションを指定した後に、先ほど作成したコンテナイメージ名「hellopython」を末尾に指定します。
コンテナが正常に起動すると、次のようなコンテナIDが表示されます。
コンテナ起動後の表示例
# # docker container run --rm -p 4000:8888 -v /Users/s/Sites/test/cgi-bin/:/app/cgi-bin/ -d hellopython
e8466bbc8f63ed62d6f310257ec1a6f770b9bc83358ab848825f5f939afe1077
それでは、ブラウザを開いて確認してみましょう。
URLに「localhost:4000/cgi-bin/index.py」と入力してページを開いてみてください。

Pythonで出力されたメッセージが表示されたでしょうか。
ローカル環境で作成したindex.pyが、コンテナ内の「cgi-bin」ディレクトリに設置されて実行されていることが確認できます。
このファイルはオプション「-v」でローカル環境とリンクしているため、ローカル側で編集するとすぐに内容が反映されます。
試しに、メッセージを「Hello」から「Hi」に変更してみます。
index.py
#!/usr/bin/python
print "Content-type: text/plain\n"
print "Hi, Python on Docker!"
変更を保存し、ブラウザを再読み込みしてみましょう。

変更が反映されたでしょうか。
続いて、もう少し変更を加えてみましょう。
1〜6の数値をランダムに出力する処理を記述してみます。
index.py
#!/usr/bin/python
import random
print "Content-type: text/plain\n"
print "Random number : ", random.randrange(1,7,1)
「Random number : 」の後に、random.randrangeによって1から7未満の数値がランダムに出力されます。
何度か再読み込みを行うと、毎回異なる数値が出力されるので試してみてください。
ブラウザの出力例
Random number : 1
今回はPythonを実行するコンテナを作成して、ブラウザで出力を確認してきました。
ローカル環境とコンテナ内のファイルの結び付け、ポート番号の指定なども行い、コンテナの大枠の使用感を掴むことができたでしょうか。
次回は、コンテナイメージをDockerHubで共有して別環境で同じコンテナを実行する方法を解説します。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。