開発者のためのDocker: イメージ、コンテナ、Compose
Dockerとコンテナについて聞いたことはあるけれど、日々の開発ワークフローにどう当てはまるのかよく分からない、という方も多いでしょう。あるいはDockerを試してみたものの、イメージ、コンテナ、Composeの概念が混乱して感じられるかもしれません。このガイドでは、実践的な例を交えながら基本を順を追って説明するので、プロジェクトでDockerを効果的に使い始められます。
Dockerイメージとコンテナとは?
Dockerイメージは、アプリケーションの設計図だと考えてください。コードを実行するために必要なものすべてが含まれています: オペレーティングシステム、ランタイム、ライブラリ、そしてアプリケーションのファイルです。イメージは不変で、Dockerfileからビルドされます。
コンテナは、イメージの実行インスタンスです。コンテナを起動すると、Dockerはイメージから隔離された環境を作成します。同じイメージから複数のコンテナを実行でき、それぞれが独自の状態を持ちます。
主な違い
| イメージ | コンテナ |
|---|---|
| 読み取り専用のテンプレート | 実行可能なインスタンス |
| Dockerfileからビルド | イメージから作成 |
| レジストリに保存 | ホスト上で実行 |
| 不変 | 一時的(停止、起動、削除が可能) |
最初のDockerイメージをビルドする
シンプルなNode.jsアプリを作成してコンテナ化してみましょう。プロジェクトのルートにDockerfileを作成します:
# 公式のNode.jsランタイムを親イメージとして使用
FROM node:18-alpine
# 作業ディレクトリを設定
WORKDIR /app
# package.jsonとpackage-lock.jsonをコピー
COPY package*.json ./
# 依存関係をインストール
RUN npm ci --only=production
# 残りのアプリケーションコードをコピー
COPY . .
# アプリが実行されるポートを公開
EXPOSE 3000
# アプリを実行するコマンドを定義
CMD ["node", "server.js"]
次のコマンドでイメージをビルドします:
docker build -t my-node-app .
イメージからコンテナを実行します:
docker run -p 3000:3000 -d my-node-app
これでアプリはhttp://localhost:3000でアクセスできるようになります。
コンテナの管理
コンテナを管理するための必須コマンドを紹介します:
docker ps– 実行中のコンテナを一覧表示docker ps -a– すべてのコンテナを一覧表示(停止中も含む)docker stop <container_id>– 実行中のコンテナを停止docker rm <container_id>– 停止したコンテナを削除docker logs <container_id>– コンテナのログを表示docker exec -it <container_id> sh– 実行中のコンテナ内でシェルを開く
Docker Composeでマルチコンテナアプリを簡素化する
実際のアプリケーションでは、多くの場合、Webサーバー、データベース、キャッシュなど複数のサービスが必要です。これらを個別のdocker runコマンドで管理するのは面倒です。Docker Composeを使えば、YAMLファイルでマルチコンテナアプリケーションを定義して実行できます。
docker-compose.ymlを作成します:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
すべてのサービスを起動します:
docker compose up -d
停止して削除します:
docker compose down
開発のベストプラクティス
- .dockerignoreを使う: ビルドコンテキストから不要なファイル(node_modules、.git)を除外します。
- レイヤーキャッシュを活用する: 依存関係のインストールがソースコードのコピーより先になるようにDockerfileの命令を順序付けます。
- マルチステージビルドを使う: 本番イメージを小さく保ちます。
- データをボリュームに保存する: データベースやその他のステートフルサービス向けです。
- ローカル開発にComposeを使う: 本番に近い環境を再現します。
よくある質問
イメージとコンテナの違いは何ですか?
イメージは、アプリケーションとその依存関係を定義する読み取り専用のテンプレートです。コンテナは、イメージの実行インスタンスであり、書き込み可能なレイヤーが上に追加されています。
本番環境でDocker Composeを使えますか?
Docker Composeは主に開発とテスト用に設計されています。本番環境では、KubernetesやDocker Swarmなどのオーケストレーションツールを検討してください。
Dockerでデータを永続化するには?
ボリュームまたはバインドマウントを使用します。ボリュームはDockerによって管理され、コンテナが生成するデータを永続化するための推奨方法です。
アプリをコンテナ化する準備はできましたか?チーム向けにドキュメントやガイドをPDFに変換する必要があるなら、洗練されたドキュメントを共有するためにWord to PDFコンバーターをお試しください。