如何使用Minikube本地docker图像?

时间:2017-03-02 19:16:35

标签: linux docker kubernetes docker-compose

我想要与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           

24 个答案:

答案 0 :(得分:234)

正如README所述,您可以使用eval $(minikube docker-env)重用Minikube中的Docker守护程序。

因此,要在不上传图像的情况下使用图像,您可以按照以下步骤操作:

  1. 使用eval $(minikube docker-env)
  2. 设置环境变量
  3. 使用Minikube的Docker守护程序(例如docker build -t my-image .
  4. 构建映像
  5. 在pod规范中设置图像,例如构建标记(例如my-image
  6. imagePullPolicy设置为Never,否则Kubernetes会尝试下载图片。
  7. 重要说明:您必须在要使用的每个终端上运行eval $(minikube docker-env),因为它只为当前的shell会话设置环境变量。

答案 1 :(得分:107)

根据@svenwltr的解决方案,对我有用的东西:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)

# 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

答案 2 :(得分:85)

此答案不限于minikube!

使用本地注册表:

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

现在正确标记您的图片:

docker tag ubuntu localhost:5000/ubuntu

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

现在将您的图片推送到本地注册表:

docker push localhost:5000/ubuntu

你应该能够把它拉回来:

docker pull localhost:5000/ubuntu

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

考虑在适当的位置安装卷以将图像保留在注册表中。

更新

<\ n>如Eli所述,您需要将本地注册表添加为不安全才能使用http(使用localhost时可能不适用,但如果使用本地主机名则适用)

不要在制作中使用http,努力确保安全。

答案 3 :(得分:7)

除了接受的答案,您还可以使用以下命令实现您最初想要的(使用run命令创建部署):

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1 

我在Kubernetes-dev论坛上找到了关于发电机的信息:

  

如果您使用的是kubectl run,则会为您生成一个清单,默认情况下imagePullPolicy设置为Always。您可以使用此命令获取imagePullPolicy IfNotPresent minikube,这将适用于kubectl run --image=<container> --generator=run-pod/v1

     

override func viewDidLoad() { super.viewDidLoad() // put it wherever you want NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(showKeyboard), name:UIKeyboardWillShowNotification, object: nil) } func showKeyboard(sender: NSNotification) { keyboardWillShow(sender, adjustHeight: 150) } func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) { if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() { keyboardHeight = keyboardSize.height // do your calculations } }

     

Dan Lorenc

https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM

答案 4 :(得分:6)

一种方法是在本地构建图像,然后执行:

docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)

minikube docker-env可能无法返回在其他用户/ sudo下运行的正确信息。相反,您可以运行sudo -u yourUsername minikube docker-env

应该返回类似的内容:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/chris/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)

答案 5 :(得分:5)

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

minikube cache add <Image name>

更多详细信息here

将图像推入minikube的所有可能方法均在此处提及:https://minikube.sigs.k8s.io/docs/handbook/pushing/

答案 6 :(得分:5)

回答原始问题“如何在Minikube中使用本地docker映像?”的一种更简单的方法是将映像保存到tar文件并将其加载到minikube中:

# export the docker image to a tar file
docker save --output my-image.tar the.full.path.to/the/docker/image:the-tag
# set local environment variables so that docker commands go to the docker in minikube
eval $(minikube docker-env)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i
# import the docker image from the tar file into minikube
docker load --input my-image.tar
# cleanup - put docker back to normal
eval $(minikube docker-env -u)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env -u') DO @%i

然后运行该映像涉及如下命令。确保包含“ --image-pull-policy =从不”参数。

kubectl run my-image --image=the.full.path.to/the/docker/image:the-tag --image-pull-policy=Never --port=80

答案 7 :(得分:4)

添加到基于this answer的@Farhad的答案中,

这是设置本地注册表的步骤。

在本地计算机上设置

在本地计算机上设置主机名:编辑/etc/hosts以添加此行

docker.local 127.0.0.1

现在启动本地注册表(删除-d以运行非守护程序模式):

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

现在正确标记图像:

docker tag ubuntu docker.local:5000/ubuntu

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

docker push docker.local:5000/ubuntu

验证已推送图片:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

在minikube中设置

ssh插入minikube中,{:{1}}

编辑minukube ssh以添加此行

/etc/hosts

验证访问权限:

docker.local <your host machine's ip>

现在,如果您尝试拉出,可能会出现http访问错误。

