1. 概述

本文将介绍如何在 Kubernetes 中部署 Docker 容器,并演示如何使用本地构建的 Docker 镜像。我们将使用 Minikube 来运行一个本地 Kubernetes 集群。

2. Dockerfile

要构建本地 Docker 镜像,首先需要一个 Dockerfile。为了简化演示,我们创建一个简单的 Dockerfile,其中只包含一个 echo 命令用于打印信息:

FROM alpine 

CMD ["echo", "Hello World"]

这个文件非常基础,仅用于演示后续的 Minikube 操作。

3. docker-env 命令

第一种方式是使用 minikube docker-env 命令,将本地 Docker CLI 连接到 Minikube 内置的 Docker Engine。

✅ 步骤如下:

  1. 确保 Docker CLI 已安装:

    $ docker version
    

    输出应类似如下(显示客户端和服务端信息):

    Client: Docker Engine - Community
     Version:           19.03.12
     ...
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.12
      ...
    
  2. 获取连接 Minikube Docker 的环境变量:

    $ minikube docker-env
    

    输出类似:

    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://172.22.238.61:2376"
    export DOCKER_CERT_PATH="/home/user/.minikube/certs"
    export MINIKUBE_ACTIVE_DOCKERD="minikube"
    
  3. 执行命令连接 Minikube 的 Docker 引擎:

    $ eval $(minikube -p minikube docker-env)
    
  4. 查看 Minikube 中已有的镜像:

    $ minikube image ls --format table
    

    输出示例:

    |-----------------------------------------|---------|---------------|--------|
    |                  Image                  |   Tag   |   Image ID    |  Size  |
    |-----------------------------------------|---------|---------------|--------|
    | docker.io/kubernetesui/dashboard        | <none>  | 1042d9e0d8fcc | 246MB  |
    | docker.io/kubernetesui/metrics-scraper  | <none>  | 115053965e86b | 43.8MB |
    | k8s.gcr.io/etcd                         | 3.5.3-0 | aebe758cef4cd | 299MB  |
    | ...                                     | ...     | ...           | ...    |
    |-----------------------------------------|---------|---------------|--------|
    
  5. 使用本地的 Dockerfile 构建镜像:

    $ docker build -t first-image -f ./Dockerfile .
    
  6. 创建 Pod 并使用该镜像:

    $ kubectl run first-container --image=first-image --image-pull-policy=Never --restart=Never
    
  7. 查看日志确认运行结果:

    $ kubectl logs first-container
    

    输出应为:

    Hello World
    

提示: 完成后建议关闭终端,避免 Docker CLI 仍连接到 Minikube 的 Docker 引擎。

4. Minikube Image Load 命令

第二种方法是先在本地构建镜像,然后使用 minikube image load 命令将其加载到 Minikube。

✅ 步骤如下:

  1. 在本地构建镜像:

    $ docker build -t second-image -f ./Dockerfile .
    
  2. 将镜像加载到 Minikube:

    $ minikube image load second-image
    
  3. 确认镜像是否加载成功:

    $ minikube image ls --format table
    
  4. 创建 Pod 并运行该镜像:

    $ kubectl run second-container --image=second-image --image-pull-policy=Never --restart=Never
    
  5. 查看日志确认输出:

    $ kubectl logs second-container
    

    输出应为:

    Hello World
    

5. Minikube Image Build 命令

第三种方法更直接:使用 minikube image build 直接在 Minikube 中构建镜像。

✅ 步骤如下:

  1. 使用 Minikube 构建镜像:

    $ minikube image build -t third-image -f ./Dockerfile .
    
  2. 创建 Pod 并运行该镜像:

    $ kubectl run third-container --image=third-image --image-pull-policy=Never --restart=Never
    
  3. 查看日志确认输出:

    $ kubectl logs third-container
    

    输出应为:

    Hello World
    

⚠️ 注意: minikube image build 实际上是将本地文件复制到 Minikube 虚拟机中并调用 Docker 构建,因此构建过程可能略慢于本地。

6. 总结

本文介绍了三种在 Minikube 中使用本地 Docker 镜像的方式:

方法 描述 适用场景
docker-env 将本地 Docker CLI 指向 Minikube 的 Docker Engine 更灵活,适合熟悉 Docker CLI 的开发者
image load 本地构建镜像后加载到 Minikube 简单直接,适合已有本地镜像
image build 直接在 Minikube 中构建镜像 无需本地 Docker,适合 CI/CD 场景

建议: 如果你已经习惯使用 Docker CLI,推荐使用 docker-env;如果你希望避免本地依赖,可使用 minikube image build


如需进一步了解 Minikube 的镜像管理,可参考其官方文档:Minikube Image Commands


原始标题:Using Local Docker Images With Minikube