生成AI研修
Part 2: 開発ツール基礎

Chapter 13: Docker 入門

コンテナ技術の基礎と Docker の使い方

Chapter 13: Docker 入門

13.1 コンテナ技術とは

「自分のPCでは動くのに、本番サーバーでは動かない」

ソフトウェア開発でよく起きるこの問題を解決するのがコンテナ技術です。Dockerを使うと、アプリケーションとその動作に必要なすべての環境をひとまとめにパッケージ化できます。

仮想マシンとの違い

コンテナ以前は「仮想マシン(VM)」を使って環境の問題を解決していました。

比較項目仮想マシンDocker コンテナ
起動時間数分数秒
サイズGB 単位MB 単位
OSゲストOSが必要ホストOSを共有
隔離レベル完全に隔離プロセスレベルで隔離
リソース消費多い少ない

コンテナはOSを丸ごと持たずにホストOSのカーネルを共有するため、軽量で高速です。

Docker の主なメリット

  1. 環境の統一: 「自分のPCでは動く」問題がなくなる
  2. 素早いセットアップ: 新しい開発者が参加したとき、1コマンドで環境構築完了
  3. 本番環境との一致: 開発・ステージング・本番で同じ環境を使える
  4. 依存関係の分離: Node.jsの異なるバージョンが必要なプロジェクトを同じPCで動かせる

13.2 Docker のインストール

Docker Desktop のインストール

docs.docker.com から Docker Desktop をダウンロードします。

  • macOS: Apple Silicon / Intel 両対応のインストーラあり
  • Windows: WSL2 が必要(自動でインストールを促してくれる)
  • Linux: aptyum でインストール可能

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...      910MB

13.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 <コンテナ> bash

13.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
*.log

13.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 ps

13.7 実践: 開発環境をコンテナ化する

Node.js のシンプルなWebアプリをDockerで動かしてみましょう。

ディレクトリ構成

my-app/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── package.json
└── server.js

server.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 コンテナからのWebページ表示 出典: 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 -dComposeで起動
docker compose downComposeで停止
docker logs <id>ログを確認

Dockerを使いこなすと、どんな環境でもアプリを確実に動かせるようになります。現代のソフトウェア開発では欠かせないスキルです。

次のステップ: 開発環境の構築 でプログラミング言語の環境セットアップを学びます。

On this page