🐡

大学生のためのDockerとKubernetes入門

に公開

はじめに(この記事で学べること)

  • Docker の基本概念と仕組みが分かる
  • Docker を使って簡単なアプリをコンテナ化できる
  • Kubernetes の基本用語と役割が分かる
  • ローカルで Kubernetes にデプロイして動かす流れが分かる
  • 実践でよく使うコマンドのまとめと、よくあるつまずきの対処法

1. Docker ― 「持ち運べる実行環境」

1.1 Dockerとは?(イメージ)

  • アプリとその実行環境(OSの一部、ライブラリ、設定など)をひとまとめにして「コンテナ」として配る技術。
  • どのPC/サーバでも同じように動くので、環境差によるバグが減る。

1.2 重要な用語

  • Image(イメージ): コンテナの設計図(読み取り専用)。
  • Container(コンテナ): イメージを実行した状態。
  • Dockerfile: イメージを作るための手順(ファイル)。
  • Registry(例:Docker Hub): イメージを保存する場所。

1.3 実際の流れ(簡単)

  1. Dockerfile を書く
  2. docker build でイメージを作る
  3. docker run でコンテナとして起動する

1.4 例:簡単な Flask アプリの Dockerfile(実例)

app.pyrequirements.txt がある前提です。

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Docker!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

requirements.txt

Flask==2.2.0

Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]

ビルドと実行

# イメージ作成
docker build -t my-flask:1.0 .

# コンテナ起動(ホストの8080をコンテナの8080に公開)
docker run --rm -p 8080:8080 my-flask:1.0

http://localhost:8080 にアクセスすると "Hello, Docker!" が見えるはずです。


1.5 よく使う Docker コマンド(抜粋)

docker build -t <名前:タグ> .        # Dockerfile からビルド
docker run -it --rm <イメージ>       # 対話型で実行(終了時に削除)
docker run -d -p 8080:80 <イメージ>  # デーモン(バックグラウンド)で実行
docker ps                             # 実行中のコンテナ一覧
docker ps -a                          # 全コンテナ(停止含む)
docker logs <コンテナID>              # コンテナのログを見る
docker stop <コンテナID>              # 停止
docker rm <コンテナID>                # コンテナ削除
docker images                         # ローカルのイメージ一覧
docker rmi <イメージ名>               # イメージ削除

2. Kubernetes ― 「コンテナを大規模に管理する司令塔」

2.1 Kubernetesとは?(イメージ)

  • 複数のサーバ(ノード)上で動く数多くのコンテナ(Pod)を自動で配置・監視・拡張・復旧してくれるシステム。
  • 単一サーバでの Docker が「箱の生成」だとすると、Kubernetes は「その箱をデータセンターに何千個並べて自動管理する仕組み」です。

2.2 重要な用語

  • Cluster(クラスター): 複数ノードの集合体。
  • Node(ノード): 実際にコンテナを動かすサーバ(仮想でも可)。
  • Pod(ポッド): コンテナの最小実行単位(普通は1コンテナだが複数も可)。
  • Deployment(デプロイメント): Pod の作り方・更新方法・レプリカ数を定義するもの。
  • Service(サービス): Pod に安定したアクセス先(ロードバランサーや内部通信の窓口)。
  • Namespace / ConfigMap / Secret / Ingress:環境分離・設定管理・機密管理・外部公開設定 など。

2.3 ローカルで試す方法

  • minikubek3s、あるいは Docker Desktop の Kubernetes 機能 を使うとローカルで練習できます。
    -(例)Docker Desktop を入れたら Kubernetes をオンにして、kubectl で操作できます。

2.4 実践例:先ほどの Flask を Kubernetes にデプロイする

注意:クラスタからイメージを取得できる状態にする必要があります(ローカルの minikube なら eval $(minikube docker-env)minikube image load を使う)。

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-flask
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-flask
  template:
    metadata:
      labels:
        app: my-flask
    spec:
      containers:
      - name: my-flask
        image: my-flask:1.0
        ports:
        - containerPort: 8080

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-flask-svc
spec:
  type: ClusterIP
  selector:
    app: my-flask
  ports:
  - port: 80
    targetPort: 8080

