コンテナはとても便利な技術です。コンテナの運用管理システムであるKubernetesが有名なことから、「運用のツールでしょ?開発エンジニアには関係ないよ」と思っているのであれば、考えを改めるべきでしょう。
Python学習ノートで環境構築を行った際、Visual Studio Code Dev Containersを用いました。これは些細な例ですが、開発やテストを行う時にはとても強力な味方になってくれます。
今回は、Hit and BlowをDockerコンテナで動くようにしていきます。
Dockerfile を用意する
Dockerfile
という名前のファイルが必要です。
非常に乱暴な言い方をすれば、「セットアップスクリプト」といった感じでしょうか。どのOS(Linuxだとディストリビューション)を使って、何をインストールして、どう設定するか、を記述します。
事前にやっておけること、例えばpipでライブラリをインストールするといったことはRUN
に書いておきます。コンテナを起動したときの実行コマンドCMD
に書いてしまうと、コンテナを起動してから実際にHit and Blowのプログラムが動き出すまで、時間がかかってしまいます。「事前にやれることはRUN
で」やるようにすれば、コンテナをbuildするときに実行されます。
コンテナのbuildと実行
コンテナをbuildするには、Dockerfileのあるディレクトリで
docker build -t hit-and-blow_docker .
とします。慣れないうちは最後の”.”を見落としがちです。
-t hit-and-blow_docker は付けなくてもいいですが、生成物に名前(tag)がつかないので、hash値で指定することになります。わかりにくいので、付けた方がいいでしょう。
buildのログはこんな感じです。
[+] Building 11.3s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 224B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.10-slim 0.0s
=> [1/4] FROM docker.io/library/python:3.10-slim 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 171B 0.0s
=> CACHED [2/4] COPY templates/ /app/templates/ 0.0s
=> CACHED [3/4] COPY main.py requirements.txt /app/ 0.0s
=> [4/4] RUN pip install -r /app/requirements.txt 11.0s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:a8413d54c893ba48cf18fa2bc10ecda78fc35e1fb9a8321c52412dcfc6687f98 0.0s
=> => naming to docker.io/library/hit-and-blow_docker 0.0s
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview
最後の方にある”sha256:~”がhash値です。これで生成物(docker image)を識別できますが、見ても何のimageかわかりません。なので、-t で名前(tag)を付けましょう。
imageを起動させましょう。
docker run -p 5000:5000 hit-and-blow_docker
どのimageを起動させるのか、指定する必要があります。hash値でもtagでもいいです。
-p はポートマッピングです。Hit and Blow はFlaskのdefaultポートである5000でリクエストを受け付けるので、そのようにしています。ブラウザから
http://localhost:5000/
とアクセスすると、以前Web化したときと同じように遊べます。いや、遊べるようにmain.pyも少しだけ変更していますけど。
テストを実行するときに有用
これだけだとあまりありがたみを感じないでしょうが、テストプログラムを書いて頻繁にテストするようになると、便利さを痛感します。
小さなプログラムでもテストを書く習慣をつけるといいんですけどね。テストの話はまたいつか。