1. 概述

在这个教程中,我们将部署Docker容器到Kubernetes,并学习如何在本地使用这些容器。我们将使用Minikube来运行Kubernetes集群。

*2. Dockerfile

首先,我们需要一个Dockerfile,以便能够创建本地Docker镜像。这应该很简单,因为我们主要关注的是Minikube命令。

让我们创建一个仅包含echo命令并打印消息的Dockerfile

FROM alpine 

CMD ["echo", "Hello World"]

3. docker-env 命令

对于第一种方法,我们需要确保已经安装了Docker CLI这是一个用于管理Docker资源(如镜像和容器)的工具。

默认情况下,它使用我们机器上的Docker引擎,但我们可以轻松更改。我们将使用这个工具,并将Docker CLI指向Minikube内的Docker引擎。

让我们检查这个前提条件,看看Docker CLI是否正常工作:

$ docker version

输出应该类似于以下内容:

Client: Docker Engine - Community
 Version:           19.03.12
 ...

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  ...

接下来,我们继续进行下一步。我们可以配置这个CLI,使其使用Minikube内部的Docker引擎。这样,我们就可以列出Minikube中可用的镜像,甚至可以在其中构建镜像。

让我们查看所需的步骤,以配置Docker CLI:

$ minikube docker-env

这里可以看到命令列表:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.22.238.61:2376"
export DOCKER_CERT_PATH="C:\Users\Baeldung\.minikube\certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

让我们执行最后一行的命令,因为它将为我们完成配置:

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

现在,我们可以使用Docker CLI来调查Minikube内的Docker环境。

让我们使用minikube image ls命令列出可用的镜像:

$ 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  |
| k8s.gcr.io/pause                        | 3.7     | 221177c6082a8 | 711kB  |
| k8s.gcr.io/coredns/coredns              | v1.8.6  | a4ca41631cc7a | 46.8MB |
| k8s.gcr.io/kube-controller-manager      | v1.24.3 | 586c112956dfc | 119MB  |
| k8s.gcr.io/kube-scheduler               | v1.24.3 | 3a5aa3a515f5d | 51MB   |
| k8s.gcr.io/kube-proxy                   | v1.24.3 | 2ae1ba6417cbc | 110MB  |
| k8s.gcr.io/pause                        | 3.6     | 6270bb605e12e | 683kB  |
| gcr.io/k8s-minikube/storage-provisioner | v5      | 6e38f40d628db | 31.5MB |
| k8s.gcr.io/echoserver                   | 1.4     | a90209bb39e3d | 140MB  |
| k8s.gcr.io/kube-apiserver               | v1.24.3 | d521dd763e2e3 | 130MB  |
|-----------------------------------------|---------|---------------|--------|

如果与docker image ls命令的输出进行比较,我们会看到两者显示相同的列表。这意味着我们的Docker CLI已正确配置。

接下来,我们使用Dockerfile构建镜像

$ docker build -t first-image -f ./Dockerfile .

现在,它已经在Minikube中可用,我们可以创建一个使用此镜像的Pod:

$ kubectl run first-container --image=first-image --image-pull-policy=Never --restart=Never

让我们检查这个Pod的日志:

$ kubectl logs first-container

我们可以看到预期的“Hello World”消息。一切正常。为了在下一个示例中确保Docker CLI不连接到Minikube,请关闭终端。

4. Minikube Image Load 命令

现在,让我们看看另一种使用本地镜像的方法。这次,我们将在机器上使用Minikube之外构建Docker镜像,然后将其加载到Minikube中。让我们构建镜像:

$ docker build -t second-image -f ./Dockerfile .

现在镜像已经存在,但还没有在Minikube中。让我们加载它

$ minikube image load second-image

让我们列出镜像并检查是否已加载:

$ minikube image ls --format table

我们可以在列表中看到新的镜像。这意味着我们可以创建Pod:

$ kubectl run second-container --image=second-image --image-pull-policy=Never --restart=Never

容器成功启动。让我们检查日志:

$ kubectl logs second-container

我们可以看到它打印了正确的消息。

5. Minikube Image Build 命令

在上一个例子中,我们加载了一个预构建的Docker镜像到Minikube。然而,我们也可以在Minikube内直接构建我们的镜像。

让我们使用相同的Dockerfile,并构建一个新的Docker镜像:

$ minikube image build -t third-image -f ./Dockerfile .

现在,镜像已经在Minikube中可用,我们可以用它启动一个容器:

$ kubectl run third-container --image=third-image --image-pull-policy=Never --restart=Never

让我们检查日志,确保它正常工作:

$ kubectl logs third-container

它按预期打印了“Hello World”消息。

6. 总结

在这篇文章中,我们使用了三种不同的方式在Minikube中运行本地Docker镜像。

首先,我们配置了Docker CLI以连接到Minikube内的Docker引擎。然后,我们了解了两种命令,用于加载预构建的镜像和直接在Minikube中构建镜像。