DockerからKubernetesへ進む最初の一歩|minikubeとkindで学ぶコンテナオーケストレーション入門

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > DockerからKubernetesへ進む最初の一歩|minikubeとkindで学ぶコンテナオーケストレーション入門
「docker runは使えるけど、コンテナが増えてきたらどうやって管理すればいい?」
DockerでWebアプリを動かせるようになると、次の壁として現れるのがコンテナ数の増加です。コンテナが3つ、5つ、10と増えてくると、手作業での起動・停止・再起動は現実的ではなくなります。

そこで登場するのがKubernetes(クバネティス)です。Kubernetesはコンテナを自動で管理・スケールさせる「コンテナオーケストレーター」で、現在の本番インフラの標準となっています。

この記事では、手元のPCでKubernetesを動かせる minikubekind を使い、インストールからPod・Deployment・Serviceの作成まで実際のコマンド出力を交えて解説します。

動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(minikube v1.33.1・kind v0.23.0・kubectl v1.30.2)

この記事のポイント

・minikube start 1コマンドでKubernetesクラスターが手元のPCで起動できる
・kubectl apply でPodやDeploymentをYAMLファイルから作成・管理できる
・kindはDockerだけで動く軽量クラスターでCI環境のテストに適している
・minikubeとkindの違いを理解して用途に合わせて使い分けられる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜKubernetesが必要になるのか

Dockerが普及した現場では、次のような課題がよく起きます。

コンテナが落ちても自動で再起動しない:docker runは起動しっぱなしで障害時の対処は手動
複数台サーバーへの配置が手作業:サーバーが増えるほど同じコマンドを何度も叩く必要がある
トラフィックの分散ができない:単一コンテナではアクセス集中時にスケールできない
デプロイのたびにダウンタイムが発生:コンテナを止めて新しいものを起動する間、サービスが止まる

Kubernetesはこれらをすべて自動で解決します。「何台のコンテナを常に動かすか」「落ちたら自動で再起動するか」「新しいバージョンに無停止で切り替えるか」をYAMLファイルに宣言するだけです。

Kubernetesの主要概念(Dockerとの対比)

Pod:Kubernetesの最小実行単位。1つ以上のコンテナをまとめたもの(Dockerのコンテナに相当)
Deployment:Podの数・バージョン管理をする。「nginxを3台常に動かす」と宣言できる
Service:Podへのネットワーク経路を定義する。ロードバランサーの役割を担う
Node:Podが実行される実体(仮想マシンや物理サーバー)
Cluster:複数のNodeの集合体

学習段階では「本番クラスター」を用意する必要はありません。手元のPCで動作するminikubeやkindを使えば、コストゼロでKubernetesを実験できます。

minikubeで手元のPCにKubernetesを構築する

minikubeはKubernetes公式がメンテナンスする学習用クラスター構築ツールです。DriverにDockerを指定すれば、既存のDocker環境にそのままクラスターを追加できます。

【注意】minikubeは開発・学習専用のツールです。本番環境では使用しないでください。本番環境ではEKS(AWS)・GKE(GCP)・AKS(Azure)などマネージドKubernetesを使用するのが鉄則です。また、minikubeは起動中にホストの2GB以上のRAMを消費するため、作業終了後は必ず minikube stop を実行して停止してください。

1. minikubeをインストールする

Rocky Linux 9 / Ubuntu 24.04 それぞれのインストール手順です。kubectlも合わせて導入します。

Rocky Linux 9 の場合

# minikubeバイナリをダウンロードしてインストール $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube # kubectlをインストール $ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ sudo install kubectl /usr/local/bin/kubectl # バージョン確認 $ minikube version minikube version: v1.33.1 commit: 5883c09216182566a63dff4c326a6fc9ed2982ff $ kubectl version --client Client Version: v1.30.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

Ubuntu 24.04 の場合

# minikubeはRocky Linuxと同じコマンドでインストール可能 $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube # kubectlはaptでインストール(Ubuntu推奨) $ sudo apt-get update $ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg $ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg $ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update && sudo apt-get install -y kubectl $ kubectl version --client Client Version: v1.30.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

2. minikubeクラスターを起動する

DockerをDriverに指定してクラスターを起動します。初回は必要なコンテナイメージを自動でダウンロードします。

# Dockerドライバーでクラスター起動(rootlessユーザーで実行) $ minikube start --driver=docker * minikube v1.33.1 on Rocky 9.4 (amd64) * Using the docker driver based on user configuration * Starting "minikube" primary control-plane node in "minikube" cluster * Pulling base image v0.0.44 ... * Downloading Kubernetes v1.30.0 preload ... > preloaded-images-k8s-v18-v1...: 342.90 MiB / 342.90 MiB 100.00% 15.34 M * Creating docker container (CPUs=2, Memory=2200MB) ... * Preparing Kubernetes v1.30.0 on Docker 26.1.1 ... - Generating certs and keys ... - Booting up control plane ... - Configuring RBAC rules ... * Verifying Kubernetes components... * Enabled addons: default-storageclass, storage-provisioner * Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

