Dockerとは?コンテナ開発を加速する基礎入門

はじめに

1. なぜ今コンテナなのか

近年、マイクロサービスアーキテクチャやクラウドネイティブ開発が主流となり、従来の仮想マシン(VM)では以下のような課題が増えています。

  • 起動時間の遅さ:VM は数十秒〜数分かかることが多く、開発サイクルが遅延しがち。
  • リソースの非効率利用:OS ごと丸ごと隔離するためメモリ・ストレージの無駄が発生。

Docker は OS カーネルをホストと共有しつつ、プロセスを独立した「コンテナ」として隔離します。その結果、数秒以内で起動し、同一ホスト上で大量のコンテナを効率的に動かせるため、開発スピード・テスト自動化・本番移行のすべてで大きな恩恵があります。

2. 本記事の狙い

この記事では、以下を順に学びます。

  1. 基本概念:イメージとコンテナの違い、レイヤードFS のメリット
  2. 環境構築:Windows/Mac 向け Docker Desktop、Linux での Docker Engine 導入
  3. 実践操作:イメージのビルドからコンテナ起動・停止までのコマンドと注意点
  4. Compose 利用:複数コンテナ構成を一括管理する方法と環境別オーバーライド
  5. 運用ベストプラクティス:セキュリティ対策、リソース制限、モニタリング

手を動かしながら学ぶことで、学生エンジニアでも自分の開発環境を完全にコンテナ化し、CI/CD やチーム開発に組み込めるレベルを目指します。

3. 読者の前提スキル

  • ターミナル操作:基本的なコマンド(ls・cd・cat・vim など)
  • バージョン管理:Git でリポジトリのクローン・コミット・プッシュが可能
  • 簡単な開発経験:HTML/CSS/JavaScript や Python/Node.js で Hello World が書けること

Dockerの基本概念

Dockerの基本概念や歴史、メリットデメリットについては、弊サイトのこちらの記事もご参照ください。

1. イメージとコンテナの違い

  • イメージ
  • 実行環境の「設計図」に相当し、OS レイヤーからアプリケーション依存ライブラリまでをスナップショット化。
  • Dockerfile を記述し、バージョン管理可能。
  • コンテナ
  • その設計図(イメージ)を実行した「実体」で、プロセス単位で隔離された環境。
  • 起動時にイメージを読み込み、メモリ・CPU を割り当てて動作。 補足:イメージは使い回し可能で、同じイメージから複数のコンテナを同時起動できるため、水平スケールも容易です。

2. レイヤードファイルシステム

Docker イメージは複数のレイヤーで構成され、各 Dockerfile 命令ごとに新しいレイヤーが積み重なります。

  • キャッシュ再利用:下層レイヤーが変わらなければ再ビルドをスキップし、高速化。
  • 共有ストレージ:異なるイメージ間で同じレイヤーを共有し、ディスク容量を節約。 何を行うか:Dockerfile の書き方を工夫し、インストールやCOPY の順序を最適化すると、CI 環境でのビルド時間を大幅に短縮できます。

3. Docker Hubとプライベートレジストリ

  • Docker Hub
  • 公開イメージの中心的リポジトリで、公式イメージやコミュニティ提供イメージが多数。
  • イメージのタグ付け(バージョン管理)やスター数の確認が可能。
  • プライベートレジストリ
  • 企業内限定でイメージを管理するための仕組み。
  • 認証方式:Basic 認証や OAuth2/JWT 対応が一般的。
  • 運用方法:アクセス制御やスキャン機能(脆弱性検出)を組み込むことで、セキュアに配布できます。 補足:AWS ECR、Azure Container Registry、Google Container Registry などクラウドサービス利用も増えています。

Dockerのインストールとセットアップ

1. Windows/MacでのDocker Desktop導入

  1. 公式サイトからインストーラーをダウンロード。
  2. インストールウィザードに従い、WSL2(Windows)や HyperKit(Mac)のコンポーネントを許可。
  3. 設定画面で CPU・メモリ・ディスクの割り当て量を調整し、ネットワークやプロキシ設定を行う。
  4. GUI ダッシュボードから イメージ一覧コンテナ一覧 を視覚的に管理可能。

何を行うか:初回起動時に「hello-world」を実行し、画面上のログで動作確認と環境情報のチェックをしましょう。

2. Linux環境へのDocker Engine導入

Ubuntu を例に、公式リポジトリを利用して最新版をインストールします。

sudo apt-get update
sudo apt-get install \
  ca-certificates \
  curl \
  gnupg \
  lsb-release

