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中构建镜像。