Chapter 13: Docker 入門
コンテナ技術の基礎と Docker の使い方
Chapter 13: Docker 入門
13.1 コンテナ技術とは
「自分のPCでは動くのに、本番サーバーでは動かない」
ソフトウェア開発でよく起きるこの問題を解決するのがコンテナ技術です。Dockerを使うと、アプリケーションとその動作に必要なすべての環境をひとまとめにパッケージ化できます。
仮想マシンとの違い
コンテナ以前は「仮想マシン(VM)」を使って環境の問題を解決していました。
| 比較項目 | 仮想マシン | Docker コンテナ |
|---|---|---|
| 起動時間 | 数分 | 数秒 |
| サイズ | GB 単位 | MB 単位 |
| OS | ゲストOSが必要 | ホストOSを共有 |
| 隔離レベル | 完全に隔離 | プロセスレベルで隔離 |
| リソース消費 | 多い | 少ない |
コンテナはOSを丸ごと持たずにホストOSのカーネルを共有するため、軽量で高速です。
Docker の主なメリット
- 環境の統一: 「自分のPCでは動く」問題がなくなる
- 素早いセットアップ: 新しい開発者が参加したとき、1コマンドで環境構築完了
- 本番環境との一致: 開発・ステージング・本番で同じ環境を使える
- 依存関係の分離: Node.jsの異なるバージョンが必要なプロジェクトを同じPCで動かせる
13.2 Docker のインストール
Docker Desktop のインストール
docs.docker.com から Docker Desktop をダウンロードします。
- macOS: Apple Silicon / Intel 両対応のインストーラあり
- Windows: WSL2 が必要(自動でインストールを促してくれる)
- Linux:
aptやyumでインストール可能
TODO: screenshot - Docker Desktop のコンテナ管理画面
インストール確認
# Docker のバージョン確認
docker --version
# Docker version 24.0.0, build abc1234
# Docker Compose のバージョン確認
docker compose version
# Docker Compose version v2.20.0
# 動作確認(Hello World コンテナを実行)
docker run hello-world
# Hello from Docker! ← このメッセージが出れば成功13.3 イメージとコンテナの関係
Dockerには「イメージ」と「コンテナ」という2つの重要な概念があります。
| 用語 | 例え | 説明 |
|---|---|---|
| イメージ | クッキーの型 | アプリと環境を固めた「設計図」。変更不可 |
| コンテナ | 焼いたクッキー | イメージから実際に起動した「実行環境」 |
| Dockerfile | レシピ | イメージを作るための手順書 |
1つのイメージから複数のコンテナを起動できます。
よく使うイメージを確認する
# ローカルにあるイメージ一覧
docker images
# REPOSITORY TAG IMAGE ID SIZE
# hello-world latest d2c94e258dcb 13.3kB
# node 18 abc123... 910MB13.4 docker run で動かす
# 基本的な使い方
docker run <イメージ名>
# 例: Ubuntu を起動してシェルに入る
docker run -it ubuntu bash
# -i = interactive(インタラクティブモード)
# -t = tty(ターミナルを使う)
# 例: Node.js のバージョンを確認
docker run node:18 node --version
# v18.19.0
# 例: Nginx ウェブサーバーを起動
docker run -d -p 8080:80 nginx
# -d = detach(バックグラウンドで起動)
# -p 8080:80 = ホストの8080番ポートをコンテナの80番に接続
# ブラウザで http://localhost:8080 にアクセスすると Nginx のページが表示されるよく使うオプション
| オプション | 意味 | 例 |
|---|---|---|
-d | バックグラウンドで実行 | docker run -d nginx |
-p <ホスト>:<コンテナ> | ポートを接続 | -p 3000:3000 |
-v <ホスト>:<コンテナ> | ディレクトリを共有 | -v ./src:/app/src |
-e <変数>=<値> | 環境変数を設定 | -e NODE_ENV=production |
--name <名前> | コンテナに名前をつける | --name my-app |
--rm | 終了時にコンテナを削除 | docker run --rm node |
コンテナの管理
# 実行中のコンテナを確認
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 停止中も含め全コンテナを確認
docker ps -a
# コンテナを停止
docker stop <コンテナIDまたは名前>
# コンテナを削除
docker rm <コンテナIDまたは名前>
# コンテナのログを確認
docker logs <コンテナIDまたは名前>
# 実行中のコンテナに入る
docker exec -it <コンテナ名> bash13.5 Dockerfile の書き方
Dockerfile はイメージを作るための設計図です。
# FROM: ベースとなるイメージを指定
FROM node:18-alpine
# WORKDIR: コンテナ内の作業ディレクトリ
WORKDIR /app
# COPY: ホストのファイルをコンテナにコピー
# 依存関係のファイルだけ先にコピー(キャッシュ効率のため)
COPY package*.json ./
# RUN: ビルド時に実行するコマンド
RUN npm install
# アプリケーションのコードをコピー
COPY . .
# EXPOSE: コンテナが使うポートを宣言(ドキュメント的な意味)
EXPOSE 3000
# CMD: コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]イメージをビルドして実行
# Dockerfile からイメージをビルド
docker build -t my-app:latest .
# -t = タグ(イメージ名:バージョン)
# . = Dockerfileのある場所
# ビルドしたイメージからコンテナを起動
docker run -p 3000:3000 my-app:latest.dockerignore
.gitignore のように、Dockerにコピーさせたくないファイルを指定できます:
# .dockerignore
node_modules/
.git/
.env
*.log13.6 Docker Compose で複数コンテナを管理
実際のWebアプリケーションは「Webサーバー + データベース + キャッシュ」など複数のサービスで構成されます。Docker Compose を使うと、複数のコンテナをまとめて管理できます。
docker-compose.yml の基本
# docker-compose.yml
version: "3.8"
services:
# Webアプリケーション
app:
build: . # Dockerfile からビルド
ports:
- "3000:3000" # ホスト:コンテナ
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
volumes:
- ./src:/app/src # ソースコードをマウント(開発時)
# PostgreSQL データベース
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres-data:/var/lib/postgresql/data # データを永続化
# Redis キャッシュ
cache:
image: redis:7-alpine
# 名前付きボリューム
volumes:
postgres-data:Docker Compose のコマンド
# 全サービスをバックグラウンドで起動
docker compose up -d
# ログを確認(全サービス)
docker compose logs -f
# 特定サービスのログを確認
docker compose logs -f app
# 全サービスを停止
docker compose down
# 停止してボリュームも削除(データも消える)
docker compose down -v
# サービスのステータス確認
docker compose ps13.7 実践: 開発環境をコンテナ化する
Node.js のシンプルなWebアプリをDockerで動かしてみましょう。
ディレクトリ構成
my-app/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── package.json
└── server.jsserver.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello from Docker!');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});package.json
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.0"
},
"scripts": {
"start": "node server.js"
}
}Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]起動と確認
# イメージをビルド
docker build -t my-node-app .
# コンテナを起動
docker run -p 3000:3000 my-node-app
# ブラウザで http://localhost:3000 にアクセス
# "Hello from Docker!" と表示されれば成功
出典: Docker 公式ドキュメント
TODO: あとで実際のスクリーンショットに置き換え - ブラウザで「Hello from Docker!」が表示されている画面
開発時のボリュームマウント
開発中はソースコードの変更をリアルタイムで反映させたいです。ボリュームマウントを使うと、コンテナを再ビルドしなくても変更が反映されます。
# ソースコードをマウントして起動
docker run -p 3000:3000 -v $(pwd):/app my-node-appまたは docker-compose.yml に volumes: - ./:/app を追加します。
まとめ
| コマンド | 説明 |
|---|---|
docker run <image> | コンテナを起動 |
docker ps | 実行中のコンテナ一覧 |
docker stop <id> | コンテナを停止 |
docker build -t <名前> . | イメージをビルド |
docker images | イメージ一覧 |
docker compose up -d | Composeで起動 |
docker compose down | Composeで停止 |
docker logs <id> | ログを確認 |
Dockerを使いこなすと、どんな環境でもアプリを確実に動かせるようになります。現代のソフトウェア開発では欠かせないスキルです。
次のステップ: 開発環境の構築 でプログラミング言語の環境セットアップを学びます。