1.概述
在本教程中,我们将把Docker容器部署到Kubernetes,并看看我们如何为这些容器使用本地镜像。我们将使用Minikube>来运行Kubernetes集群。
2.Dockerfile
首先,我们需要一个Dockerfile,以便能够创建本地Docker镜像。这应该很简单,因为我们将专注于Minikube命令。
让我们创建一个Dockerfile,只用一个echo命令来打印一条信息。
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://192.168.49.2:2376"
export DOCKER_CERT_PATH="/home/work/.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镜像加载命令
让我们看看另一种使用本地镜像的方法。这一次,我们将在我们的机器上建立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镜像构建命令
在前面的例子中,我们加载了一个预先构建的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中构建一个镜像。