启用不安全的访问权限

如果您一直打算在此本地设置中使用minkube,则默认情况下创建一个minikube以使用不安全的注册表(不会在现有群集上运行)。

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

其他步骤如下:

minikube start --insecure-registry="docker.local:5000"

编辑docker serice文件:从systemctl stop docker 获取路径

可能是:

  

/etc/systemd/system/docker.service.d/10-machine.conf或   /usr/lib/systemd/system/docker.service

附加此文本(用IP替换192.168.1.4)

  

-不安全注册docker.local:5000-不安全注册192.168.1.4:5000

此行

  

ExecStart = / usr / bin / docker守护程序-H tcp://0.0.0.0:2376 -H   Unix:///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem   --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider = virtualbox-不安全的注册表10.0.0.0/24

systemctl status docker

尝试拉动:

systemctl daemon-reload
systemctl start docker

现在将您的Yaml文件更改为使用本地注册表。

docker pull docker.local:5000/ubuntu

  containers:
    - name: ampl-django
      image: dockerhub/ubuntu

请勿在生产环境中使用http,请尽一切努力确保内容安全。

答案 8 :(得分:3)

较新版本的 minikube 允许您通过运行从本地 docker 实例加载图像

 minikube image rm image <imagename>:<version>  
 minikube image load <imagename>:<version> --daemon

加载命令可能会显示错误,但图像仍会加载到您的 minikube 实例

答案 9 :(得分:3)

一个想法是将docker映像保存在本地,然后按如下方式将其加载到minikube中:

例如,假设您已经有puckel / docker-airflow图像。

  1. 将该图像保存到本地磁盘-

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. 现在进入minikube docker env-

    eval $(minikube docker-env)

  3. 加载该本地保存的图像-

    docker load < puckel_docker_airflow.tar

就是这么简单,它就像一种魅力。

答案 10 :(得分:2)

要添加到之前的答案,如果您有tarball图像,只需将其加载到本地docker图像集docker image load -i /path/image.tar。请记住在之后运行 {{ 1}},因为minikube不与本地安装的docker引擎共享图像。

答案 11 :(得分:2)

关于“ minikube”,要记住的一件事是minikube的主机与您的本地主机不同,因此,我意识到,要使用本地映像对minikube进行测试,必须先在本地或本地构建docker映像。将其拉到本地,然后使用波纹管命令将其添加到minikube上下文中,这就是另一个Linux实例。

 minikube cache add <image>:<tag>

但是,请不要忘记在您的kubernetes部署Yaml中设置imagePullPolicy: Never,因为它将确保使用本地添加的映像,而不是尝试从注册表中远程获取它。

答案 12 :(得分:2)

minikube addons enable registry -p minikube

?docker上的注册表插件使用32769,请改用 默认为5000
?有关更多信息,请参见: https://minikube.sigs.k8s.io/docs/drivers/docker

docker tag ubuntu $(minikube ip -p minikube):32769/ubuntu
docker push $(minikube ip -p minikube):32769/ubuntu

OR

minikube addons enable registry
docker tag ubuntu $(minikube ip):32769/ubuntu
docker push $(minikube ip):32769/ubuntu

以上内容足以满足开发目的。我正在archlinux上执行此操作。

答案 13 :(得分:2)

来自kubernetes docs:

https://kubernetes.io/docs/concepts/containers/images/#updating-images

  

默认的拉取策略是IfNotPresent,它会导致Kubelet跳过拉动图像(如果已存在)。如果您想总是强行拉动,可以执行以下操作之一:

     
      
  • 将容器的imagePullPolicy设置为Always;
  •   
  • 使用:latest作为要使用的图像的标记;
  •   
  • 启用AlwaysPullImages许可控制器。
  •   

或者以另一种方式阅读:使用:latest标签强制始终拉动图像。如果你使用上面提到的eval $(minikube docker-env),那么要么不使用任何标签,要么为你的本地图像分配一个标签,你可以避免Kubernetes试图强行拉它。

答案 14 :(得分:1)

现在有一个Minikube Registry插件,这可能是最简单的方法。使用方法如下:https://minikube.sigs.k8s.io/docs/tasks/registry/insecure/

请注意,我遇到DNS问题,可能是一个错误。

答案 15 :(得分:1)

如果仅能在docker的vm内运行k8怎么办? Docker桌面的最新版本对此提供了本机支持……您只需要启用该支持即可。

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

