開発者のためのDocker:イメージ、コンテナ、Compose
Dockerについて聞いたことがあり、開発ワークフローを簡素化できることをご存知かもしれません。しかし、イメージ、コンテナ、Docker Composeといった用語に初めて出会うと、圧倒されるかもしれません。このガイドは、雑音を排除し、プロジェクトでDockerを効果的に使用する方法を正確に示します。
Dockerとは何か、なぜ気にするべきか?
Dockerは、アプリケーションとその依存関係をコンテナと呼ばれる標準化された単位にパッケージ化するプラットフォームです。コンテナは軽量でポータブル、そして互いに分離されています。アプリがどこでも同じように動作することを保証することで、古典的な「私のマシンでは動く」問題を解決します。
仮想マシンとは異なり、コンテナはホストOSのカーネルを共有するため、起動が速く、より効率的です。これが、Dockerが現代の開発およびデプロイメントパイプラインで定番となっている理由です。
イメージ vs. コンテナ:ビルディングブロック
イメージは、アプリケーションコード、ランタイム、ライブラリ、設定を含む読み取り専用のテンプレートです。コンテナはイメージの実行インスタンスです。イメージをクラス、コンテナをオブジェクトと考えてください。
イメージはDockerfileを使用して作成します。以下はNode.jsアプリの簡単な例です:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Dockerfileの各行はレイヤーを作成します。レイヤーはキャッシュされるため、後のステップのみが変更された場合、再ビルドが高速になります。
一般的なDockerコマンド
docker build -t my-app .— 現在のディレクトリからイメージをビルドdocker run -p 3000:3000 my-app— コンテナを実行しポートをマッピングdocker ps— 実行中のコンテナをリストdocker stop <container_id>— コンテナを停止docker rmi <image_id>— イメージを削除
Docker Compose:マルチコンテナアプリの管理
実際のアプリでは、多くの場合、複数のサービス(Webサーバー、データベース、キャッシュ)が必要です。Docker Composeを使用すると、単一のYAMLファイルでマルチコンテナアプリケーションを定義して実行できます。
以下は、PostgreSQLとRedisを備えたNode.jsアプリのdocker-compose.ymlです:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
docker compose upを実行すると、すべてのサービスが一緒に起動します。depends_onは、データベースとキャッシュがWebサービスより先に起動することを保証します。
主要なComposeコマンド
docker compose up -d— すべてのサービスをデタッチモードで起動docker compose down— コンテナ、ネットワークを停止して削除docker compose logs -f web— 特定のサービスのログをフォローdocker compose exec web sh— 実行中のコンテナ内でシェルを開く
開発のベストプラクティス
- .dockerignoreを使用する — node_modules、.git、その他の不要なファイルをビルドコンテキストから除外します。
- イメージを小さく保つ — Alpineベースのイメージとマルチステージビルドを使用します。
- rootとして実行しない — セキュリティのためにDockerfileで非rootユーザーを作成します。
- 永続データにはボリュームを、開発中のライブコードリロードにはバインドマウントを使用する。
- バージョンを固定する — DockerfileとComposeファイルで予期しない更新を避けるため。
Dockerをいつ使用するか(そして使用しない場合)
Dockerは、チーム間で一貫した環境、簡単な依存関係管理、またはマイクロサービスが必要な場合に輝きます。単純な静的サイトやスクリプトには過剰かもしれません。プロジェクトの複雑さとデプロイメントのニーズに基づいて評価してください。
FAQ
イメージとコンテナの違いは何ですか?
イメージは静的なテンプレートであり、コンテナはそのイメージの実行インスタンスです。同じイメージから複数のコンテナを実行できます。
単一のコンテナにDocker Composeは必要ですか?
いいえ、単一のコンテナにはdocker runを使用できます。Composeは、通信する必要がある複数のサービスがある場合に便利です。
Dockerでデータを永続化するにはどうすればよいですか?
ボリュームまたはバインドマウントを使用します。ボリュームはDockerによって管理され、データベースに最適です。バインドマウントはホストディレクトリをコンテナにマップし、開発に役立ちます。
Docker化されたアプリを最適化する準備はできましたか?コンテナ内でNginxログを扱っているなら、Nginx Log Analyzerを試して、ログを迅速に解析および分析してください。