このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Docker入門】Dockerfileとcompose.yamlの連携③


Dockerfileとcompose.yamlの連携②」の続きです。

 ここまでの操作でFlaskコンテナを実行させる準備が整いました。ここでは、Flaskコンテナの作成から実行、そして、Flaskアプリケーションに接続していきます。

「Dockerfileとcompose.yamlの連携」は、次の3部に分けて解説します。

Flaskコンテナの作成と実行

Flaskコンテナの作成して、実行します。

・「docker compose up -d」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\flask1> docker compose up -d
2024/04/09 01:28:55 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 17.1s (8/8) FINISHED                                                                        docker:default
 => [flaskweb1 internal] load build definition from Dockerfile                                                     0.0s
 => => transferring dockerfile: 145B                                                                               0.0s
 => [flaskweb1 internal] load metadata for docker.io/library/python:3.12                                           2.4s
 => [flaskweb1 auth] library/python:pull token for registry-1.docker.io                                            0.0s
 => [flaskweb1 internal] load .dockerignore                                                                        0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [flaskweb1 1/3] FROM docker.io/library/python:3.12@sha256:19973e1796237522ed1fcc1357c766770b47dc15854eafdda0  11.3s
 => => resolve docker.io/library/python:3.12@sha256:19973e1796237522ed1fcc1357c766770b47dc15854eafdda055b65953fe5  0.0s
 => => sha256:3e7c0f87d7c085a6ec7511b2fa69194b21ea54bc3a110c35e37ba20cbd0aef7e 2.01kB / 2.01kB                     0.0s
 => => sha256:6cbe1053f2449eef94cfc6a650345a7c33ec33e96cc8c83ef2b69066d8db368d 7.11kB / 7.11kB                     0.0s
 => => sha256:3cb8f9c23302e175d87a827f0a1c376bd59b1f6949bd3bc24ab8da0d669cdfa0 24.05MB / 24.05MB                   1.8s
 => => sha256:19973e1796237522ed1fcc1357c766770b47dc15854eafdda055b65953fe5ec1 2.14kB / 2.14kB                     0.0s
 => => sha256:71215d55680cf0ab2dcc0e1dd65ed76414e3fb0c294249b5b9319a8fa7c398e4 49.55MB / 49.55MB                   1.8s
 => => sha256:5f899db30843f8330d5a40d1acb26bb00e93a9f21bff253f31c20562fa264767 64.14MB / 64.14MB                   3.0s
 => => sha256:567db630df8d441ffe43e050ede26996c87e3b33c99f79d4fba0bf6b7ffa0213 211.14MB / 211.14MB                 6.4s
 => => extracting sha256:71215d55680cf0ab2dcc0e1dd65ed76414e3fb0c294249b5b9319a8fa7c398e4                          1.5s
 => => sha256:d68cd2123173935e339e3feb56980a0aefd7364ad43ca2b9750699e60fbf74c6 6.39MB / 6.39MB                     2.4s
 => => sha256:63941d09e5322b88281f3a325eff9ced5bf2ee45b691aaf8ec2f829bafbd8021 22.71MB / 22.71MB                   3.5s
 => => sha256:097431623722383300c03bb41fd162d32346bf6a02a053263f51969eb9746e3d 244B / 244B                         3.3s
 => => sha256:09527fa4de8dd73399164c307942cc43652a01fc2bb370e38ae0f806b42b4b18 2.70MB / 2.70MB                     3.6s
 => => extracting sha256:3cb8f9c23302e175d87a827f0a1c376bd59b1f6949bd3bc24ab8da0d669cdfa0                          0.4s
 => => extracting sha256:5f899db30843f8330d5a40d1acb26bb00e93a9f21bff253f31c20562fa264767                          1.8s
 => => extracting sha256:567db630df8d441ffe43e050ede26996c87e3b33c99f79d4fba0bf6b7ffa0213                          3.9s
 => => extracting sha256:d68cd2123173935e339e3feb56980a0aefd7364ad43ca2b9750699e60fbf74c6                          0.2s
 => => extracting sha256:63941d09e5322b88281f3a325eff9ced5bf2ee45b691aaf8ec2f829bafbd8021                          0.4s
 => => extracting sha256:097431623722383300c03bb41fd162d32346bf6a02a053263f51969eb9746e3d                          0.0s
 => => extracting sha256:09527fa4de8dd73399164c307942cc43652a01fc2bb370e38ae0f806b42b4b18                          0.2s
 => [flaskweb1 2/3] WORKDIR /usr/src/app                                                                           0.5s
 => [flaskweb1 3/3] RUN pip install flask==3.0.2                                                                   2.7s
 => [flaskweb1] exporting to image                                                                                 0.1s
 => => exporting layers                                                                                            0.1s
 => => writing image sha256:28fde978303ca076b201cef63618bbe0ed2ad15dee0d1ed3b3e8d250704d8e7d                       0.0s
 => => naming to docker.io/library/flask1-flaskweb1                                                                0.0s
