開発者のためのDocker:イメージ、コンテナ、Compose

DevOps2026-10-01TryQuickToolBox

開発者として、環境の不一致による「私のマシンでは動くのに!」というフラストレーションを経験したことがあるでしょう。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

開発者向けベストプラクティス

よく使うコマンドチートシート

コマンド説明
docker build -t name .Dockerfileからイメージをビルド
docker run -p host:container imageコンテナを実行してポートをマッピング
docker ps -aすべてのコンテナを一覧表示
docker exec -it container bash実行中のコンテナ内でシェルを開く
docker compose upComposeファイルで定義されたサービスを起動
docker compose logs -fすべてのサービスのログをフォロー

FAQ

イメージとコンテナの違いは何ですか?

イメージは静的なテンプレートであり、コンテナはそのイメージの実行インスタンスです。1つのイメージから多数のコンテナを作成できます。

Docker Composeはいつ使うべきですか?

アプリケーションが一緒に実行する必要のある複数のサービス(例:Webサーバー、データベース、キャッシュ)を必要とする場合にComposeを使います。開発とテストのためのオーケストレーションを簡素化します。

Dockerでデータを永続化するにはどうすればよいですか?

ボリュームまたはバインドマウントを使います。ボリュームはDockerによって管理され専用領域に保存されます。バインドマウントはホストディレクトリにリンクします。どちらもコンテナの再起動後も存続します。

Dockerワークフローを効率化する準備はできましたか?Nginx Log Analyzerを試して、コンテナログをすばやくデバッグしましょう。