DockerコンテナでPythonアプリケーションを動かす方法を解説する

スポンサーリンク

こんにちは!Docker上でPythonをホストする方法について説明します。

このチュートリアルの終わりまでに、あなたはDockerコンテナを作成し、コンテナにアプリを追加し、システムプロセスに干渉することなくそれを実行し続ける方法を知っているはずです。

Pythonの初心者の方は、このPythonビデオコースでコースマップ全体を見ながら進めてください。

準備が整えば、すぐにでも始められます!

スポンサーリンク

Dockerコンテナとは?

コンテナの概念を理解する前に、コンテナの出現について説明し理解しましょう。

かつてVMが主流だった時代、すべてのアプリケーションはVM上でホストされていました。

アプリケーションの所有者は、十分に活用されていないリソースに莫大なコストを支払わなければなりませんでしたが、アプリケーションへの経路を持つトラフィックのためにブロックされていました。

これは、懐に優しくないため、長くは続かないでしょう。

さらに、アプリケーションに関連するすべての設定ファイルは、その単一のVMに保存する必要がありました。

そこで登場したのが、コンテナです。

コンテナでは、使用した分だけ支払うというコンセプトが生まれました。

基本的に、Dockerは私たちにコンテナという概念を教えてくれました。

コンテナは、アプリケーションとそれに関連するすべての設定ファイルを、単一の分離された環境にパックアップします。

システム関連のソフトウェア要件、コード、ライブラリのすべてを、完全に別のスペースに折り畳むのです。

コンテナでは、アプリケーションのランタイムに利用するリソースに対してのみ料金を支払います。

つまり、コンテナがアプリケーションのリソース使用量を調整するため、リソースをブロックする必要がないのです。

コンテナについて理解したところで、Dockerコンテナ上で簡単なPythonアプリケーションをホストしてみましょう。

Docker上でPythonを実行するためのステップ

アプリケーションをコンテナにホストするこのプロセス全体は、以下のシナリオで実行されます。

  1. Dockerfileの作成
  2. イメージの構築
  3. コンテナとしてアプリケーションを実行する

ステップ1 – Dockerfileの作成

Dockerfileは、ホストされる予定のアプリケーションに関して必要な設定の実際のブループリントです。

最終的なアプリケーションのブループリントを処理できるようにするために実行する必要がある、すべてのシステムレベルのコマンドを含めることができます。

アプリケーションに必要なアドオンやライブラリが含まれている場合もあります。

また、以下の単純な Python アプリケーションをコンテナとして実行することにします。

demo.py

data = list()
data = ['JournalDev','Python']
for x in lst:
print(x)

Dockerfile-

FROM python:3
ADD demo.py /
CMD [ "python", "./demo.py" ]

Dockerfileには、以下のようないくつかのディレクティブがあります。

  • FROM – これから行う命令のベースとなるイメージを設定します。この例では、Pythonのバージョンを3として、ベースイメージレイヤーを設定しています。Dockerfileはこの命令を実行する際に、オープンソースのイメージのリポジトリであるDocker Hubからベースイメージを取得します。
  • ADD – ADDディレクティブにより、ファイル、ディレクトリ、あるいはURLの形式で、ベースとなるDockerfileに命令を組み込むことができます。
  • CMD – このディレクティブは、特定のpythonやbash/shスクリプトを実行するためのコマンドの位置を宣言することが可能です。

ステップ2 – Dockerイメージの構築

Dockerfileをビルドした後は、本番用のベースを用意することが重要です。

つまり、Dockerfileで定義された全てのコマンドから、コンテナを動作させ、パフォーマンスを向上させるためのベースレイヤーを作成する必要があります。

そのために、以下のようなコマンドを使用してDocker Imageを作成します。

構文は以下の様な感じです。

docker build -t image-name:tag .

例えば、以下の様になります。

docker build -t python-image:1.0 .

結果は以下の通りです。

[+] Building 5.4s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                             0.1s
 => => transferring dockerfile: 31B                                                                              0.0s
 => [internal] load .dockerignore                                                                                0.1s
 => => transferring context: 2B                                                                                  0.0s
 => [internal] load metadata for docker.io/library/python:3                                                      5.0s
 => [internal] load build context                                                                                0.1s
 => => transferring context: 31B                                                                                 0.0s
 => [1/2] FROM docker.io/library/python:3@sha256:b6a9702c4b2f9ceeff807557a63a710ad49ce737ed85c46174a059a299b580  0.0s
 => CACHED [2/2] ADD demo.py /                                                                                 0.0s
 => exporting to image                                                                                           0.1s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:8b2da808b361bc5112e2afa087b9eb4e305304bcc53c18925d04fe8003f92975                     0.0s
 => => naming to docker.io/library/python-image:1.0 

ステップ3 – イメージの実行 (アプリケーションをコンテナでホストさせる)

これらのイメージ(上記で作成)は、実際にはどのような基本構成からも独立しています。

一方、コンテナは、アプリケーションのインスタンスを実行するための基本構成としてイメージを必要とします。

そのために、アプリケーションのインスタンスを実行するコンテナの実行プロセスを起動する必要があります。

Docker runコマンドを利用して、Dockerfileに記述された構成で実際にコンテナを起動させます。

例えば、以下の様になります。

docker run python-image:1.0

結果は以下の通りです。

JournalDev
Python

また、以下のようにDocker Community Editionというアプリケーションをインストールすることで、デスクトップ上でこの実行中のコンテナの存在を確認することができます(サンプルです)。

Docker Community Edition
Docker Community Edition

まとめ

ここまでで、このトピックは終了です。

もし何か疑問があれば、お気軽にコメントください。

Pythonプログラミングに関連するこのような記事のために、私たちと一緒にご期待ください。

タイトルとURLをコピーしました