如何在 windows 10 上拉取本地构建的 docker 图像?

how to pull locally built docker image on windows 10?

我的 os 是 windows 10 pro,我用 spring 启动开发。首先,我使用以下 Dockerfile 构建 docker 图像。

FROM openjdk:11-jdk
ADD target/Spring-Blog-Jpa-0.0.1-SNAPSHOT.jar blog-app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Dfile.encoding=UTF8","-jar","blog-app.jar"]

使用 docker 命令成功构建了 docker 映像。

> docker image build -t blog-app:latest .

然后我从 docker 代表os 中提取 mysql:latest 图片。并且mysql拉取也成功

> docker image pull mysql:latest .

我尝试用 ose docker 图像生成 kubernetes pod。对于 mysql:latest 图像,mysql pod 生成时没有错误。但是在生成 blog-app pod 的时候,blog-app:latest image 拉不出来,报错。下面是配置yaml文件。

apiVersion: apps/v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    args: ["-t", "-i"]

不知道为什么本地构建的镜像在生成pod时无法拉取。有没有push local docker repository的流程?本地构建的 docker 镜像如何拉取到 Kuberetes 上?

您可以重用 Minikube 中的 Docker 守护进程。这是 Powershell 上的命令。

PS C:\minikube> minikube docker-env

PS C:\minikube> minikube docker-环境 |调用表达式

docker image build -t blog-app:latest

像构建标签一样在 pod 规范中设置图像

将 imagePullPolicy 设置为 Never,否则 Kubernetes 将尝试下载镜像。


apiVersion: apps/v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    imagePullPolicy: Never
    args: ["-t", "-i"]

同时检查这个 guide

这是 Docker 的一个令人困惑的方面。本质上,Kubernetes 试图从容器注册表中拉取镜像,并且(通常)在将镜像推送到注册表之前,无法拉取它。

当您 docker [push|pull] ... 与(远程)容器注册表交互时。默认情况下(如果您未指定),您正在与 DockerHub 交互,并且可能假设图像(除非另有标记)以 DockerHub 的 https://docker.io 为前缀。如果你使用,例如Google Container Registry,您会更频繁地使用它的主机前缀,例如https://gcr.io.

当您在主机上构建容器时,在您 docker push ... 映像之前,它不在注册表中。

当您在 Kubernetes 规范|配置中引用图像时,Kubernetes 期望从注册表中提取图像。在您的情况下,blob-app 不在注册表中,因此失败。

您可以 运行 本地注册表来解决这个问题。您可以这样做的一种方法是根据@arghya-sadhu 的回答使用 Minikube。但您也可以 运行 Docker Docker 自己实现其注册表规范的图像,请参阅 registry

或者您可以将图像推送到 public 可以访问的注册表,例如DockerHub, Google Container Registry, Quay,然后像您对 mysql 所做的那样从注册表中引用图像。 DockerHub 有一个非常常用的免费层,并允许 public 和(数量有限的)私有存储库。