【问题标题】:Use local docker image with minikube将本地 docker 镜像与 minikube 一起使用
【发布时间】:2019-03-10 11:57:10
【问题描述】:

我关注的是这个网址:How to use local docker images with Minikube? 我无法添加评论,所以想在这里提出我的问题:

在我的笔记本电脑上,我安装了 Linux Mint 操作系统。详情如下:

Mint version 19, 
Code name : Tara,
PackageBase : Ubuntu Bionic
Cinnamon (64-bit)

根据上述链接的答案:

  1. 我启动了 minikube 并检查了 pod 和部署
xxxxxxxxx:~$ pwd
/home/sj

xxxxxxxxxx:~$ minikube start
xxxxxxxxxx:~$ kubectl get pods
xxxxxxxxxx:~$ kubectl get deployments

我运行了命令 docker images

xxxxxxxxx:~$ docker images

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
<username>/spring-docker-01   latest              e10f88e1308d        6 days ago          640MB
openjdk                           8                   81f83aac57d6        4 weeks ago         624MB
mysql                             5.7                 563a026a1511        4 weeks ago         372MB
  1. 我运行了下面的命令:

eval $(minikube docker-env)

  1. 现在,当我检查 docker 映像时,看起来就像 README 描述的那样,它使用 eval $(minikube docker-env) 重用了 Minikube 的 Docker 守护程序。

    xxxxxxxxxxxxxxx:~$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
nginx                                      alpine              33c5c6e11024        9 days ago          17.7MB
k8s.gcr.io/coredns                         1.2.2               367cdc8433a4        5 weeks ago         39.2MB
k8s.gcr.io/kubernetes-dashboard-amd64      v1.10.0             0dab2435c100        5 weeks ago         122MB
k8s.gcr.io/kube-proxy-amd64                v1.10.0             bfc21aadc7d3        6 months ago        97MB
k8s.gcr.io/kube-controller-manager-amd64   v1.10.0             ad86dbed1555        6 months ago        148MB
k8s.gcr.io/kube-apiserver-amd64            v1.10.0             af20925d51a3        6 months ago        225MB
k8s.gcr.io/kube-scheduler-amd64            v1.10.0             704ba848e69a        6 months ago        50.4MB
k8s.gcr.io/etcd-amd64                      3.1.12              52920ad46f5b        6 months ago        193MB
k8s.gcr.io/kube-addon-manager              v8.6                9c16409588eb        7 months ago        78.4MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64     1.14.8              c2ce1ffb51ed        9 months ago        41MB
k8s.gcr.io/k8s-dns-sidecar-amd64           1.14.8              6f7f2dc7fab5        9 months ago        42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64          1.14.8              80cc5ea4b547        9 months ago        50.5MB
k8s.gcr.io/pause-amd64                     3.1                 da86e6ba6ca1        9 months ago        742kB
gcr.io/k8s-minikube/storage-provisioner    v1.8.1              4689081edb10        11 months ago       80.8MB
k8s.gcr.io/echoserver                      1.4                 a90209bb39e3        2 years ago         140MB

注意:如果注意到 docker images 命令在第 2 步前后拉取了不同的图像。

  1. 由于我没有看到要放在 minikube 上的图像,所以我从我的 docker hub 中提取了它。
xxxxxxxxxxxxx:~$ docker pull <username>/spring-docker-01
Using default tag: latest
latest: Pulling from <username>/spring-docker-01
05d1a5232b46: Pull complete 
5cee356eda6b: Pull complete 
89d3385f0fd3: Pull complete 
80ae6b477848: Pull complete 
40624ba8b77e: Pull complete 
8081dc39373d: Pull complete 
8a4b3841871b: Pull complete 
b919b8fd1620: Pull complete 
2760538fe600: Pull complete 
48e4bd518143: Pull complete 
Digest: sha256:277e8f7cfffdfe782df86eb0cd0663823efc3f17bb5d4c164a149e6a59865e11
Status: Downloaded newer image for <username>/spring-docker-01:latest
  1. 验证我是否可以使用“docker images”命令看到该图像。
xxxxxxxxxxxxx:~$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
<username>/spring-docker-01            latest              e10f88e1308d        6 days ago          640MB
nginx                                      alpine              33c5c6e11024        10 days ago         17.7MB
  1. 然后我尝试按照引用的链接步骤中的说明构建映像。
xxxxxxxxxx:~$ docker build -t <username>/spring-docker-01 .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/sj/Dockerfile: no such file or directory

由于错误指出该位置不存在 dockerfile,我不确定在哪里可以看到我从 docker hub 拉取的图像的 dockerfile。

看起来我必须去图像被拉出的位置,从那个位置,我需要运行上述命令。请纠正我的错误。

以下是步骤,我将在解决上述问题后进行。

# Run in minikube
kubectl run hello-foo --image=myImage --image-pull-policy=Never

# Check that it's running
kubectl get pods

更新-1

以上步骤有误。 不需要第 6 步。镜像已经从 docker hub 拉取,所以不需要docker build 命令。

这样,我继续按照@aurelius 回应时提到的指示进行操作。

xxxxxxxxx:~$ kubectl run sdk-02 --image=<username>/spring-docker-01:latest --image-pull-policy=Never
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/sdk-02 created

检查的 pod 和部署

xxxxxxxxx:~$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
sdk-02-b6db97984-2znlt       1/1     Running   0          27s
xxxxxxxxx:~$ kubectl get deployments
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
sdk-02      1         1         1            1           35s

然后在端口 8084 上公开部署,因为我正在使用其他端口,例如 8080 到 8083

xxxxxxxxx:~$ kubectl expose deployment sdk-02 --type=NodePort --port=8084
service/sdk-02 exposed

