このページで解説している内容は、以下の 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アプリケーションがうまく教示されない場合は、以下の問題が生じている可能性があります。
- 指定したPythonイメージとFlaskのバージョンの組み合わせの問題
- プログラムにエラーがある。
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が必要
ということを理解しておきましょう。