Blog Article
DockerfileやDocker Composeについて
Dockerfileとは
Dockerfile は、Dockerコンテナのビルドプロセスを自動化するためのテキストベースの設定ファイルです。Dockerfileは、Dockerイメージを構築するための手順や設定を定義し、それに基づいてDockerコンテナを作成します。
以下に、Dockerfileの基本的な要素と役割を分かりやすく説明します。
- ベースイメージの指定
Dockerfileの最初の行では、ベースとなるDockerイメージを指定します。これは、構築するコンテナの基礎となるイメージです。例えば、Alpine Linux、Ubuntu、Node.jsなどがベースイメージとして使われます。
FROM ubuntu:latest
- 作業ディレクトリの指定
コンテナ内での作業ディレクトリを指定します。これは、後続の命令が実行されるコンテキストとなります。
WORKDIR /app
- ファイルのコピー
ローカルマシン上のファイルやディレクトリをコンテナ内にコピーします。
COPY
命令を使用します。COPY . .
- 依存関係のインストール
アプリケーションの依存関係やパッケージをインストールします。これには、パッケージマネージャ(apt、yum、npmなど)やランタイム(Node.js、Pythonなど)に関する命令が含まれます。
RUN apt-get update && apt-get install -y python3
- ポートのエクスポート
コンテナがリッスンするポートを指定し、外部からアクセスできるようにします。
EXPOSE 80
- 実行コマンドの指定
コンテナが起動した際に実行されるコマンドを指定します。通常、アプリケーションのエントリーポイントやサーバーの起動コマンドがここに含まれます。
CMD ["python3", "app.py"]
これらの要素を組み合わせることで、DockerfileはアプリケーションやサービスのDockerコンテナを効率的かつ再現可能な方法で構築できます。Dockerfileは、コードとアプリケーションをコンテナとして簡単にパッケージングし、異なる環境で一貫性を維持するのに役立ちます。
Docker Composeとは
Docker Compose (ドッカー コンポーズ) は、複数のDockerコンテナから成るアプリケーションを定義し、実行するためのツールです。単一の定義ファイルでマルチコンテナのDockerアプリケーションを定義し、それを1つのコマンドで起動できるようにします。(起動・停止・破棄を一気にできる) これは、複数のサービスやコンテナが連携して動作する複雑なアプリケーションに特に有用です。
Docker Composeアプリケーションの構成は、「docker-compose.yml」と呼ばれるファイルに定義されます。このYAMLファイルは、アプリケーションに必要なサービス、ネットワーク、ボリュームなどを指定します。また、環境変数、コンテナ間の依存関係などの他の構成オプションも含まれます。
ファイルの中身を「up (一括実行=run)」したり、「down (コンテナとネットワーク一括停止・削除)」したり出来ます。
Docker ComposeとDockerfileの違い
双方、テキストファイルに定義を書いて実行しますが、2つは実行する内容が明確に違います。
Docker Compose
Docker Composeは、複数のコンテナで構成されるアプリケーションの定義を記述し、一括で起動・管理するためのツールです。また、開発やテスト、本番環境などで複数のコンテナを協調して動作させるのに便利です。
Docker ComposeファイルはYAML形式で記述され、複数のサービス、ネットワーク、ボリュームなどの設定が含まれます。
Dockerfile
Dockerfileは、Dockerイメージをビルドするためのテキストベースの設定ファイルです。
イメージは、アプリケーションやサービスが実行されるコンテナの元となるもので、OSやアプリケーションの依存関係、設定、およびコードなどが含まれます。また、Dockerfileには、ベースイメージの指定、パッケージのインストール、ファイルのコピー、環境変数の設定など、イメージを構築するための手順が記述されています。
Dockerfileは、イメージを作るものなので、ネットワークやボリュームを作成出来ません。
要するにDockerfileは単一のコンテナのビルドに焦点を当てていますが、Docker Composeは複数のコンテナを含むアプリケーションの構成管理と一括起動に役立ちます。
Dockerにおけるレイアとは?
Dockerにおける「レイヤ」とは、Dockerイメージの構造を指しています。Dockerイメージは、アプリケーションやサービスを実行するために必要なすべてのコード、ライブラリ、設定、および依存関係を含むパッケージ化されたファイルシステムです。これらの要素は、複数の「レイヤ」と呼ばれる単位で構成されています。Dockerのレイヤ構造は、イメージのビルドプロセスの高速性、効率性、およびイメージのバージョン管理の容易さを実現するための重要な概念です。
以下に、Dockerのレイヤに関する基本的な概念を分かりやすく説明します。
- ベースイメージ (Base Image)
一つ目のレイヤは、ベースイメージと呼ばれます。これは、通常はオペレーティングシステムやランタイム環境などが含まれており、このイメージが他のレイヤと組み合わさってアプリケーションの実行環境を提供します。ベースイメージは読み取り専用で、変更できません。
- イメージ内の変更 (Layers on top of Base Image)
次に、ベースイメージの上に新しいレイヤが追加されます。これにより、アプリケーションコード、依存関係、および設定が含まれた新しいレイヤが作られます。この新しいレイヤは、ベースイメージのレイヤを基にしていますが、変更が加えられています。これにより、異なるバージョンのアプリケーションやパッケージを含む異なるイメージを作成することが容易になります。
- キャッシュとレイヤの再利用
Dockerはレイヤをキャッシュし、同じレイヤが再利用されることで効率的にビルドプロセスを行います。これは、前回のビルド結果が変わらない限り、同じレイヤは再作成されずに再利用されるというメカニズムです。この仕組みにより、イメージのビルドが高速に行えます。
- イメージの不変性 (Immutable Image)
イメージの各レイヤは不変性を持ちます。すでに作成されたイメージは変更されないため、新しいレイヤが追加された場合は新しいイメージが生成されます。これにより、アプリケーションのデプロイやバージョン管理が容易になります。
Docker Composeの基本操作
- イメージのビルド
docker-compose build
- コンテナの作成・起動
docker-compose up -d
- コンテナの停止・削除を一括で行う
docker-compose down
- コンテナ一覧を表示
docker-compose ps
- ログを表示
docker-compose logs
- コンテナを作成してコマンドを実行
docker-compose run <サービス> <コマンド>
- 起動中のコンテナにコマンドを実行
docker-compose exec <サービス> <コマンド>
- dockerファイルやDemfileの修正を反映させたい時の手順 (イメージから作り直す)
// imageを作り直す 1. docker-compose build // dockerコンテナを作成・起動 2. docker-compose up -d // 変更したときはビルドする 3. docker-compose build