我是怎么发现的:

在阅读有关掌舵的文档时,他们为您提供了有关如何安装minikube的简短教程。 该教程在与docker不同/独立的vm中安装minikube。

因此,当需要安装头盔图表时,我无法使用头盔/ k8来拉取使用docker构建的图像。这就是我到达此问题的方式。

所以...如果您可以使用docker桌面随附的任何版本的k8s,并且可以在vm docker所具有的版本中运行,则此解决方案可能比其他解决方案要容易一些。

免责声明:不确定在Windows / linux容器之间切换会如何影响一切。

答案 16 :(得分:1)

如果在设置minikube env之后有人希望返回本地环境,请使用以下命令。

eval $(docker-machine env -u)

答案 17 :(得分:1)

  1. 设置minikube docker-env
  2. 再次构建相同的docker映像(使用minikube docker-env)
  3. 将部署中的
  4. imagePullPolicy更改为从不

实际上发生了什么,您的Minikube无法识别您的docker守护进程,因为它是独立的服务。您必须首先使用以下命令设置您的minikube-docker环境,以进行检查

 "eval $(minikube docker-env)"

如果您运行以下命令,它将显示您的minikube在哪里寻找docker。

~$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.37.192:2376"
export DOCKER_CERT_PATH="/home/ubuntu/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

**# To point your shell to minikube's docker-daemon, run:**
# eval $(minikube -p minikube docker-env)

设置minikube docker-env后,您必须再次构建映像,否则它将失败。

答案 18 :(得分:1)

在kubernetes中运行本地docker映像的步骤
1.评估$(minikube -p minikube docker-env)
2.在工件文件的规范部分->容器下
添加 imagePullPolicy:IfNotPresent
或imagePullPolicy:从不

apiVersion: "v1"
kind: Pod
metadata:
    name: web
    labels:
        name: web
        app: demo
spec:
    containers:
        - name: web
          image: web:latest
          imagePullPolicy: IfNotPresent
          ports:
              - containerPort: 5000
                name: http
                protocol: TCP


3.然后运行kubectl create -f <filename>

答案 19 :(得分:0)

其他答案假设您将minikube与VM一起使用,因此无法从minikube VM访问本地映像。

如果将minikube与--vm-driver=none一起使用,则可以通过将image_pull_policy设置为Never(从不)来轻松重用本地图像:

kubectl run hello-foo --image=foo --image-pull-policy=Never

或在相应的imagePullPolicy清单中为容器设置.yaml字段。

答案 20 :(得分:0)

您可以使用eval $(minikube docker-env)重用docker shell,或者可以在整个shell中使用docker save | docker load

答案 21 :(得分:0)

对于Docker上的minikube:

选项1:使用minikube注册表

  1. 检查您的minikube端口 docker ps

您会看到类似127.0.0.1:32769->5000/tcp的内容 这意味着您的minikube注册表在32769端口上供外部使用,而在内部它在5000端口上。

  1. 构建标记它的docker映像: docker build -t 127.0.0.1:32769/hello .

  2. 将图像推送到minikube注册表中: docker push 127.0.0.1:32769/hello

  3. 检查是否存在: curl http://localhost:32769/v2/_catalog

  4. 使用内部端口构建一些部署: kubectl create deployment hello --image=127.0.0.1:5000/hello

您的图片现在在minikube容器中,看到它写着:

eval $(minikube -p <PROFILE> docker-env)
docker images

caveat:如果仅使用一个名为“ minikube”的配置文件,则“ -p”部分是多余的,但是如果使用更多配置文件,请不要忘记它;我个人删除了标准行(minikube),以免出错。

选项2:不使用注册表

  1. 切换到minikube容器Docker: eval $(minikube -p <PROFILE> docker-env)
  2. 建立您的形象: docker build -t hello .
  3. 创建一些部署: kubectl create deployment hello --image=hello

最后,将部署ImagePullPolicy从始终更改为IfNotPresent:

kubectl edit deployment hello

答案 22 :(得分:0)

在 minikube 1.20 上,[expr.post.incr] 已弃用。

改为使用 [expr.pre.incr]

答案 23 :(得分:-1)

我从ClickHouse Operator Build From Sources找到了这种方法 它可以帮助并挽救我的生命!

docker save altinity/clickhouse-operator | (eval $(minikube docker-env) && 
docker load)