然后验证服务是否已经启动,检查kubernetes仪表板是否没有问题,然后检查url

xxxxxxxxx:~$ kubectl get services
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP          7h
sdk-02       NodePort       10.100.125.120   <none>        8084:30362/TCP   13s

xxxxxxxxx:~$ minikube service sdk-02 --url
http://192.168.99.101:30362

当我尝试在浏览器中打开 URL:http://192.168.99.101:30362 时,我收到消息:

This site can’t be reached
192.168.99.101 refused to connect.
Search Google for 192 168 101 30362
ERR_CONNECTION_REFUSED

所以问题是:执行的步骤有什么问题吗?


更新-2

问题出在以下步骤:

xxxxxxxxx:~$ kubectl expose deployment sdk-02 --type=NodePort --port=8084
    service/sdk-02 exposed

在检查我的图像的 Dockerfile 时:&lt;username&gt;/spring-docker-01:latest 我将它暴露给 8083 类似EXPOSE 8083 可能是导致问题的原因。 所以我继续并更改了公开命令:

xxxxxxxxx:~$ kubectl expose deployment sdk-02 --type=NodePort --port=8083
service/sdk-02 exposed

然后它开始工作了。

如果有人有什么要补充的,请随意。

但是我仍然不确定在哪里可以看到我从 docker hub 拉取的图像的 dockerfile。

【问题讨论】:

  • 你应该在Dockerfile所在的目录下运行命令docker build -t shivnilesh1109/spring-docker-01 .
  • @CharlesXu-MSFT 这就是我的问题。让我改写一下:我使用命令 docker pull username/myImage 从我的 docker hub 中提取了一个图像“myImage”。如何找出该图像在我的定位机器上的存储位置?
  • 我已经更新了更多详细信息的描述UPDATE-1请仔细查看所有步骤,如果我在那里犯了任何错误,请告诉我。
  • 得到这个工作。然而,只剩下 1 个问题。请检查UPDATE-2

标签: docker kubernetes linux-mint minikube


【解决方案1】:

您可以使用以下内容创建一个 Dockerfile:

FROM shivnilesh1109/spring-docker-01

然后运行:

docker build -t my-spring-docker-01 .

【讨论】:

  • 命令FROM shivnilesh1109/spring-docker-01 不起作用。不确定我是否正确理解了您的回复。
  • 这不是命令。您需要创建一个名为 Dockerfile 的文件,并在该文件中添加 FROM shivnilesh1109/spring-docker-01
  • 我面临的基本问题仍然是一样的。我使用命令 docker pull username/myImage 从我的 docker hub 中提取了一个图像“myImage”。为了创建 dockerfile,首先我需要找出该图像在我的定位机器上的存储位置。我对此有疑问。
  • 我什至尝试去 docker 根目录:xxxxxxxxxx:/var/lib/docker# ls **builder buildkit containerd containers image network overlay2 plugins runtimes swarm tmp trust volumes** 不确定拉取的图像到底存储在哪里。
  • 你想做什么?为什么需要本地 docker 镜像上的文件?
【解决方案2】:

docker build 不知道你的command 是什么意思,因为标志 -t 需要特定格式:

--tag , -t 名称和可选的“name:tag”格式的标签

xxxxxxxxxx:~/Downloads$ docker build -t shivnilesh1109/spring-docker-01 .

所以这里正确的命令应该是:

docker build -t shivnilesh1109/spring-docker-01:v1(1) .(2)

(1) 所需的容器名称:标签 (2) dockerfile 所在的目录。

在进行 minikube 部署后,运行以下代码就足够了: kubectl run *desired name of deployment/pod* --image=*name of the container with tag* --image-pull-policy=Never

如果这不能解决您的问题,请尝试手动添加 Dockerfile 的路径。我已经在我的机器上对此进行了测试,并且在使用正确的图像标记后错误停止,并且还使用 Dockerfile 的完整路径进行了测试,否则我遇到了与您相同的错误。

【讨论】:

  • 我对您的回复中的 (2) 有疑问。让我换个说法:我使用命令 docker pull username/myImage 从我的 docker hub 中提取了一个图像“myImage”。如何找出该图像在我的定位机器上的存储位置?
  • 我已经更新了更多详细信息的描述UPDATE-1请仔细查看所有步骤,如果我在那里犯了任何错误,请告诉我。
【解决方案3】:

对于您的 UPDATE-2 问题,也可以帮助您了解 Dockerfile 和命令 kubectl expose 中公开的端口。

Dockerfile:

EXPOSE 指令实际上并不发布端口。它 充当构建者之间的一种文档 镜像和运行容器的人,关于哪些端口是 打算出版。

更多详情请见EXPOSE

Kubectl 暴露:

--port:服务应该服务的端口。如果未指定,则从公开的资源复制

--target-port:服务应将流量定向到的容器端口的名称或编号。可选。

更多详情请见kubectl expose

所以我认为您应该将参数 --target-port 与您在 Dockerfile 中公开的端口一起添加。然后端口映射就正确了。

【讨论】:

  • DokerfileEXPOSE 8083 然后 kubectl expose 我用 --port 8084 --target-port 8083 更改了命令并且它起作用了。感谢您的回答。
【解决方案4】:

尝试将本地 docker 映像添加到 minikube 的缓存中,如下所示:

minikube cache add docker-image-name:latesttag

然后在yaml文件中设置imagePullPolicy:Never

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2020-01-06
    • 1970-01-01
    • 2020-08-09
    • 2021-12-27
    • 2019-12-05
    • 1970-01-01
    • 2022-12-09
    • 2018-02-14
    相关资源
    最近更新 更多