開発者のためのDocker:イメージ、コンテナ、Compose
あなたは開発者で、Dockerについて聞いたことがあるでしょう。もしかしたら試したことがあるかもしれませんが、イメージ、コンテナ、Composeの概念がぼんやりしているかもしれません。あるいは「自分のマシンでは動く」にうんざりして、一貫した環境を求めているかもしれません。このガイドでは、雑音を取り除き、Dockerの核心部分とその効果的な使い方について実践的な理解を提供します。
なぜ開発者にDockerなのか?
Dockerは環境の不一致を解決します。依存関係をマシンに直接インストールする代わりに、アプリとその依存関係をコンテナにパッケージ化します。コンテナはどこでも同じように動作します:あなたのラップトップ、同僚のラップトップ、本番環境でも。これによりセットアップのずれがなくなり、オンボーディングが簡単になります。
イメージ:設計図
イメージは読み取り専用のテンプレートです。アプリケーションコード、ランタイム、ライブラリ、環境変数が含まれています。Dockerfile(指示を含むテキストファイル)からイメージをビルドします。
以下はNode.jsアプリ用の簡単なDockerfileです:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
各命令はレイヤーを作成します。レイヤーはキャッシュされるため、コードのみが変更された場合の再ビルドは高速です。イメージはDocker Hubやプライベートレジストリなどのレジストリに保存されます。
コンテナ:実行インスタンス
コンテナはイメージの実行可能なインスタンスです。分離されていますが、ホストOSカーネルを共有するため軽量です。docker runでコンテナを起動します。
docker run -p 3000:3000 -d my-app
これはホストのポート3000をコンテナのポート3000にマッピングし、デタッチモードで実行します。コンテナは一時的です:ボリュームを使用しない限り、削除すると変更は失われます。
主要コマンド:
docker ps– 実行中のコンテナを一覧表示docker stop <container>– コンテナを停止docker rm <container>– コンテナを削除docker images– イメージを一覧表示docker rmi <image>– イメージを削除
Docker Compose:マルチコンテナアプリ
実際のアプリはしばしば複数のサービスを必要とします:Webサーバー、データベース、キャッシュ。Docker Composeを使用すると、単一のYAMLファイルでマルチコンテナアプリケーションを定義して実行できます。
以下はPostgreSQLを使用するNode.jsアプリのdocker-compose.ymlです:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
docker compose upを実行して両方のサービスを起動します。Composeがネットワーキングを処理するため、webはサービス名でdbに到達できます。
Docker ComposeとプレーンDockerの使い分け
| シナリオ | 使用 |
|---|---|
| 単一コンテナ | docker run |
| 複数サービス(アプリ+DB) | Docker Compose |
| 本番オーケストレーション | Kubernetes, Swarm |
開発者向けベストプラクティス
- .dockerignoreを使用してnode_modules、.gitなどを除外し、ビルドを高速化。
- マルチステージビルドで最終イメージを小さく保つ。
- バージョンを固定してFROMステートメントで再現性を確保。
- 本番コンテナではrootで実行しない。
- ボリュームを使用して永続データと開発中のライブコードリロードを実現。
よくある落とし穴
ポート競合: ポート3000が使用されている場合、別のホストポートにマッピング:-p 3001:3000。
データ損失: ボリュームなしでは、コンテナ削除時にデータベースデータが消えます。
遅いビルド: Dockerfileの命令を変更頻度の低いものから高いものへと順序付けてキャッシュを活用。
FAQ
イメージとコンテナの違いは何ですか?
イメージは読み取り専用のテンプレートであり、コンテナはそのイメージの実行インスタンスです。同じイメージから複数のコンテナを実行できます。
単一サービスにDocker Composeは必要ですか?
いいえ。Composeは複数のサービスがある場合に真価を発揮します。単一コンテナの場合、docker runの方が簡単です。
Dockerでデータを永続化するには?
ボリュームを使用します。Composeで名前付きボリュームを定義するか、docker runで-vを使用してホストディレクトリまたは名前付きボリュームをマウントします。
Dockerワークフローを効率化する準備はできましたか? JSON Formatterをチェックして、docker-compose.ymlやpackage.jsonなどのJSON設定ファイルを迅速に検証およびフォーマットしましょう。