# 公式 GPG キー追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# リポジトリ登録
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" |
  sudo tee /etc/apt/sources.list.d/docker.list

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker

注意点:各ディストリビューションの公式ドキュメントでパッケージ名や手順が異なる場合があるため、必ず最新版を確認してください。

3. 初期設定と権限管理

  • 動作確認
  docker run hello-world

が成功すればインストール完了。

  • 非rootユーザー実行
  sudo usermod -aG docker $USER

を実行後、再ログインすることでdockerコマンドが sudo なしで使えます。

  • CLI 設定
    ~/.docker/config.json に認証情報や CLI プロファイルを保存。docker loginでレジストリへの認証情報を管理します。

Dockerイメージとコンテナの操作

1. イメージのビルド

Dockerfile を作成し、以下を記述します。

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "index.js"]
  • ベースイメージ選定:最小サイズの alpine を利用し、攻撃面とサイズを削減。
  • キャッシュ最適化COPY package*.jsonRUN npm install の順にして、依存関係変更時のみ再ビルド。
  • 環境変数設定ENVで動作モードを指定し、複数環境に対応。

ビルドコマンド:

docker build -t myapp:latest .

ビルドログを確認し、警告やエラーがあれば Dockerfile を修正して再度ビルドしましょう。

2. コンテナの起動・停止

# 起動
docker run -d \
  --name web \
  -p 8080:3000 \
  --restart=unless-stopped \
  myapp:latest

# 状態確認
docker ps -a

# ログ確認
docker logs -f web

# 停止
docker stop web

# 削除
docker rm web
  • --restart=unless-stopped:ホスト再起動時も自動で立ち上がる便利オプション。
  • docker logs -f:リアルタイムでログを追跡し、トラブルシューティングに活用。

3. ボリュームとネットワーク

  • ボリューム
  docker run -d \
    -v ~/data:/app/data \
    myapp:latest

ホストの ~/data とコンテナ内の /app/data をマウントし、データ永続化。

  • ネットワーク
  docker network create mynet
  docker run --network mynet ...

独自ネットワークを作成して、コンテナ間通信を分離・制御

補足:Docker Compose と組み合わせると、ネットワーク定義も YAML で一元管理できます。


Docker Composeによるマルチコンテナ環境

1. docker-compose.ymlの基本構造

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: production
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

networks:
  default:
    driver: bridge
  • services:複数コンテナをまとめて定義
  • depends_on:起動順序を保証
  • volumes/networks:永続化とネットワークを YAML 内で宣言

起動コマンド:

docker-compose up -d

複数インスタンススケールは

docker-compose up --scale app=3

で実現できます。

2. オーバーライドと環境別設定

  • docker-compose.override.yml に開発用のボリュームマウントやデバッグポートを記述。
  • 本番用は別ファイル(例:docker-compose.prod.yml)を用意し、-f オプションで切り替え。
  docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

何を行うか:同一定義から複数環境を管理し、設定漏れや重複を防ぎます。


Dockerセキュリティとベストプラクティス

1. 最小権限の原則

  • 軽量ベースイメージ:Alpine や Scratch を選択し、不要パッケージをカット。
  • 非root実行USER node などで一般ユーザーに切り替え、コンテナ侵害リスクを減少。

2. イメージスキャンと署名

  • 脆弱性スキャン:Trivy や Clair を CI に組み込み、自動でレポート生成・しきい値超過でビルド停止。
  • 署名:Notary や Cosign でイメージにデジタル署名し、改ざん検知を行う。

3. リソース制限と監視

  • docker run 時に
  --memory 512m --cpus 1.0

でコンテナごとにリソース上限を設定。

  • モニタリング:Prometheus+cAdvisor でメトリクス収集、Grafana で可視化。
    アラートルールを設定し、異常状況を通知します。

まとめ

本記事では以下を実践的に解説しました:

  1. Dockerの基本概念(イメージ/コンテナ、レイヤー)
  2. インストール初期設定
  3. イメージビルドコンテナ操作の詳細手順
  4. Composeを使ったマルチコンテナ構成と環境別管理
  5. セキュリティおよび運用管理のベストプラクティス

まずはローカルで hello-world やサンプルWebアプリをコンテナ化し、手を動かして理解を深めましょう。
次に Docker Compose で複数サービスを連携させ、最終的にプライベートレジストリCI/CD と統合することで、本番環境運用に耐えるコンテナ基盤を構築できます。


参考URL

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com