このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Docker入門】Dockerfileとcompose.yamlの連携①
「Dockerfileとcompose.yamlの連携」では、「Dockerfile」と「compose.yaml」ファイルを連携させて、コンテナを構築します。
「Dockerfileとcompose.yamlの連携」は、次の3部に分けて解説します。
ここでは、Flaskコンテナを例に、Dockerfileとcompose.yamlの連携させてコンテナを作成していきます。
なぜ、「compose.yaml」ファイルだけでなく、「Dockerfile」も使うのでしょうか?
「compose.yaml」ファイルだけでなく、「Dockerfile」も必要なケースが出てきます。
その理由ですが、WordPress、PHPなど、シェアが大きく、利用者が多いサービスは、わざわざ、OSのイメージをカスタマイズをしなくとも、Docker Hub上にそのサービスが含まれる様々なバージョンのイメージが存在ます。それを利用すればよいわけです。
しかし、
Docker Hub上に自分が使用したいイメージが必ず、存在するとは限りません。
仮に、Docker Hub上に利用したいイメージが存在したとしても、そのまま利用できるケースよりも、他のパッケージをインストールしたり、ファイルをコピーしたりして、カスタマイズしたいケースの方が、むしろ多いでしょう。
そのような時に、「Dockerfile」を使用します。
ここでは、Hocker HubのPythonイメージを使用します。しかし、Pythonイメージには、Flaskがインストールされていません。
そこで
Dockerfileを使用して、PythonイメージにFlaskをインストールしてカスタマイズして使用します。
Flaskとは
Flaskは、PythonでWebアプリケーションを開発するための軽量なマイクロフレームワークです。Webアプリケーションフレームワークの1つであり、他の主要なフレームワークとしてはDjangoがありますが、Flaskはより軽量で柔軟性が高いとされています。
リンク:https://flask.palletsprojects.com/en/3.0.x/
Dockerfileとは
Dockerfileは、Dockerコンテナ内で実行されるアプリケーションやサービスを定義するためのテキストファイルです。Dockerfileを使用することで、Dockerイメージを構築するための手順や設定を記述することができます。これにより、開発者やインフラエンジニアは、繰り返し利用可能な環境を素早く構築し、デプロイすることができます。
Dockerfileとは
Docker Hub上にあるイメージをカスタマイズするためのファイルです。
以下に、Dockerfileの構造と使用される主な命令を示します。
1.ベースイメージの指定
Dockerfileの最初の行で、ベースとなるDockerイメージを指定します。例えば、Pythonアプリケーションを構築する場合、python:3.9
といったPythonの公式イメージをベースにすることがあります。
FROM python:3.9
2.必要なパッケージのインストール
アプリケーションが依存するパッケージやライブラリをインストールします。RUN
命令を使用して、シェルコマンドを実行します。
RUN apt-get update && apt-get install -y \
package1 \
package2 \
...
3.アプリケーションのコードの追加
アプリケーションのソースコードやファイルをコンテナ内にコピーします。COPY
命令やADD
命令を使用します。
COPY . /app
4.作業ディレクトリの設定
WORKDIR
命令を使用して、作業ディレクトリを指定します。以降の命令は、このディレクトリを起点として実行されます。
WORKDIR /app
5.ポートの公開
コンテナが公開するポートを指定します。EXPOSE
命令を使用します。
EXPOSE 8080
6.起動コマンドの指定
コンテナが起動した際に実行されるコマンドを指定します。CMD
命令やENTRYPOINT
命令を使用します。
CMD ["python", "app.py"]
「CMD python app.py」のように記述することもできますが、[ ]で囲んで、「 , 」で区切ることが推奨されています。
1~6までの手順のまとめ
1~6までの手順をDockerfileにまとめます。
FROM python:3.9
RUN apt-get update && apt-get install -y \
package1 \
package2 \
...
COPY . /app
WORKDIR /app
EXPOSE 8080
CMD ["python", "app.py"]
Dockerfileはこれらの命令を使用して、Dockerイメージのビルドに必要な手順を定義します。これにより、同じDockerfileを使用して、開発、テスト、本番環境などの異なる環境に対応したDockerイメージを構築することができます。また、Dockerfileのバージョン管理を行うことで、環境の変更やアップデートを追跡し、再現性の高い開発プロセスを実現することができます。
不要なDockerオブジェクトの削除
まず、不要なDockerオブジェクトをすべて削除しておきます。
以下のコマンドを実行します。
・「docker system prune -a」コマンドを実行します。
Are you sure you want to continue? [y/N] の質問には「y」と入力します。
PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
13c955e61eb6cd2967570824145c69fa6f2fc60f4e61bb9e772d45da9f0a80c2
84eb899b5d3af3a7a4c083b50bfd945e3d3f54b821f733d6365270761e39bd5d
Deleted Networks:
wordpress2_default
Deleted Images:
untagged: mariadb:10.8
untagged: mariadb@sha256:456709ab146585d6189da05669b84384518baecd83670c9e5221f8c20a47cf1e
deleted: sha256:d198cd11e8fce9d331f9f90c93406eb8533399812b7946cbabf6242325e534e8
...(省略)...
deleted: sha256:cf4669588596dad2da86c26bea5360c3b11340dd2f03faea1812417915eb4d28
deleted: sha256:966e94ab6e166fb358a208cfd8169d22dea352501c96700eb7f45092a2962ee6
untagged: wordpress:6.5
untagged: wordpress@sha256:e61ec4b26e768f5068fbf118e3701529fe6399d1910a66cafb4a01983e52863d
deleted: sha256:bd7cf29c56a85d78b276968fc568df755e1d53ccb4fa61f8a8537725e58326dd
...(省略)...
deleted: sha256:e4df10d7e92fa157bcd347568ff345f6ffab9caa434257d937ecce2fac91cad8
deleted: sha256:a483da8ab3e941547542718cacd3258c6c705a63e94183c837c9bc44eb608999
Total reclaimed space: 1.114GB
・「docker system prune -a」コマンドで削除されなかったDockerオブジェクトは、個別に削除しておきます。
環境によって削除されずに残っているDockerオブジェクトは異なります。
Dockerfileの作成
Dockerfileを作成します。
ディレクトリの作成と移動
Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。今回は「Dockerfile」も使用します。
デフォルトでは、カレントディレクトリにある「compose.yaml」が読み込まれるため、作業ディレクトリに移動しておきます。
・「cd desktop/docker」コマンドを実行します。
PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>
「flask1」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。
- 「mkdir flask1」コマンド
- 「cd flask1」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir flask1
Directory: C:\Users\joeac\Desktop\docker
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2024/04/07 23:19 flask1
PS C:\Users\joeac\Desktop\docker> cd flask1
PS C:\Users\joeac\Desktop\docker\flask1>
VSCodeの起動
VSCodeで「Dockerfile」ファイルを作成します。
・「code Dockerfile」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\flask1> code Dockerfile
VSCodeが起動します。
「Dockerfile」ファイルの編集
・「Dockerfile」ファイルを以下のように編集して保存します。
FROM python:3.12
WORKDIR /usr/src/app
RUN pip install flask==3.0.2
CMD ["flask", "run", "--host=0.0.0.0"]
このDockerfileは、Python 3.12イメージをベースにして、Flaskアプリケーションを実行するための設定です。
CMD ["flask", "run", "--host=0.0.0.0"] は、CMD flask run --host=0.0.0.0 と記述することもできますが、[ ] で囲んで「 , 」で区切って記述することが推奨されています。
以下、各行の解説を行います。
命令 | 説明 |
---|---|
FROM | Python 3.12イメージをベースにします。 |
WORKDIR | 作業ディレクトリを「/usr/src/app 」に設定します。 |
RUN | Flaskバージョン3.0.2をインストールします。 |
CMD | コンテナが起動されたときに実行されるデフォルトのコマンドを指定します。Flaskアプリケーションを実行するためのコマンドを指定し、ホスト0.0.0.0(すべてのネットワークインターフェース)でFlaskの組み込みサーバーを実行するようにします。これにより、コンテナ内のFlaskアプリケーションがホストのすべてのIPアドレスからアクセス可能になります。 |
ここまでの操作でDockeイメージをカスタマイズする「Dockerfile」ファイルが出来上がりました。次の「Dockerfileとcompose.yamlの連携②」では、Flaskアプリケーションと「compose.yaml」ファイルを作成していきます。