開発者のためのDocker:イメージ、コンテナ、Compose
開発者として、環境の不一致による「私のマシンでは動くのに!」というフラストレーションを経験したことがあるでしょう。Dockerはアプリケーションをコンテナにパッケージ化することでこの問題を解決します。このガイドではDockerイメージ、コンテナ、Composeについて説明し、アプリケーションを一貫してビルド、出荷、実行する方法を紹介します。
Dockerとは?
Dockerは、コンテナ内でアプリケーションを開発、出荷、実行するためのプラットフォームです。コンテナは軽量でスタンドアロンの実行可能なパッケージであり、ソフトウェアの実行に必要なものすべて(コード、ランタイム、システムツール、ライブラリ、設定)を含みます。
イメージとコンテナの違い
イメージはコンテナを作成するための手順を含む読み取り専用のテンプレートです。コンテナはイメージの実行可能なインスタンスです。同じイメージから複数のコンテナを作成でき、それぞれが互いに分離されています。
イメージの操作
イメージはDockerfile(手順を記述したテキストファイル)からビルドされます。以下はシンプルなNode.jsの例です:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
イメージをビルドするには:
docker build -t my-app .
イメージ一覧:docker images
コンテナの実行
イメージからコンテナを起動します:
docker run -d -p 3000:3000 --name my-container my-app
これはコンテナをデタッチモード(-d)で実行し、ポート3000をマッピングし、my-containerという名前を付けます。
実行中のコンテナ一覧:docker ps
コンテナを停止:docker stop my-container
コンテナを削除:docker rm my-container
なぜDocker Composeを使うのか?
アプリが複数のサービス(データベース、キャッシュなど)に依存している場合、個々のコンテナを管理するのは面倒になります。Docker Composeを使えば、YAMLファイルでマルチコンテナアプリケーションを定義して実行できます。
Composeファイルの例
docker-compose.ymlを作成します:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
すべてのサービスを起動:docker compose up -d
停止して削除:docker compose down
開発者向けベストプラクティス
- .dockerignoreを使う:不要なファイル(node_modules、.git)を除外してビルドを高速化します。
- マルチステージビルド:ビルドステージとランタイムステージを分けて、本番イメージを小さく保ちます。
- キャッシュを活用する:Dockerfileの命令を変更頻度の低いものから高いものへと並べます。
- イメージに適切なタグを付ける:本番では
latestの使用を避け、セマンティックバージョニングを使います。 - 脆弱性をスキャンする:
docker scanを使ってイメージの既知の問題をチェックします。
よく使うコマンドチートシート
| コマンド | 説明 |
|---|---|
docker build -t name . | Dockerfileからイメージをビルド |
docker run -p host:container image | コンテナを実行してポートをマッピング |
docker ps -a | すべてのコンテナを一覧表示 |
docker exec -it container bash | 実行中のコンテナ内でシェルを開く |
docker compose up | Composeファイルで定義されたサービスを起動 |
docker compose logs -f | すべてのサービスのログをフォロー |
FAQ
イメージとコンテナの違いは何ですか?
イメージは静的なテンプレートであり、コンテナはそのイメージの実行インスタンスです。1つのイメージから多数のコンテナを作成できます。
Docker Composeはいつ使うべきですか?
アプリケーションが一緒に実行する必要のある複数のサービス(例:Webサーバー、データベース、キャッシュ)を必要とする場合にComposeを使います。開発とテストのためのオーケストレーションを簡素化します。
Dockerでデータを永続化するにはどうすればよいですか?
ボリュームまたはバインドマウントを使います。ボリュームはDockerによって管理され専用領域に保存されます。バインドマウントはホストディレクトリにリンクします。どちらもコンテナの再起動後も存続します。
Dockerワークフローを効率化する準備はできましたか?Nginx Log Analyzerを試して、コンテナログをすばやくデバッグしましょう。