Docker は、軽量なOSレベルの仮想化でアプリを開発、デプロイ、管理するための、無料かつオープンソースのソリューションです。このガイドでは、Python アプリをDockerコンテナ内に作成する方法を実演します。
前提条件
このガイドで説明する手順を実行するには、以下のコンポーネントが必要です。
-
Linuxシステム。以下を参照してください:configuring your own Ubuntu VPS on CloudSigma.
-
最新バージョンのDockerがインストールおよび設定されていること。詳細については、以下を参照してください:installing Docker on Ubuntu.
Dockerコンテナ
同じ環境内でさまざまなプログラムを実行すると、問題が発生する可能性があり、実際に発生します。プログラムを追加すればするほど、環境は不安定になります。一般のユーザーにとっては大した問題ではないかもしれませんが、ミッションクリティカルなアプリケーションにおいては、深刻な結果を招く可能性があります。
システムに導入されるアプリが増えるほど、攻撃対象領域(アタックサーフェス)が広がります。たった1つのアプリが侵害されるだけで、システム全体が崩壊するおそれがあります。
これらの問題を解決するために、ソフトウェアレベルのサンドボックス化としてDockerコンテナを使用できます。
-
コンテナ内のアプリは、ファイルへのアクセスが制限されます。
-
コンテナ化されたアプリは、システムで実行されている他のプロセスを認識できません。
-
コンテナには、特定の量のハードウェアリソースを割り当てることができます。
-
コンテナのネットワークポートは外部に公開されません。
-
ローカル環境と本番環境の間で、ほぼすべてのものを一貫してパッケージ化できます。
実演として、Dockerコンテナ内にシンプルなPythonサーバーを構築し、そのコンテナをイメージに変換して、ダミーの本番環境にデプロイします。
ステップ 1 – ファイルシステムの構成
プロジェクトをホストするために、まず専用のディレクトリを作成します。
|
1 |
mkdir -pv python-server-container/ |
|
1 |
cd !$ |
ディレクトリ内に、サブディレクトリを作成します。 src (コードを保存するため):
|
1 |
mkdir -pv src/ |
ステップ 2 – Pythonサーバーの構築
このステップでは、PythonでシンプルなHTTPサーバーを作成します。ファイルを作成します: server.py:
|
1 |
touch server.py |
テキストエディタで開きます:
|
1 |
nano server.py |

以下のPythonコードを入力します:
|
1 2 3 4 5 6 7 8 9 10 11 |
from http.server import HTTPServer, SimpleHTTPRequestHandler def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler): """server entrypoint""" server_address = ("0.0.0.0", 8080) httpd = server_class(server_address, handler_class) print("starting server...") httpd.serve_forever() if __name__ == "__main__": run() |

ここでは、
-
プログラムをシンプルに保つために、 HTTPServerクラスを使用し、標準 of Pythonライブラリからハンドラーを要求しています。
-
関数runは、 HTTPserver.
-
のインスタンスを初期化します。 server_addressの引数が示すように、サーバーはポート8080で任意の着信接続をリッスンします。
次に、サーバーが期待通りに動作しているか確認します。サーバーを起動します:
|
1 |
python3 server.py |
![]()
新しいターミナルから、 curlを使用してサーバーにリクエストを送信できます:
|
1 |
curl -iv localhost:8080 |

または、ウェブブラウザで次のリンクにアクセスすることもできます:
|
1 |
http://localhost:8080 |
ステップ 3 – Dockerfileの作成
A Dockerfile には、Dockerイメージを生成するために必要な指示が含まれています。ファイル内の指示は順次実行されます。詳細については、以下を参照してください:Dockerfile.
プロジェクト用に新しい Dockerfile を作成します:
|
1 |
touch Dockerfile |
次に、必要なコードを記述します。テキストエディタで開きます:
|
1 |
nano Dockerfile |
以下のコードを入力します:
|
1 2 3 4 5 6 7 8 9 |
FROM python:latest ENV SRC_DIR /usr/bin/src/test_server/src COPY src/* ${SRC_DIR}/ WORKDIR ${SRC_DIR} ENV PYTHONUNBUFFERED=1 CMD ["python", "server.py"] |
ここで、
-
すべての Dockerfile は、 FROM ディレクティブで始まる必要があります。今回のケースでは、DockerイメージのベースとしてPythonを宣言しています。
-
この ENV SRC_DIR ディレクティブは、コンテナディレクトリの場所を指定します。
-
The COPY ディレクティブは、現在Pythonサーバーをホストしている src ディレクトリからファイルをコピーします。
-
変数 PYTHONBUFFERED=1 は、Pythonが出力を直接 STDOUT に出力およびログ記録することを指定します。そうしないと、ログはどのバッファにも送信されません。
-
The CMD ディレクティブは、コンテナを実行するときに実行するデフォルトのコマンドを指定します。この例では、このディレクティブを使用してPythonサーバーを起動しています。
ステップ 4 – Dockerイメージの生成
With the Dockerfile の準備ができたら、イメージを作成(ビルド)できます。次のDockerコマンドを実行してプロセスを開始します。
|
1 |
docker build . -t python_server |

ここで、
-
The -t フラグは、Dockerイメージを python_server.
-
としてタグ付けするために使用されます。Dockerは必要なすべてのコンポーネントをダウンロードし、それらを1つのイメージに結合します。
ステップ 5 – イメージの実行
イメージのデプロイ準備が整いました。次のコマンドを使用して実行できます。
|
1 |
docker run -p 8080:8080 python_server |

ここでは、 -p フラグを使用して、ローカルマシンからDockerイメージにポート8080を転送しています。
サーバーが起動して実行されているかどうかは、 curl を使用して簡単に確認できます。:
|
1 |
curl -iv localhost:8080 |
ステップ 6 – サーバーの停止
ターミナルから “Ctrl + C” を押して、Dockerプロセスを終了します。

ステップ 7 – Dockerイメージのエクスポートとインポート
これで、Pythonサーバーをホストする機能的なDockerイメージが作成されました。Dockerのエクスポートおよびインポート機能を使用すると、他の任意のシステムに移行できます。
まず、現在のシステムにあるDockerイメージの一覧を確認します。
|
1 |
docker images |

対象は、先ほど作成した python_server Dockerイメージです。次のコマンドを実行すると、TARアーカイブとしてエクスポートされます。
|
1 |
docker save python_server:latest > python_server.tar |

対象のマシンに python_server.tar ファイルを転送した後、次のコマンドを使用してDockerイメージをインポートします。
|
1 |
docker load < python_server.tar |
最後に
このガイドでは、PythonアプリケーションからDockerイメージをビルドする方法を説明しました。シンプルなPython Webサーバーを作成し、そこからDockerイメージをビルドしました。このDockerイメージは、任意の環境にデプロイでき、一貫した動作が期待できます。
Dockerについてさらに詳しく知りたいですか? 以下のガイドをご覧ください。
ハッピーコンピューティング!




コメント
コメントはまだありません。最初のコメントを投稿しましょう。