Programming Lab / Docker

Docker

Docker は「アプリ+依存関係+設定」を コンテナ という単位にまとめ、 どこでも同じように動かすための仕組みです。環境構築のブレを消し、開発〜本番の流れを速くします。

何に使う?
開発環境の再現 / CI / 配布 / マイクロサービス
何がいい?
環境差分ゼロ / 起動が速い / 手順をコード化
Kubernetesとの関係
Dockerは箱、K8sは箱を大量運用する司令塔

Dockerとは

Docker はアプリケーション実行に必要なものを イメージ にまとめ、 そこから起動する コンテナ として動かします。 仮想マシン(VM)ほど重くなく、OSのカーネルを共有するため起動が速いのが特徴です。

  • 環境を丸ごと共有:依存関係や設定も含めて再現
  • 手順をコード化:Dockerfile / Composeで構築を自動化
  • ローカル〜サーバーまで一貫:同じイメージで動作

Dockerは何に使うの?

ローカル開発環境 CI/CD 検証環境 チーム共有 マイクロサービス

たとえば「Nodeのバージョンが違う」「DBの設定が違う」みたいな事故を、 コンテナを配ることで根本から消せます。

よくある使い方
  • Webアプリ(PHP/Node/Python)+DB(MySQL/PostgreSQL)を Compose で一括起動
  • CIでテスト環境をコンテナで作って毎回クリーンに実行
  • 本番も同じイメージを使い、差分を最小化

Dockerの何がそんなにいいの?

環境差分が減る

「動く人・動かない人」を減らし、再現性が上がる。

起動が速い

VMより軽く、必要なプロセスだけが動く。

手順が残る

Dockerfile/Compose がそのまま設計書になる。

注意:万能ではない
  • GUIアプリやハード連携は工夫が必要
  • データ永続化(Volume)を理解しないと事故る
  • 権限(root)やセキュリティ設計は別途必要

KubernetesとDockerの違い

Docker は「コンテナを作って動かす」ための仕組み。Kubernetes(K8s)は 「コンテナを大量に、安定して、賢く運用する」仕組みです。

項目 Docker Kubernetes
役割 コンテナ作成・実行 コンテナ群の運用・自動化
スケール 手動中心 自動スケール/分散
復旧 手動対応が多い 落ちたら再起動/再配置
対象 個人〜小規模 中〜大規模(クラスタ)

※現在は「Dockerが直接K8sで使われる」というより、K8sは containerd などのランタイムを使う構成が一般的です。

DockerとはNASのことですか?

いいえ、違います。NAS はネットワーク上のストレージ(Network Attached Storage)。 Docker はアプリを動かす “実行環境の箱” です。

混同ポイント
  • NAS上で Docker を動かすことはある(NAS機器にDocker機能が付く場合も)
  • Docker は「保存」ではなく「実行」
  • データは Volume などで永続化する設計が必要

基本用語(最小セット)

Image
実行環境のテンプレ(アプリ+依存+設定)
Container
Imageから起動した実体(プロセス)
Registry
Imageを保管する場所(例:Docker Hub)
Volume
データ永続化(DBなど)
Network
コンテナ間通信の仮想ネット
Compose
複数コンテナをまとめて定義・起動

よく使うコマンド

まずは「見る → 起動 → 入る → 消す」
bash
docker --version
docker images
docker ps
docker ps -a

# 例:nginx を起動(バックグラウンド)
docker run -d --name mynginx -p 8080:80 nginx:latest

# コンテナのログ
docker logs -f mynginx

# コンテナに入る(bashが無い場合は sh)
docker exec -it mynginx /bin/sh

# 停止・削除
docker stop mynginx
docker rm mynginx

# 使ってないイメージ掃除(注意)
docker system prune
開発で便利
  • docker exec -it で中に入って確認
  • -p でポート公開(例:8080:80)
  • DBは基本 Volume で永続化

Dockerfile入門(最小例)

Dockerfile は「この環境をこう作る」というレシピです。 例として、Nodeアプリを動かす最低限のパターン。

Dockerfile
FROM node:20-alpine

WORKDIR /app

# 依存関係を先に入れる(キャッシュが効く)
COPY package*.json ./
RUN npm ci

# アプリ本体
COPY . .

EXPOSE 3000
CMD ["npm", "start"]
bash
# ビルド
docker build -t myapp:dev .

# 起動
docker run --rm -p 3000:3000 myapp:dev

Docker Compose入門(複数コンテナ一括)

Web + DB のような構成は Compose が楽です。起動は docker compose up -d だけ。

yaml
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASS=example
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_DATABASE=appdb
    ports:
      - "3306:3306"
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:
bash
# 起動
docker compose up -d

# ログ
docker compose logs -f

# 停止(コンテナ停止)
docker compose down

# 停止+ボリューム削除(DB消えるので注意)
docker compose down -v

ハマりどころ・コツ

コンテナを消すと中のデータも消えます。DBは必ず Volume を使って永続化します。

package.json など依存関係を先に COPY して RUN するとキャッシュが効きます。

同じポートを別プロセスが使っている可能性。-p 3001:3000 のようにホスト側を変えます。

FAQ

Q. Dockerは何に使うの?
A. 開発環境の再現、CI、検証、配布、本番運用の差分削減に使います。
Q. Dockerの何がいいの?
A. 依存関係込みで環境を配れるので「動かない」を減らし、起動も速いです。
Q. KubernetesとDockerの違いは?
A. Dockerはコンテナを作って動かす。K8sは大量のコンテナ運用(自動復旧/スケール)です。
Q. DockerはNAS?
A. 違います。NASは保存、Dockerは実行。NAS上でDockerを動かすことはあります。