Dockerは、アプリケーションを「イメージ」化し、どこでも一貫した環境で実行できるようにするコンテナ化プラットフォームです。
ここでは、初心者向けに「環境構築」から「実際のデプロイ」まで、スピードアップに役立つ実践Tipsを交えながら解説します。
はじめに
開発環境と本番環境で「動く」「動かない」を決めつける原因は、やはり「環境の差」にあります。
Dockerを使うと、同じイメージを開発・テスト・本番に差し込むだけで環境差を減らせます。
それに、CI/CDのパイプラインに組み込みやすく、デプロイが瞬時に完成。
1. Docker とは?
- コンテナ型仮想化: OSレベルでの軽量仮想化。
- イメージ: アプリとその依存関係をまとめたテンプレート。
- コンテナ: イメージの実行インスタンス。
- Dockerfile: イメージを構築する手順を記述。
2. Docker のインストール
2.1 Windows
- Docker Desktop for Windows をダウンロード。
- インストーラを実行し、WSL2 を有効化(推奨)。
- すべて完了後、
docker --versionで確認。
2.2 macOS
- Docker Desktop for Mac をインストール。
- アプリを起動し、設定を確認。
- ターミナルで
docker --versionを実行。
2.3 Linux (Ubuntu 例)
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo systemctl start dockersudo systemctl enable docker- ユーザーを
dockerグループに追加して、sudoを省略可能。
3. Docker の基本概念
| 用語 | 説明 | 例 |
|---|---|---|
| イメージ | docker build で生成。レイヤーで構成。 |
node:18-alpine |
| コンテナ | docker run で生成。実行環境。 |
node-web-01 |
| レイヤー | 変更箇所ごとに作られる差分。キャッシュで高速化。 | WORKDIR /app など |
| ボリューム | データ永続化。 | /var/lib/data |
| ネットワーク | 複数コンテナ間通信。 | bridge, host |
4. 初めての Dockerfile を作る
以下はシンプルな Node.js アプリの例。
# 1. ベースイメージ
FROM node:18-alpine as base
WORKDIR /usr/src/app
# 2. npm のキャッシュを保存
COPY package*.json ./
RUN npm ci --only=production
# 3. アプリコードをコピー
COPY . .
# 4. ポート公開
EXPOSE 3000
# 5. 実行
CMD ["node", "index.js"]
ビルドと実行
docker build -t my-node-app .
docker run -d -p 3000:3000 --name node-demo my-node-app
5. Docker Compose で複数コンテナを管理
5.1 典型的な docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "80:3000"
volumes:
- .:/usr/src/app
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
5.2 コマンド
docker compose up -d # 起動
docker compose down # 停止
docker compose ps # 状態確認
6. データ永続化のテクニック
| 方法 | メリット | デメリット |
|---|---|---|
| ドライバーボリューム | 永続化、バックアップが容易 | ホストファイルシステムへアクセス不可 |
| Bind Mount | 開発時にホットリロード | 本番では保守性が低い |
| tmpfs | 高速ですが失われる | データ喪失リスク |
例: Web のアプリでログを永続化。
volumes:
- logs:/var/log/app
7. ポートとリンクの仕組み
-p 80:80: ホストの80番ポートをコンテナの80番にマッピング。--linkは古い方法。代わりに Docker ネットワーク を利用。
docker network create appnet
コンテナの起動時に --network appnet を指定。
同じネットワーク内のコンテナはホスト名で通信可能。
8. 画像作成のベストプラクティス
- マルチステージビルド
- ビルド環境と実行環境を分離し、最終イメージを小さくする。
- レイヤーの順序を工夫
- 変更頻度が低いレイヤーを上に配置してキャッシュを活用。
- .dockerignore
- Git の
.gitignoreと同様に不要ファイルを除外。
- Git の
- 適切なベースイメージ
alpineなど軽量イメージを選択し、不要なパッケージを除去。
9. コンテナのデバッグ
docker logs <コンテナ名>docker exec -it <コンテナ名> /bin/shdocker ps -lで最後に起動したものを確認docker inspect <ID>で設定情報を取得
10. CI/CD に Docker を組み込む
10.1 GitHub Actions の例
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}
- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USER }}/myapp:latest
10.2 デプロイ例
- Docker Hub: すぐにプラグインやツールへ利用可能。
- AWS ECS:
AWS CLIでタスク定義を更新。 - Kubernetes:
kubectlでイメージ更新。
11. 本番環境でのデプロイ戦略
| 方法 | 特徴 | 使いどころ |
|---|---|---|
| Docker Compose | 簡易的なデプロイ。 | スタートアップや小規模環境 |
| Docker Swarm | スケールアウトをネイティブにサポート | コスト重視の中規模環境 |
| Kubernetes | フル機能のオーケストレーション | 大規模・マイクロサービス構成 |
11.1 Docker Swarm の簡易デプロイ
docker swarm init
docker stack deploy -c docker-compose.yml mystack
11.2 Kubernetes へのデプロイ例
kubeconfigの準備- Deployment, Service を YAML で定義
kubectl apply -f deployment.yaml
12. パフォーマンスチューニング術
| 項目 | 実装例 | ポイント |
|---|---|---|
| キャッシュの活用 | docker build --build-arg CACHEBUST=$(date +%s) でキャッシュをリセット |
開発時に頻繁にビルドする時 |
| Multi-stage | 既にビルド済みの node_modules を再利用 |
画像サイズ削減 |
| レイヤー順序最適化 | COPY package.json の後に npm ci を走らせる |
変更が少ない部分を先に |
| コンテナリソース制限 | docker run --memory=512m --cpus=1.5 |
ホストリソースを守る |
| イメージのミニマリズム | scratch ベースにする |
ただしアプリがネイティブ拡張なし |
13. セキュリティ対策
- 最小権限
- 必要最低限のユーザーを作成。
- イメージのスキャン
docker scan myimageで脆弱性をチェック。
- 環境変数の暗号化
Docker Secretsで機密情報を管理。
- ネットワークポリシー
--network noneでインターネットアクセスを制限。
14. よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
| Docker は本当に必要? | 開発・本番の「環境差」を一元化し、デプロイを速く安全にします。 |
| イメージのサイズが大きい | マルチステージや Alpline ベースで軽量化。 |
| コンテナが大量に走って消費大 | docker system prune --all で未使用リソースを削除。 |
| Docker コンテナ内の時間がズレる | tzdata をインストールし、タイムゾーンを設定。 |
15. まとめ
- Docker は「環境をコード化」することで開発・デプロイを即座にします。
- ベストプラクティス(マルチステージ、レイヤー順序、
.dockerignore)を押さえると、イメージサイズも高速化も同時に実現。 - CI/CD パイプラインに組み込むことで、自動テストからリリースまで「継続的デリバリー」が可能に。
- 本番環境では用途に合わせて Compose, Swarm, Kubernetes から選択。
これらを実践すれば、環境構築の悩みを大幅に軽減でき、デプロイ作業もスピードアップします。
Docker で開発フローを統一し、品質とリリースサイクルを高めてください。

コメント