3. kubectlでクラスターの状態を確認する

# ノードの状態を確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane 68s v1.30.0 # クラスターの接続情報を確認 $ kubectl cluster-info Kubernetes control plane is running at https://192.168.49.2:8443 CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy # 全Namespaceのシステムコンポーネントを確認 $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7db6d8ff4d-x7r2t 1/1 Running 0 2m10s etcd-minikube 1/1 Running 0 2m15s kube-apiserver-minikube 1/1 Running 0 2m15s kube-controller-manager-minikube 1/1 Running 0 2m15s kube-proxy-4fmrk 1/1 Running 0 2m10s kube-scheduler-minikube 1/1 Running 0 2m15s storage-provisioner 1/1 Running 0 2m13s

STATUS がすべて Running になっていれば、クラスターは正常に動作しています。

KubernetesにはクラスターのDNSを担当するCoreDNSが組み込まれています。Linux DNS 設定の基本を理解しておくと、Pod間通信やServiceの名前解決の仕組みが読み解けるようになります。

kindで軽量クラスターを構築する(Docker-in-Docker方式)

kindはDockerコンテナをNodeとして使う軽量Kubernetesクラスターです。minikubeよりも起動が速く、マルチノード構成をYAMLで定義できるためCIパイプラインの自動テストに向いています。

1. kindをインストールする

# kindバイナリをダウンロード(amd64) $ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64 $ sudo install kind /usr/local/bin/kind # バージョン確認 $ kind version kind v0.23.0 go1.21.10 linux/amd64

2. kindでシングルノードクラスターを起動する

# クラスター作成(クラスター名はデフォルトで "kind") $ kind create cluster Creating cluster "kind" ... * Ensuring node image (kindest/node:v1.30.0) ... * Preparing nodes ... * Writing configuration ... * Starting control-plane ... * Installing CNI ... * Installing StorageClass ... Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind # kubectlのコンテキストが自動で切り替わる $ kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready control-plane 60s v1.30.0

3. kindでマルチノードクラスターを定義する(応用)

# kind-config.yaml を作成する $ cat kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker # 設定ファイルからクラスターを起動 $ kind create cluster --config kind-config.yaml --name multi-node # ノード構成を確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION multi-node-control-plane Ready control-plane 90s v1.30.0 multi-node-worker Ready worker 75s v1.30.0 multi-node-worker2 Ready worker 75s v1.30.0

はじめてのPod・Deployment・Service作成

クラスターが起動したら、実際にアプリケーションをデプロイしてみましょう。ここではminikubeのコンテキストで操作します。

1. kubectl runでPodを直接作成する

# nginxのPodを作成 $ kubectl run nginx-pod --image=nginx:1.27 --port=80 pod/nginx-pod created # PodのSTATUSがRunningになるまで確認 $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 30s # Podの詳細情報を確認 $ kubectl describe pod nginx-pod | head -12 Name: nginx-pod Namespace: default Priority: 0 Service Account: default Node: minikube/192.168.49.2 Start Time: Tue, 22 Jul 2026 09:00:00 +0900 Labels: run=nginx-pod Status: Running IP: 10.244.0.4

Podに割り当てられたIPアドレス(ここでは 10.244.0.4)はクラスター内部のIPです。外部から直接アクセスするにはServiceが必要です。

2. DeploymentでレプリカとローリングUpdateを管理する

本番では kubectl run ではなく Deployment を使います。Deploymentはレプリカ数の維持と無停止でのバージョンアップを自動で行います。

# nginx Deploymentを3レプリカで作成 $ kubectl create deployment nginx-deploy --image=nginx:1.27 --replicas=3 deployment.apps/nginx-deploy created # Deployment・ReplicaSet・Podの状態を一括確認 $ kubectl get deployment,replicaset,pods NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deploy 3/3 3 3 45s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deploy-7c4b8d9f56 3 3 3 45s NAME READY STATUS RESTARTS AGE pod/nginx-deploy-7c4b8d9f56-4xkqp 1/1 Running 0 45s pod/nginx-deploy-7c4b8d9f56-8jvnm 1/1 Running 0 45s pod/nginx-deploy-7c4b8d9f56-rqwlc 1/1 Running 0 45s # nginx 1.27 から 1.28 へローリングアップデート $ kubectl set image deployment/nginx-deploy nginx=nginx:1.28 deployment.apps/nginx-deploy image updated # アップデートの進捗を確認 $ kubectl rollout status deployment/nginx-deploy Waiting for deployment "nginx-deploy" to finish: 1 out of 3 new replicas have been updated... Waiting for deployment "nginx-deploy" to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "nginx-deploy" to finish: 1 old replicas are pending termination... deployment "nginx-deploy" successfully rolled out

3. Serviceでアプリをポート公開する

NodePort型のServiceを作成すると、クラスター外(自分のPC)からnginxにアクセスできます。

# Deploymentに対してNodePort型のServiceを作成 $ kubectl expose deployment nginx-deploy --type=NodePort --port=80 service/nginx-deploy exposed # ServiceとNodePortを確認 $ kubectl get service nginx-deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-deploy NodePort 10.96.120.201 80:31245/TCP 20s # minikubeのIPを確認 $ minikube ip 192.168.49.2 # curlでnginxのレスポンスを確認 $ curl http://192.168.49.2:31245 -s | head -5 Welcome to nginx!

ポート 31245 のような NodePort の番号はKubernetesが自動で割り当てます。Linux ポート確認の全コマンドで紹介しているssコマンドと組み合わせると、ホスト側でどのポートが実際に使われているか確認できます。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したminikubeとkindによるKubernetesクラスター構築を、さらに深く学べる講座を用意しています。
Dockerマスター講座の詳細はこちら

minikubeとkindの使い分けガイド

2つのツールはどちらも手元のPCでKubernetesを動かせますが、得意な場面が異なります。
観点 minikube kind
起動速度 やや遅い(VM相当の初期化あり) 速い(Dockerコンテナのみ)
マルチノード オプション指定で可能 YAMLで簡単に定義できる
ダッシュボード minikube dashboard コマンド1つで起動 別途インストールが必要
CI組み込み やや複雑 GitHub Actionsとの親和性が高い
向いている用途 個人学習・機能試作・アドオン実験 CIパイプライン・マルチノードテスト
開発フローとしては「minikubeで機能を試作 → kindでCIパイプラインのテストを自動化 → 本番はEKS/GKEなどマネージドKubernetes」が定石です。

トラブルシュート|よくあるエラーと対処法

1. 「Exiting due to DRV_NOT_DETECTED: Found docker, but the docker service is not active」

Dockerデーモンが起動していない場合に発生します。

# Dockerサービスの状態を確認 $ sudo systemctl status docker * docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service) Active: inactive (dead) # Dockerを起動する $ sudo systemctl start docker # 次回起動時にも自動起動するよう設定 $ sudo systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service

2. 「The connection to the server localhost:8080 was refused」

kubectlがクラスターに接続できていない状態です。minikube start後に自動設定される ~/.kube/config が未設定のケースで発生します。

# 現在のkubectlコンテキストを確認 $ kubectl config current-context error: current-context is not set # minikubeのコンテキストを手動で設定 $ kubectl config use-context minikube Switched to context "minikube". # 再度確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane 5m v1.30.0

3. 「insufficient memory」でminikube startが失敗する

デフォルトのメモリ要件(2200MB)が不足している場合に発生します。

# 割り当てメモリを減らして起動する(最低1800MBが目安) $ minikube start --driver=docker --memory=1800 # または既存クラスターを削除して再作成 $ minikube delete * Deleting "minikube" in docker ... * Removing /home/user/.minikube/machines/minikube ... * Removed all traces of the "minikube" cluster. $ minikube start --driver=docker --memory=1800

本記事のまとめ

この記事で解説したminikubeとkindによるKubernetes入門の手順をまとめます。
やりたいこと コマンド
minikubeクラスターをDockerドライバーで起動する minikube start --driver=docker
ノードの状態を確認する kubectl get nodes
Podを直接作成する kubectl run nginx-pod --image=nginx:1.27 --port=80
Deploymentを3レプリカで作成する kubectl create deployment nginx-deploy --image=nginx:1.27 --replicas=3
コンテナイメージをローリングアップデートする kubectl set image deployment/nginx-deploy nginx=nginx:1.28
DeploymentをNodePortで外部公開する kubectl expose deployment nginx-deploy --type=NodePort --port=80
kindクラスターを作成する kind create cluster
minikubeクラスターを停止する minikube stop
DockerでコンテナをひとつずつRunしていた段階から、Kubernetesで宣言的に複数コンテナを管理する段階へのステップは、最初は概念が多く感じられるかもしれません。
まずはminikubeで手元のPCにクラスターを作り、kubectl get pods と kubectl describe を繰り返すことで感覚がつかめてきます。
Ubuntu 26.04 LTS の概要も合わせて確認しておくと、最新のUbuntu環境でのKubernetesセットアップの最新情報が得られます。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したminikubeとkindによるKubernetesクラスター構築を、さらに深く学べる講座を用意しています。
Dockerマスター講座の詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。