初心者でもわかる!Docker 使い方徹底解説:環境構築からデプロイまでスピードアップ術+実践Tips

実務レシピ

Dockerは、アプリケーションを「イメージ」化し、どこでも一貫した環境で実行できるようにするコンテナ化プラットフォームです。
ここでは、初心者向けに「環境構築」から「実際のデプロイ」まで、スピードアップに役立つ実践Tipsを交えながら解説します。


はじめに

開発環境と本番環境で「動く」「動かない」を決めつける原因は、やはり「環境の差」にあります。
Dockerを使うと、同じイメージを開発・テスト・本番に差し込むだけで環境差を減らせます。
それに、CI/CDのパイプラインに組み込みやすく、デプロイが瞬時に完成。


1. Docker とは?

  • コンテナ型仮想化: OSレベルでの軽量仮想化。
  • イメージ: アプリとその依存関係をまとめたテンプレート。
  • コンテナ: イメージの実行インスタンス。
  • Dockerfile: イメージを構築する手順を記述。

2. Docker のインストール

2.1 Windows

  1. Docker Desktop for Windows をダウンロード。
  2. インストーラを実行し、WSL2 を有効化(推奨)。
  3. すべて完了後、docker --version で確認。

2.2 macOS

  1. Docker Desktop for Mac をインストール。
  2. アプリを起動し、設定を確認。
  3. ターミナルで 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 docker
  • sudo 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. 画像作成のベストプラクティス

  1. マルチステージビルド
    • ビルド環境と実行環境を分離し、最終イメージを小さくする。
  2. レイヤーの順序を工夫
    • 変更頻度が低いレイヤーを上に配置してキャッシュを活用。
  3. .dockerignore
    • Git の .gitignore と同様に不要ファイルを除外。
  4. 適切なベースイメージ
    • alpine など軽量イメージを選択し、不要なパッケージを除去。

9. コンテナのデバッグ

  • docker logs <コンテナ名>
  • docker exec -it <コンテナ名> /bin/sh
  • docker 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 へのデプロイ例

  1. kubeconfig の準備
  2. Deployment, Service を YAML で定義
  3. 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. セキュリティ対策

  1. 最小権限
    • 必要最低限のユーザーを作成。
  2. イメージのスキャン
    • docker scan myimage で脆弱性をチェック。
  3. 環境変数の暗号化
    • Docker Secrets で機密情報を管理。
  4. ネットワークポリシー
    • --network none でインターネットアクセスを制限。

14. よくある質問(FAQ)

質問 回答
Docker は本当に必要? 開発・本番の「環境差」を一元化し、デプロイを速く安全にします。
イメージのサイズが大きい マルチステージや Alpline ベースで軽量化。
コンテナが大量に走って消費大 docker system prune --all で未使用リソースを削除。
Docker コンテナ内の時間がズレる tzdata をインストールし、タイムゾーンを設定。

15. まとめ

  • Docker は「環境をコード化」することで開発・デプロイを即座にします。
  • ベストプラクティス(マルチステージ、レイヤー順序、.dockerignore)を押さえると、イメージサイズも高速化も同時に実現。
  • CI/CD パイプラインに組み込むことで、自動テストからリリースまで「継続的デリバリー」が可能に。
  • 本番環境では用途に合わせて Compose, Swarm, Kubernetes から選択。

これらを実践すれば、環境構築の悩みを大幅に軽減でき、デプロイ作業もスピードアップします。
Docker で開発フローを統一し、品質とリリースサイクルを高めてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント