Dockerとは?

Dockerは、アプリケーションを「コンテナ」という単位でパッケージ化し、どこでも同じ環境で実行できるようにするツールです。

なぜDockerを使うのか?

実務でDockerが使われる主な理由は以下の通りです:

  • 環境の統一:「私のPCでは動くのに...」問題を解決
  • 簡単なセットアップ:複雑な環境構築を1コマンドで完了
  • クリーンな環境:プロジェクトごとに独立した環境を作成
  • チーム開発:全員が同じ環境で開発できる

コンテナとは?

コンテナは、アプリケーションとその実行に必要なすべて(ライブラリ、設定ファイルなど)をまとめたパッケージです。軽量で起動が速く、複数のコンテナを同時に実行できます。

💡 コンテナとVMの違い

仮想マシン(VM):ハードウェア全体を仮想化。重くて起動が遅い。

コンテナ:OSレベルで仮想化。軽量で起動が速い。

なぜWindows/Macでも同じものが動くのか?

Dockerコンテナは実はLinux上で動いています

  • Linux:Dockerが直接動く(ネイティブ)
  • Windows/Mac:Docker Desktopが内部で軽量なLinux仮想マシンを起動し、その上でコンテナを実行

つまり、Windows版でもMac版でも、実際にはLinuxコンテナが動いているため、どの環境でも同じように動作するのです。

💡 補足

Docker Desktopを使えば、この仕組みを意識することなく、Windows/MacでもLinuxコンテナを簡単に使えます。これがDockerの便利なところです。

イメージとは?

イメージは、コンテナを作るための「設計図」や「テンプレート」です。イメージからコンテナを何個でも作成できます。

  • イメージ:設計図(読み取り専用)
  • コンテナ:実際に動いているアプリケーション

実際の開発での使い方

実務では、複数のイメージを組み合わせてプロジェクト全体の環境を作ります。例えば:

💡 実例:Webアプリケーションの構成

Node.js + PostgreSQL + Redisの組み合わせ:

  • node:18 - アプリケーションサーバー
  • postgres:15 - メインデータベース
  • redis:7 - セッション管理やキャッシュ

これら3つのコンテナが連携して、1つのWebサービスとして動きます。

💡 実例:Pythonデータ分析環境

Jupyter + PostgreSQL + Nginxの組み合わせ:

  • jupyter/datascience-notebook - データ分析環境
  • postgres:15 - 分析用データベース
  • nginx:latest - リバースプロキシ

チーム全員が同じデータ分析環境で作業できます。

単体で使える便利なイメージ

もちろん、単体で使える便利なイメージもあります:

  • wordpress - WordPressサイトがすぐ起動
  • gitlab/gitlab-ce - GitLabサーバー一式
  • nextcloud - 自分専用クラウドストレージ
  • jenkins - CI/CD環境

これらは複数のサービスが1つのイメージにパッケージされているので、すぐに使い始められます。

Dockerのインストール

DockerをPCにインストールする方法を説明します。

Windows / Macの場合

Docker Desktopをインストールします。これが一番簡単な方法です。

手順:

  1. Docker Desktop公式サイトにアクセス
  2. お使いのOS(Windows または Mac)に合わせてダウンロード
  3. インストーラーを実行
  4. 再起動後、Docker Desktopを起動

⚠️ Windows注意点

Windows 10/11 Home版の場合、WSL 2(Windows Subsystem for Linux 2)が必要です。インストール時に自動で案内されます。

Linuxの場合

Ubuntuでのインストール例:

# 古いバージョンを削除
sudo apt-get remove docker docker-engine docker.io containerd runc

# 必要なパッケージをインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# Dockerの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 > /dev/null

# Dockerをインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# sudoなしで実行できるようにする(オプション)
sudo usermod -aG docker $USER

インストール確認

ターミナルまたはコマンドプロンプトで以下のコマンドを実行:

docker --version

バージョン情報が表示されればインストール成功です。

# 動作確認(Hello Worldを実行)
docker run hello-world

「Hello from Docker!」というメッセージが表示されれば完璧です。

基本的な概念

Dockerfile

Dockerイメージを作るための設計書です。テキストファイルで、どのようにイメージを構築するかを記述します。

# 例:シンプルなNode.jsアプリのDockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]

