🐡
大学生のためのDockerとKubernetes入門
はじめに(この記事で学べること)
- Docker の基本概念と仕組みが分かる
- Docker を使って簡単なアプリをコンテナ化できる
- Kubernetes の基本用語と役割が分かる
- ローカルで Kubernetes にデプロイして動かす流れが分かる
- 実践でよく使うコマンドのまとめと、よくあるつまずきの対処法
1. Docker ― 「持ち運べる実行環境」
1.1 Dockerとは?(イメージ)
- アプリとその実行環境(OSの一部、ライブラリ、設定など)をひとまとめにして「コンテナ」として配る技術。
- どのPC/サーバでも同じように動くので、環境差によるバグが減る。
1.2 重要な用語
- Image(イメージ): コンテナの設計図(読み取り専用)。
- Container(コンテナ): イメージを実行した状態。
- Dockerfile: イメージを作るための手順(ファイル)。
- Registry(例:Docker Hub): イメージを保存する場所。
1.3 実際の流れ(簡単)
- Dockerfile を書く
-
docker build
でイメージを作る -
docker run
でコンテナとして起動する
1.4 例:簡単な Flask アプリの Dockerfile(実例)
app.py
と requirements.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 ローカルで試す方法
-
minikube
、k3s
、あるいは 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 build
→docker run
で動かす。 - 次に minikube / Docker Desktop で同じイメージを Kubernetes にデプロイしてみる。
- ログ (
logs
) とイベント (describe
) を見る習慣をつけると原因特定が速くなる。 - 小さな変更をしては
kubectl apply
→kubectl logs
を繰り返す。学習が早い。
5. 追加:便利なツール・拡張(学習用)
-
docker-compose
:複数コンテナ(DB+アプリ等)をローカルでまとめて起動するのに便利。 -
skaffold
:ローカル開発 → Kubernetes へのデプロイを自動化するツール(慣れてきたら便利)。
簡単な docker-compose.yml
例:
version: "3"
services:
web:
build: .
ports:
- "8080:8080"
redis:
image: redis:6
6. 練習課題(ステップ形式)
-
Hello Flask を Docker 化して
docker run
で動かす(上の例を試す)。 - docker-compose を使って Redis と組み合わせて動かしてみる。
- minikube / Docker Desktop の K8s を有効化して、Deployment と Service を適用してみる。
- Pod のレプリカ数を変えてスケーリングを体験する。
- アプリを修正してイメージを更新 → ローリングアップデートしてみる。
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 へステップアップすると理解が深まります。
- つまづいたらログを見る癖をつけること(
logs
とdescribe
が超重要)。
もっと**実践的なチュートリアル(手を動かせる一連のコマンド)や、スライド形式、あるいは講義用スライド(20分)**に整形することもできます。どれを先に作りましょうか?(例:Flaskを最初からKubernetesまでデプロイする手順書、あるいはdocker-compose中心のハンズオン)
Discussion