適用

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

動作確認(ローカル)

# Pod を確認
kubectl get pods

# Service を確認
kubectl get svc

# ローカルでアクセスする例(ポートフォワード)
kubectl port-forward svc/my-flask-svc 8080:80
# → ブラウザで http://localhost:8080 を開く

2.5 Kubernetesでの更新・スケーリング(よく使うコマンド)

kubectl get pods
kubectl describe pod <pod名>
kubectl logs <pod名>
kubectl scale deployment my-flask --replicas=5    # スケールアウト
kubectl set image deployment/my-flask my-flask=my-flask:1.1  # ローリングアップデート
kubectl delete -f deployment.yaml                 # 削除

3. よくあるつまずき&対処法

3.1 コンテナが起動しない / CrashLoopBackOff

  • 原因例:アプリのエラー(依存パッケージ不足、ポート未指定、環境変数不足)
  • 対処:kubectl logs <pod> / docker logs <container> でログ確認。kubectl describe pod <pod> でイベント確認。

3.2 イメージが pull できない

  • 原因:プライベートレジストリ・タグミス・イメージ未プッシュ
  • 対処:docker images でローカル確認、クラスタが参照するレジストリにプッシュする(例:Docker Hub, GCR, ECR)。

3.3 ポートにアクセスできない

  • Docker:-p host:container の間違いを確認。
  • Kubernetes:Service の type / targetPort を確認。ローカルなら kubectl port-forward が便利。

4. ワンポイント:ローカルで学ぶときのコツ

  • まずは Dockerfile → docker builddocker run で動かす。
  • 次に minikube / Docker Desktop で同じイメージを Kubernetes にデプロイしてみる。
  • ログ (logs) とイベント (describe) を見る習慣をつけると原因特定が速くなる。
  • 小さな変更をしては kubectl applykubectl logs を繰り返す。学習が早い。

5. 追加:便利なツール・拡張(学習用)

  • docker-compose:複数コンテナ(DB+アプリ等)をローカルでまとめて起動するのに便利。
  • skaffold:ローカル開発 → Kubernetes へのデプロイを自動化するツール(慣れてきたら便利)。

簡単な docker-compose.yml 例:

version: "3"
services:
  web:
    build: .
    ports:
      - "8080:8080"
  redis:
    image: redis:6

6. 練習課題(ステップ形式)

  1. Hello Flask を Docker 化して docker run で動かす(上の例を試す)。
  2. docker-compose を使って Redis と組み合わせて動かしてみる。
  3. minikube / Docker Desktop の K8s を有効化して、Deployment と Service を適用してみる。
  4. Pod のレプリカ数を変えてスケーリングを体験する。
  5. アプリを修正してイメージを更新 → ローリングアップデートしてみる。

7. 参考:よく使うコマンド一覧(まとめ)

Docker(短縮)

  • docker build -t name:tag .
  • docker run -it --rm -p 8080:8080 name:tag
  • docker ps, docker ps -a, docker logs <id>, docker stop <id>, docker rm <id>

Kubernetes(kubectl)

  • kubectl get nodes
  • kubectl get pods
  • kubectl get svc
  • kubectl apply -f <file.yaml>
  • kubectl delete -f <file.yaml>
  • kubectl logs <pod>
  • kubectl describe pod <pod>
  • kubectl scale deployment <name> --replicas=N
  • kubectl port-forward svc/<service> 8080:80

最後に(勉強の進め方)

  • 最初は「手を動かす」ことが一番です。
  • 小さなアプリで Docker → docker-compose → ローカル Kubernetes へステップアップすると理解が深まります。
  • つまづいたらログを見る癖をつけること(logsdescribe が超重要)。

もっと**実践的なチュートリアル(手を動かせる一連のコマンド)や、スライド形式、あるいは講義用スライド(20分)**に整形することもできます。どれを先に作りましょうか?(例:Flaskを最初からKubernetesまでデプロイする手順書、あるいはdocker-compose中心のハンズオン)

Discussion