[+] Running 1/2
 - Network flask1_default        Created                                                                           0.6s
 ✔ Container flask1-flaskweb1-1  Started                                                                           0.3s

「Container flask1-flaskweb1-1 Started」と表示されていれば、コンテナが実行され起動しています。

Webブラウザで接続

WebブラウザでFlaskコンテナのFlaskアプリケーションに接続します。

・URLに「http://localhost:5000」と入力します。

「Hello World!」と表示されます。

「app.py」の編集

「app.py」を編集します。

・以下のように「app.py」の内容を変更して保存します。

「return "Hello World!"」のところを「return "Hello Flask!"」にします。

from flask import Flask

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# ルートURLに対する処理を定義
@app.route("/")
def hello():
    return "Hello Flask!" # ←ここを変更します。

# アプリケーションを実行
if __name__ == "__main__":
    app.run(debug=True)

・「code ./src/app.py」コマンドを実行し、プログラムを上のように変更して保存します。

コンテナとホストはバインドマウントしています。

つまり、ホスト側で変更した内容が、コンテナ側に反映されます。

Webブラウザでリロード

Flaskコンテナの再起動

 ここで、Webブラウザをリロードすれば、バインドマウントしていますので、変更がコンテナ側に反映されて、「Hello Flask!」と表示されるはずですが、指定したPythonイメージとFlaskのバージョンでは、すぐに反映されません。

バージョンの組み合わせによっては、このようなことも発生します。

以下のコマンドを実行して、Flaskコンテナを停止して、再実行します

・「docker compose restart」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\flask1> docker compose restart
[+] Restarting 1/1
 ✔ Container flask1-flaskweb1-1  Started                                                                          10.6s

・Webブラウザでリロードします。

「Hello Flask!」と表示されます。

Flaskアプリケーションが表示されない場合

Flaskアプリケーションがうまく教示されない場合は、以下の問題が生じている可能性があります。

  1. 指定したPythonイメージとFlaskのバージョンの組み合わせの問題
  2. プログラムにエラーがある。

 1の「指定したPythonイメージとFlaskのバージョンの組み合わせの問題」は、現時点では、動作していますが、実行する時期によっては動作しない可能性があります。2の「プログラムにエラーがある」場合は、デバックする必要があります。

コンテナのログを確認する

うまくFlaskアプリケーションが動作しない場合はFlaskコンテナのログを確認します。

コマンドで確認する方法

・「docker compose logs」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\flask1> docker compose logs
flaskweb1-1  |  * Debug mode: off
flaskweb1-1  | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
flaskweb1-1  |  * Running on all addresses (0.0.0.0)
flaskweb1-1  |  * Running on http://127.0.0.1:5000
flaskweb1-1  |  * Running on http://172.22.0.2:5000
flaskweb1-1  | Press CTRL+C to quit
flaskweb1-1  | 172.22.0.1 - - [08/Apr/2024 16:33:40] "GET / HTTP/1.1" 200 -
flaskweb1-1  | 172.22.0.1 - - [08/Apr/2024 16:39:51] "GET / HTTP/1.1" 200 -
(省略)
 ・
 ・

Docker Desktopで確認する方法

・「Conteiners」のFlaskコンテナをクリックします。

・赤枠内のコンテナが出力するログを確認します。


 3部に渡って、Dockerfileとcompose.yamlの連携について解説してきました。compose.yamlでコンテナの作成から実行までの作業を行うことができますが、オリジナルイメージを使いたい場合は、Dockerfileが必要になります。

つまり、

オリジナルイメージを使いたい場合は、Dockerfileが必要

ということを理解しておきましょう。

関連コンテンツ