我有几个docker映像,我想使用minikube。我不想先上传然后再下载相同的图像,而不是直接使用本地图像。我怎么做呢?

我尝试过的东西: 1. 我试着运行这些命令(分别删除minikube的实例并重新开始)

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never

输出:

NAME                    READY     STATUS              RESTARTS   AGE
hdfs-2425930030-q0sdl   0/1       ContainerCreating   0          10m

它只是停留在某个状态,但从未达到就绪状态。

2. 我试着创建一个注册表,然后将图像放入其中,但这也不起作用。我可能做错了,但我找不到正确的说明来做这个任务。

请提供在本地kubernetes实例中使用本地docker映像的说明。 操作系统:ubuntu 16.04 Docker: Docker版本1.13.1,build 092cba3 Kubernetes:

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.1", Compiler:"gc", Platform:"linux/amd64"}

如果有人能帮我找到一个解决方案,使用docker-compose来做到这一点,那就太棒了。

编辑:

在eval $(minikube docker-env)中加载的图像:

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
fluxcapacitor/jupyterhub                              latest              e5175fb26522        4 weeks ago         9.59 GB
fluxcapacitor/zeppelin                                latest              fe4bc823e57d        4 weeks ago         4.12 GB
fluxcapacitor/prediction-pmml                         latest              cae5b2d9835b        4 weeks ago         973 MB
fluxcapacitor/scheduler-airflow                       latest              95adfd56f656        4 weeks ago         8.89 GB
fluxcapacitor/loadtest                                latest              6a777ab6167c        5 weeks ago         899 MB
fluxcapacitor/hdfs                                    latest              00fa0ed0064b        6 weeks ago         1.16 GB
fluxcapacitor/sql-mysql                               latest              804137671a8c        7 weeks ago         679 MB
fluxcapacitor/metastore-1.2.1                         latest              ea7ce8c5048f        7 weeks ago         1.35 GB
fluxcapacitor/cassandra                               latest              3cb5ff117283        7 weeks ago         953 MB
fluxcapacitor/apachespark-worker-2.0.1                latest              14ee3e4e337c        7 weeks ago         3.74 GB
fluxcapacitor/apachespark-master-2.0.1                latest              fe60b42d54e5        7 weeks ago         3.72 GB
fluxcapacitor/package-java-openjdk-1.8                latest              1db08965289d        7 weeks ago         841 MB
gcr.io/google_containers/kubernetes-dashboard-amd64   v1.5.1              1180413103fd        7 weeks ago         104 MB
fluxcapacitor/stream-kafka-0.10                       latest              f67750239f4d        2 months ago        1.14 GB
fluxcapacitor/pipeline                                latest              f6afd6c5745b        2 months ago        11.2 GB
gcr.io/google-containers/kube-addon-manager           v6.1                59e1315aa5ff        3 months ago        59.4 MB
gcr.io/google_containers/kubedns-amd64                1.9                 26cf1ed9b144        3 months ago        47 MB
gcr.io/google_containers/kube-dnsmasq-amd64           1.4                 3ec65756a89b        5 months ago        5.13 MB
gcr.io/google_containers/exechealthz-amd64            1.2                 93a43bfb39bf        5 months ago        8.37 MB
gcr.io/google_containers/pause-amd64           

当前回答

你可以重用docker shell,使用eval $(minikube docker-env),或者,你可以在shell中利用docker save | docker负载。

其他回答

根据@svenwltr的解决方案,对我有效的是:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)             # unix shells
minikube docker-env | Invoke-Expression # PowerShell

# Build image
docker build -t foo:0.0.1 .

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

# Check that it's running
kubectl get pods

有一种简单有效的方法可以将本地Docker映像直接推送到minikube中,这将节省再次在minikube中构建映像的时间。

minikube image load <image name>

(minikube缓存添加<映像名称> -旧的已弃用的方式,供参考)

详情请点击这里

所有可能的方法推图像到minikube在这里提到:https://minikube.sigs.k8s.io/docs/handbook/pushing/

注:

This Answer isnt limited to minikube! If wanting to create the registry on minikube's Docker then run eval $(minikube docker-env) first (to make docker available on the host machine's terminal). Otherwise enter in the virtual machine via minikube ssh, and then proceed with the following steps depending on your operative system, minikube will automatically mount your homepath onto the VM. as Eli stated, you'll need to add the local registry as insecure in order to use http (may not apply when using localhost but does apply if using the local hostname) Don't use http in production, make the effort for securing things up.


使用本地注册表:

docker run -d -p 5000:5000 --restart=always --name local-registry registry:2

现在正确地标记你的图像:

docker tag ubuntu localhost:5000/ubuntu

注意,localhost应该更改为运行注册表容器的机器的dns名称。

现在将您的映像推到本地注册表:

docker push localhost:5000/ubuntu

你应该可以把它拉回来:

docker pull localhost:5000/ubuntu

现在更改yaml文件以使用本地注册表。

考虑在适当的位置挂载卷,以便在注册表上持久化映像。

如果你可以在docker的vm中运行k8s呢?在docker desktop的最新版本中有对这个功能的本地支持…您只需要启用这种支持。

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now-kubernetes/

我是怎么发现的:

在阅读helm的文档时,他们会给你一个如何安装minikube的简短教程。 该教程将minikube安装在不同于docker的vm中。

所以当安装我的头盔图表时,我无法让helm/k8s拉出我使用docker构建的图像。这就是我提出这个问题的原因。

所以…如果你能适应docker桌面附带的任何版本的k8s,并且你能适应docker在任何虚拟机中运行,那么这个解决方案可能比其他一些解决方案更容易一些。

免责声明:不确定在windows/linux容器之间切换会产生什么影响。

在之前的答案的基础上,使用eval $(minikube docker-env)来加载minikube的docker环境,为了更容易切换,在你的shell rc文件中添加以下函数:

dockube() {
  if [[ $1 = 'which' ]]; then
    if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
      echo $MINIKUBE_ACTIVE_DOCKERD
    else
      echo 'system'
    fi
    return
  fi

  if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
    eval $(minikube docker-env -u)
    echo "now using system docker"
  else
    eval $(minikube -p minikube docker-env)
    echo "now using minikube docker"
  fi
}

没有参数的Dockube将在系统和minikube docker环境之间切换,哪个Dockube将返回哪个Dockube正在使用。