docker-compose.yml

複数のコンテナをまとめて管理するための設定ファイルです。実務ではこれを使うことが多いです。

# 例:WebアプリとデータベースのCompose設定
version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: password

💡 重要:1つのプロジェクト = 複数のコンテナ

上の例では、2つのコンテナが起動します:

  • webコンテナ:Node.jsアプリケーション
  • dbコンテナ:PostgreSQLデータベース

それぞれ独立したコンテナですが、内部ネットワークで自動的に接続されます。

実際のプロジェクトでは?

より複雑なプロジェクトでは、さらに多くのコンテナを組み合わせます:

# 例:本格的なWebサービスの構成
version: '3.8'
services:
  # フロントエンド(React/Next.js)
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
  
  # バックエンドAPI(Node.js)
  backend:
    build: ./backend
    ports:
      - "4000:4000"
  
  # データベース(PostgreSQL)
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: password
  
  # キャッシュ(Redis)
  redis:
    image: redis:7
  
  # 検索エンジン(Elasticsearch)
  search:
    image: elasticsearch:8.11.0
    environment:
      - discovery.type=single-node

この例では5つのコンテナが連携して動きます。でも、起動は1コマンドだけ:

docker-compose up

これで全部のコンテナが起動し、自動的に接続されます。止める時も:

docker-compose down

このように、複数のコンテナをまとめて管理できるのがdocker-composeの便利なところです。

Docker Hub

Dockerイメージの公開リポジトリです。Node.js、Python、PostgreSQLなど、様々な公式イメージが公開されています。

Docker Hubで必要なイメージを探せます。

ボリューム(Volume)の使い方

ボリュームは、コンテナのデータを永続的に保存するための仕組みです。コンテナは基本的に「使い捨て」なので、削除するとデータも消えてしまいます。ボリュームを使えば、コンテナを削除してもデータを保持できます。

どんな時に使うのか?

実務では主に以下の場面で使います:

💡 必ずボリュームが必要な場面

  • データベース:PostgreSQL、MySQL、MongoDBなどのデータ
  • アップロードファイル:ユーザーがアップロードした画像や文書
  • ログファイル:アプリケーションのログを永続化

基本的な使い方

docker-compose.ymlでボリュームを定義します:

# 例:データベースのデータを永続化
version: '3.8'
services:
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password

volumes:
  postgres_data:  # 名前付きボリューム

これで、コンテナを削除(docker-compose down)しても、postgres_dataボリュームにデータが残ります。

開発時の便利な使い方

開発中は、ローカルのコードをコンテナに同期させることで、コード変更が即座に反映されます:

# 例:Node.js開発環境
version: '3.8'
services:
  app:
    image: node:18
    working_dir: /app
    volumes:
      - ./:/app                        # ローカルのコードを同期
      - node_modules:/app/node_modules # node_modulesは別管理
    command: npm run dev
    ports:
      - "3000:3000"

volumes:
  node_modules:

⚠️ 重要:ボリュームの削除に注意

docker-compose down - ボリュームは保持(通常はこれ)

docker-compose down -v - ボリュームも削除(データが消える!)

実践例:Webアプリケーション全体

version: '3.8'
services:
  web:
    build: .
    volumes:
      - ./src:/app/src               # コード同期(開発用)
      - uploaded_files:/app/uploads  # アップロードファイル保存
    ports:
      - "3000:3000"
  
  db:
    image: postgres:15
    volumes:
      - db_data:/var/lib/postgresql/data  # DBデータ保存
    environment:
      POSTGRES_PASSWORD: password

volumes:
  uploaded_files:
  db_data:

この例では、3つのボリュームを使用:

  • ./src:/app/src - コード変更の即時反映
  • uploaded_files - ユーザーのアップロードファイル保存
  • db_data - データベースのデータ保存

よく使う用語

イメージ(Image)

コンテナを作るためのテンプレート。読み取り専用。

コンテナ(Container)

イメージから作られた、実際に動作する環境。

Dockerfile

イメージを作るための設計書。

docker-compose

複数のコンテナをまとめて管理するツール。

ボリューム(Volume)

データを永続化するための仕組み。コンテナを削除してもデータは残る。

ポート(Port)

コンテナと外部の通信経路。例:3000番ポートでアクセス。