← Back to blog

Dockerを使用してPythonアプリをコンテナ化する

Category
Dockerを使用してPythonアプリをコンテナ化する

Dockerは、軽量なOSレベルの仮想化でアプリを開発、デプロイ、管理するための無料のオープンソースソリューションです。このガイドでは、Dockerコンテナ内にPythonアプリを作成する方法を実演します。

前提条件

このガイドで示す手順を実行するには、次のコンポーネントが必要です。

Dockerコンテナ

同じ環境内でさまざまなプログラムを実行していると、問題が発生する可能性があります(そして実際に発生します)。追加するプログラムが増えるほど、環境は不安定になります。一般的な用途では大きな問題ではないかもしれません。しかし、ミッションクリティカルなアプリケーションでは、深刻な結果を招く可能性があります。

システムに導入されるアプリが増えるほど、攻撃対象領域も大きくなります。侵害された単一のアプリが、システム全体の崩壊につながることも容易に起こり得ます。

これらの問題を解決するために、ソフトウェアレベルのサンドボックス化としてDockerコンテナを使用できます。

  • コンテナ内のアプリは、ファイルへのアクセスが制限されます。

  • コンテナ化されたアプリは、システムで実行中の他のプロセスを参照できません。

  • コンテナには、特定量のハードウェアリソースを割り当てることができます。

  • コンテナのネットワークポートは外部に公開されません。

  • ローカル環境と本番環境の間で、ほぼあらゆるものを一貫してパッケージ化できます。

実演として、Dockerコンテナ内にシンプルなPythonサーバーを構築し、そのコンテナをイメージに変換して、ダミーの本番環境にそのイメージをデプロイします。

ステップ1 – ファイルシステムの設定

プロジェクトをホストするために、まず専用ディレクトリを作成します。

mkdir -pv python-server-container/
cd python-server-container/
mkdir -pv src/

ディレクトリ内に、コードを保存するためのサブディレクトリ src を作成します。

ステップ2 – Pythonサーバーの構築

このステップでは、PythonでシンプルなHTTPサーバーを作成します。ファイル server.py を作成します。

touch server.py
nano server.py

次のPythonコードを入力します。

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クラスを使用し、標準のPythonライブラリからハンドラーを要求することで、プログラムをシンプルに保っています。

  • 関数runは、HTTPserverのインスタンスを開始します。

  • server_addressの引数が示すように、サーバーはポート8080で受信接続を待ち受けます。

次に、サーバーが期待どおりに動作するか確認します。サーバーを起動します。

python3 server.py

新しいターミナルから、curlを使用してサーバーにリクエストを送信できます。

curl -iv localhost:8080

または、Webブラウザーでリンクにアクセスできます。

http://localhost:8080

ステップ3 – Dockerfileの作成

Dockerfileには、Dockerイメージを生成するために必要な命令が含まれています。ファイル内の命令は順番に実行されます。Dockerfileについて詳しく学ぶことができます。

プロジェクト用に新しいDockerfileを作成します。

touch Dockerfile
nano Dockerfile

次のコードを入力します。

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"]

ここでは、次のことを行っています。

  • すべてのDockerfileFROMディレクティブから開始する必要があります。今回の場合、DockerイメージのベースとしてPythonを宣言しています。

  • ENV SRC_DIRディレクティブは、コンテナ内ディレクトリの場所を指定します。

  • COPYディレクティブは、現在Pythonサーバーをホストしているsrcディレクトリからファイルをコピーします。

  • 変数PYTHONBUFFERED=1は、Pythonが出力とログを直接STDOUTに出力することを指定します。そうしない場合、ログはバッファに送られません。

  • CMDディレクティブは、コンテナを実行するときに実行するデフォルトコマンドを指定します。この場合、このディレクティブを使用してPythonサーバーを起動します。

ステップ4 – Dockerイメージの生成

Dockerfileの準備ができたので、イメージを作成できます。次のDockerコマンドを実行して処理を開始します。

docker build . -t python_server

ここでは、次のことを行っています。

  • -tフラグを使用して、Dockerイメージにpython_serverというタグを付けています。

  • Dockerは必要なコンポーネントをすべてダウンロードし、それらを結合してイメージを作成します。

ステップ5 – イメージの実行

イメージはデプロイ可能な状態になりました。次のコマンドで実行できます。

docker run -p 8080:8080 python_server

ここでは、-pフラグを使用して、ローカルマシンのポート8080をDockerイメージに転送しています。

curlを使用して、サーバーが起動して実行中であるかを簡単に検証できます。

curl -iv localhost:8080

ステップ6 – サーバーの終了

ターミナルから「Ctrl + C」を押してDockerプロセスを終了します。

ステップ7 – Dockerイメージのエクスポートとインポート

これで、Pythonサーバーをホストする機能的なDockerイメージができました。Dockerのエクスポートおよびインポート機能を使えば、これを他の任意のシステムへ移行できます。

まず、現在のシステムにあるDockerイメージの一覧を確認します。

docker images

対象は、先ほど作成したpython_server Dockerイメージです。次のコマンドでTARアーカイブとしてエクスポートします。

docker save python_server:latest > python_server.tar

python_server.tarファイルを対象マシンに転送した後、次のコマンドを使用してDockerイメージをインポートします。

docker load < python_server.tar

まとめ

このガイドでは、PythonアプリケーションからDockerイメージを構築する方法を実演しました。シンプルなPython Webサーバーを作成し、それを基にDockerイメージを構築しました。このDockerイメージは任意の環境にデプロイでき、一貫した動作が期待できます。

Dockerについてさらに学びたい場合は、次のガイドをご覧ください。

Happy Computing!

Preslav Dobrev

著者 · CloudSigma

コメント

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