TechBlog

Docker入門|コンテナの仕組みとdocker runからdocker composeまで初心者向け解説

by あくえり
#Docker #コンテナ #環境構築 #初心者 #DevOps
Docker入門ガイド
目次

Dockerが解決する問題

「自分のPCでは動くのに、本番サーバーでは動かない」という問題を、エンジニアなら一度は経験するでしょう。原因として多いのは以下のような環境の差異です。

  • OSのバージョンが違う(macOS と Ubuntu)
  • Node.jsのバージョンが違う(開発: v20 / 本番: v18)
  • ライブラリのバージョンが違う
  • 環境変数の設定漏れ

Dockerはこの問題を根本的に解決します。「コンテナ」という単位でアプリケーションと実行環境をまるごとパッケージ化することで、どのマシンでも同じ環境でアプリを動かせるようになります。

コンテナと仮想マシン(VM)の違い

よく比較される仮想マシン(VirtualBox、VMwareなど)とDockerコンテナの違いを理解しましょう。

比較項目仮想マシン(VM)Dockerコンテナ
起動時間数十秒〜数分1秒以下
ディスク容量数GB〜数十GB数十MB〜数百MB
OSの持ち方ゲストOSを丸ごと含むホストOSのカーネルを共有
用途OS全体の隔離アプリの実行環境の隔離

仮想マシンはOS全体をエミュレートするため重く、起動も遅いです。一方Dockerコンテナはホストマシンのカーネルを共有するため非常に軽量で、起動も高速です。

Dockerの基本用語

イメージ(Image)

コンテナの「設計図」です。OSの種類、インストールするソフトウェア、設定ファイルなどが書かれた読み取り専用のテンプレートです。

Docker Hub(hub.docker.com)には公式イメージが多数公開されています。node:20-alpine(軽量Node.js環境)やpostgres:16(PostgreSQLデータベース)などがよく使われます。

コンテナ(Container)

イメージから作成した「実行中のインスタンス」です。同じイメージから複数のコンテナを起動することもできます。コンテナを停止・削除しても、イメージ自体は残ります。

Dockerfile

カスタムイメージを作るための設定ファイルです。ベースイメージの指定、パッケージのインストール、ファイルのコピーなどの手順を記述します。

レジストリ(Registry)

イメージを保存・配布する場所です。Docker Hubが最も有名ですが、GitHub Container Registry(ghcr.io)やAWSのECRなどもあります。

基本コマンド

docker pull — イメージを取得

docker pull node:20-alpine
# Docker HubからNode.js 20のAlpineイメージをダウンロード

docker run — コンテナを起動

# 基本的な起動
docker run node:20-alpine node --version

# ポートフォワードして起動(ホストの3000番 → コンテナの3000番)
docker run -p 3000:3000 node:20-alpine

# バックグラウンドで起動
docker run -d -p 5432:5432 --name my-postgres \
  -e POSTGRES_PASSWORD=secret \
  postgres:16

# ボリュームをマウントして起動(ホストのファイルを共有)
docker run -v $(pwd):/app -w /app node:20-alpine node index.js

docker ps — コンテナ一覧を表示

docker ps           # 実行中のコンテナ一覧
docker ps -a        # 停止中も含めた全コンテナ一覧

docker stop / rm — コンテナを停止・削除

docker stop my-postgres     # コンテナを停止
docker rm my-postgres       # コンテナを削除(停止後に実行)
docker rm -f my-postgres    # 強制停止して削除

docker build — イメージをビルド

docker build -t my-app:1.0 .
# カレントディレクトリのDockerfileを使ってmy-app:1.0というイメージを作成

Dockerfileの書き方

Node.jsアプリのDockerfileの例を見てみましょう。

# ベースイメージを指定(Node.js 20のAlpine Linux版)
FROM node:20-alpine

# コンテナ内の作業ディレクトリを設定
WORKDIR /app

# package.jsonとpackage-lock.jsonをコピー(キャッシュ活用のため先にコピー)
COPY package*.json ./

# 依存パッケージをインストール(本番用のみ)
RUN npm ci --only=production

# アプリケーションのソースコードをコピー
COPY . .

# コンテナが公開するポート番号を宣言
EXPOSE 3000

# コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]

Dockerfileのベストプラクティス:

  • COPY package*.json ./を先に行いRUN npm ciでインストールする(ソース変更時にキャッシュを有効活用)
  • node_modules.dockerignoreに追加してコピー対象から除外する
  • 本番環境ではnpm installではなくnpm ciを使う(再現性が高い)

docker-compose.ymlの基本

複数のコンテナを連携させる場合、docker-compose.ymlを使うと管理が楽になります。Node.js + PostgreSQLの構成を例に見てみましょう。

# docker-compose.yml
version: '3.9'

services:
  # Node.jsアプリケーション
  app:
    build: .                    # カレントのDockerfileでビルド
    ports:
      - "3000:3000"             # ホスト:コンテナのポートマッピング
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://postgres:secret@db:5432/mydb
    volumes:
      - .:/app                  # ホストのカレントディレクトリをマウント
      - /app/node_modules       # node_modulesはマウント対象外
    depends_on:
      db:
        condition: service_healthy  # DBのヘルスチェック後に起動

  # PostgreSQLデータベース
  db:
    image: postgres:16
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data  # データを永続化
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

# 名前付きボリューム(コンテナ削除後もデータを保持)
volumes:
  postgres_data:

docker composeの主要コマンド

docker compose up           # 全サービスを起動(フォアグラウンド)
docker compose up -d        # バックグラウンドで起動
docker compose down         # 全サービスを停止・削除
docker compose down -v      # ボリュームも含めて削除
docker compose logs -f app  # appサービスのログをリアルタイム表示
docker compose exec app sh  # 実行中のappコンテナにシェルで入る
docker compose ps           # サービスの状態を確認

.dockerignoreを設定する

.gitignoreと同様に、Dockerのビルドコンテキストから除外するファイルを指定します。

node_modules
.git
.env
dist
build
*.log

node_modulesをコピー対象に含めると、ホスト環境のバイナリがコンテナにコピーされて動作しないことがあります。必ず除外しましょう。

Docker/Kubernetes 実践コンテナ開発入門

Dockerの基礎からKubernetesによるオーケストレーションまで実践的に解説。現場で使える構成例が豊富に掲載されています。

※ アフィリエイトリンクを含みます

Udemy — Docker & Kubernetes: The Practical Guide

DockerとKubernetesをハンズオン形式で学べるベストセラー講座。実際のプロジェクトに即した内容で、環境構築から本番デプロイまで網羅。

¥1,800〜 Udemyで見る

※ アフィリエイトリンクを含みます

まとめ

Dockerの核心は「環境をコードで定義して再現可能にする」ことです。

  • イメージ: コンテナの設計図(読み取り専用)
  • コンテナ: イメージから作った実行インスタンス
  • Dockerfile: カスタムイメージを作る設計書
  • docker-compose.yml: 複数コンテナを定義・管理する設定ファイル

まずはdocker runで既存のイメージを動かすことから始め、慣れてきたら自前のDockerfileを書いてイメージをビルドしてみましょう。チーム開発でDockerを使えると、「環境が違う」という問題から解放されます。

共有: