1. 简介

Minikube 是一个用于本地快速搭建 Kubernetes 单节点集群的工具。它支持多种容器运行时(container runtime),其中最常用的是 Docker。然而,Docker 本身也可以作为运行 Kubernetes 的容器平台,这就可能导致本地和 Minikube 内部使用的是两个不同的 Docker 实例。

本文将围绕 Minikube 的容器运行时、Docker 与 Kubernetes 的关系,以及如何通过 minikube docker-env 命令切换 Docker 上下文进行讲解。文中示例基于 Debian 12 和 Bash 5.2.15 环境测试通过,适用于大多数 POSIX 兼容系统。


2. Minikube 的容器运行时

Minikube 的核心功能是帮助用户快速部署一个单节点的 Kubernetes 集群。它可以通过多种方式部署,包括直接运行在主机上、作为 Docker 容器运行,或通过虚拟机驱动(如 kvm2、qemu 等)运行。

2.1. 直接部署(–driver=none)

在某些场景下,比如你已经在一个虚拟机中运行,可以选择使用 --driver=none 参数直接在主机上启动 Kubernetes:

$ minikube start --driver=none

此时,Minikube 会检测当前系统中可用的容器运行时(如 containerd、cri-o、docker),并自动选择一个使用。如果系统中已安装了 Docker,Minikube 将默认使用它。

⚠️ 注意none 驱动适用于有经验的用户,大多数情况下推荐使用 docker 驱动。

2.2. Docker 驱动部署(–driver=docker)

使用 Docker 驱动时,Minikube 会拉取一个基础镜像并在 Docker 中启动一个容器作为 Kubernetes 节点:

$ minikube start --driver=docker

启动完成后,可以通过 kubectl 查看节点信息,其中 CONTAINER-RUNTIME 字段显示了当前使用的容器运行时版本:

$ kubectl get nodes --output=wide
NAME       STATUS   ROLES           AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready    control-plane   3m35s   v1.28.3   192.168.39.235           Buildroot 2021.02.12   5.10.57          docker://24.0.7

同时,查看本地 Docker 版本:

$ docker --version
Docker version 26.0.0, build 2ae903e

⚠️ 注意:Minikube 内部使用的 Docker 版本(24.0.7)与本地版本(26.0.0)不同,说明两者是独立的环境。

2.3. 虚拟机部署(–driver=kvm2)

如果使用虚拟机驱动(如 kvm2),Minikube 会创建一个虚拟机并在其中部署 Kubernetes:

$ minikube start --driver=kvm2

这种方式下,Minikube 会下载一个 ISO 镜像并在虚拟机中运行 Kubernetes。同样,其内部的 Docker 版本可能与本地不一致。

总结:无论使用哪种方式部署 Minikube,其内部使用的容器运行时都是独立的,可能会与本地 Docker 不兼容。


3. 独立 Docker 与 Kubernetes 中的 Docker

Docker 是容器管理平台,而 Kubernetes 是容器编排系统。通常,我们不建议直接通过本地 Docker 与 Kubernetes Pod 交互,因为两者运行在不同的上下文中。

例如,查看本地 Docker 运行的容器:

$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                             NAMES
f132edec68ad   gcr.io/k8s-minikube/kicbase:v0.0.42   "/usr/local/bin/entr…"   58 seconds ago   Up 57 seconds   127.0.0.1:9009->22/tcp, 127.0.0.1:9008->2376/tcp, ...                                                                            minikube

可以看到只有 Minikube 自身的容器。

而要查看 Kubernetes 内部使用的容器,需要进入 Minikube 容器内执行 Docker 命令:

$ docker exec minikube docker ps

输出将包括所有 Kubernetes Pod 内部的容器,如 CoreDNS、kube-proxy、etcd 等。

⚠️ 问题:由于 Minikube 内部的 Docker 与本地 Docker 环境不同,直接操作会遇到镜像找不到、版本不兼容等问题。


4. Docker Context 与 minikube docker-env

为了解决上述问题,Minikube 提供了 docker-env 命令,用于切换当前 Shell 环境中的 Docker 上下文,使其指向 Minikube 内部的 Docker。

4.1. 查看 docker-env 配置

$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.49.2:2376"
export DOCKER_CERT_PATH="/root/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

这些变量用于配置当前 Shell 使用的 Docker 客户端连接信息。

4.2. 切换 Docker 上下文

执行以下命令即可切换上下文:

$ eval $(minikube -p minikube docker-env)

此时再运行 docker ps,看到的就是 Minikube 内部 Kubernetes 使用的容器列表。

用途:这个功能非常有用,尤其是在我们想要将本地构建的镜像直接用于 Minikube 时,无需推送到远程仓库。


5. 总结

内容 说明
Minikube 支持的部署方式 none(直接部署)、docker(容器部署)、kvm2(虚拟机部署)
容器运行时差异 Minikube 内部使用的 Docker 与本地 Docker 是两个独立实例
推荐操作方式 使用 minikube docker-env 切换上下文,直接操作 Minikube 内部的 Docker
核心命令 minikube docker-enveval $(minikube -p minikube docker-env)
使用场景 构建本地镜像并直接用于 Minikube 测试,避免推送到远程仓库

📌 踩坑提醒:不要试图用本地 Docker 直接操作 Minikube 内部的容器,除非你已经切换了上下文,否则会遇到“找不到镜像”、“连接失败”等问题。


如果你在本地开发中频繁使用 Minikube 和 Docker,熟练掌握 docker-env 的使用可以极大提升效率,避免频繁构建、推送镜像的麻烦。


原始标题:Docker Context and the Minikube docker-env Command