はじめに
ITスクールで学習中のnaruです。
アプリ開発を進める中で、Dockerfileについて調べていた際に、「docker-compose.ymlって何だっけ?Dockerfileとどう違うの?」と疑問に思いました。そこで、学んだことをアウトプットするために、初めて記事を書いてみました。
1. Dockerfileとは?
Dockerfileとは、Dockerイメージを作成するために必要な設定ファイルのことです。
この設定ファイルをビルドすることによって、Dockerイメージが作成されます。
ただしdocker hubにあるイメージをそのまま使う場合はdocker-compose.ymlに直接imageを指定すれば良いため、Dockerfileはなくても問題ありません。
(Dockerファイルを書けるようになると、自分で好きなようにカスタマイズしたDockerイメージを作成できる)
Dockerイメージ?ビルド?となった方は、Dockerの各要素とコンテナ起動までの仕組みが初心者にわかりやすく図解付きで解説しているので、載せておきます。
2. docker-compose.ymlとは?
YAML形式を用いて書いた、Docker Composeの設定ファイルのことです。
Docker Composeとは、複数のDockerコンテナを1度にまとめて操作出来るツールです。(Dockerが標準で搭載しているDocker Engineでは、1度に1つずつしかDockerコンテナを操作できない。)
docker-compose.ymlはDocker Composeコマンドを使用することによって、複数のコンテナを一括して操作でき、イメージのビルドやコンテナの作成が簡単に行えます。これにより、複雑なマルチコンテナ環境を簡単に構築および管理できます。
3. Dockerfileの書き方
Flaskアプリケーションをコンテナ化する場合のディレクトリ構造の例を使って説明していきます。
ディレクトリ構成例
/my_flask_project
├── app/
│ ├── app.py # Flask アプリのメインファイル
│ ├── __init__.py # Flask パッケージの初期化ファイル
│ └── templates/ # HTML テンプレートを格納するディレクトリ
│ └── index.html # サンプル HTML ファイル
├── requirements.txt # Python の依存関係をリスト化したファイル
├── Dockerfile # Docker イメージをビルドするための設定ファイル
└── docker-compose.yml # サービス全体を定義する Compose ファイル
Dockerfileの例
#(1)
FROM python:3.11-slim
#(2)
WORKDIR /app
#(3)
COPY requirements.txt requirements.txt
#(4)
RUN pip install --no-cache-dir -r requirements.txt
#(3)
COPY app/ /app/
#(5)
CMD ["python", "app.py"]
(1)FROM
FROM python:3.11-slim
ベースイメージを指定します。
ここでは、軽量な Python 3.11 の公式イメージ python:3.11-slim を使用しています。
(2)WORKDIR
WORKDIR /app
コンテナ内の作業ディレクトリを指定します。
これ以降のすべてのコマンドはこのディレクトリ内で実行されます。
(3)COPY
COPY requirements.txt requirements.txt
COPY <ホストのパス> <コンテナ内のパス>
ホストマシンのファイルをコンテナ内にコピーします。
requirements.txt をコンテナにコピーして依存関係をインストールします。
COPY app/ /app/
アプリケーションコード(app/ ディレクトリ全体)を /app にコピーします。
(4)RUN
RUN pip install --no-cache-dir -r requirements.txt
コンテナのビルド時に実行されるコマンドを指定します。
pip install コマンドで requirements.txt に記載された依存関係(Flask)をインストールします。
--no-cache-dir オプションでキャッシュを無効化し、イメージサイズを小さくします。
(5)CMD
CMD ["python", "app.py"]
コンテナ実行時に実行されるデフォルトコマンドを指定します。
ここでは python app.py を実行して Flask アプリケーションを起動します。
4. docker-compose.ymlの書き方
version: '3.9' #(1)
services: #(2)
web:
build: #(3)
context: .
dockerfile: Dockerfile
ports: #(4)
- "5000:5000"
volumes: #(5)
- ./app:/app
environment: #(6)
- FLASK_ENV=development
(1)version
version: '3.9'
Docker Compose ファイルのバージョンを指定します。
(2)services
services:
web:
コンテナ化されたサービスを定義します。
web はサービスの名前(Flask アプリを動かすコンテナ)。
(3)build
build:
context: .
dockerfile: Dockerfile
イメージをビルドする設定。
context: 現在のディレクトリ(.)をビルドコンテキストとして指定。
Docker はこのディレクトリ内のすべてのファイルとサブディレクトリにアクセスします。
dockerfile:ビルドに使用する Dockerfile を指定。
(4)ports
ports:
- "5000:5000"
ホストマシンとコンテナ間のポートをマッピングします。
ホストマシンのポート番号:コンテナのポート番号
5000:5000 は、ホストの 5000 番ポートをコンテナの 5000 番ポートに接続。
(5)volumes
volumes:
- ./app:/app
ホストマシンの app/ ディレクトリ をコンテナ内の /app にマウントします。
volumes:ホストマシンと Dockerコンテナの間でファイルやディレクトリを共有します。これにより、コンテナ内のデータとホストマシンのデータを同期させたり、永続化したりできます。
(6)environment
environment:
- FLASK_ENV=development
Dockerのコンテナ内で使用される環境変数を設定するために使用します。
Dockerコンテナはホストマシンの環境と完全に分離されて動作するため、コンテナ内部で環境変数を設定する必要があります。
FLASK_ENV=development に設定することで、Flask を開発モードで起動(デバッグ機能が有効)。
おわりに
この記事では、Dockerfileとdocker-compose.ymlについて解説しました。プロジェクトの要件によって記述内容は変わるため、実際に使いながら理解を深めていきたいと思います。
初学者の記事ですので、間違っている点がありましたらご指摘頂けると助かります。