Как использовать локальные образы докеров с Minikube?


301

У меня есть несколько изображений докеров, с которыми я хочу использовать 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.
ОС: Ubuntu 16.04
Docker: Docker версия 1.13.1, сборка 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           

Ответы:


408

Как описано в README , вы можете повторно использовать демон Docker из Minikube eval $(minikube docker-env).

Таким образом, чтобы использовать изображение, не загружая его, вы можете выполнить следующие действия:

  1. Установите переменные среды с eval $(minikube docker-env)
  2. Создайте образ с помощью Docker-демона Minikube (например docker build -t my-image .)
  3. Установите изображение в спецификации модуля как тег сборки (например my-image)
  4. Установите imagePullPolicyдля Never, иначе Kubernetes попытается загрузить изображение.

Важное примечание: вы должны работать eval $(minikube docker-env)на каждом терминале, который хотите использовать, поскольку он устанавливает только переменные среды для текущего сеанса оболочки.


1
AFAIS вы можете сделать это только с новым minukube с minikube start --disk-size 100g. Другое решение - удалить старые изображения с помощью docker imagesи docker rmi.
svenwltr

6
Очень важно помнить о том, чтобы запускаться eval $(minikube docker-env)после закрытия терминала, в котором вы работаете, ДО того, как вы попытаетесь перестроить образы ... просто прожег 6 часов, борясь с изображением, которое не обновлялось в мини-кубе ... похоже, пакет не обновлялся .. на самом деле просто не обновляется изображение, на которое ссылался миникуб.
Майк

1
Политика извлечения по умолчанию IfNotPresentозначает, что все, что нам нужно сделать, это установить переменные среды.
Бейги

29
Если ты хочешь вернуться или выйти из env из мини-куба ..eval $(minikube docker-env -u)
Буди Мулё

1
@nmxl посмотрите здесь
testuser

175

Что сработало для меня, основываясь на решении @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

3
Вы можете найти yml-версию вышеуказанной командной строки (в отношении imagePullPolicy) здесь: kubernetes.io/docs/concepts/containers/images
granadaCoder

128

Этот ответ не ограничивается миникубе!

Используйте локальный реестр:

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, чтобы использовать локальный реестр.

Подумайте о подключении тома в соответствующем месте, чтобы сохранить образы в реестре.

Обновить:

как сказал Эли, вам нужно добавить локальный реестр как небезопасный, чтобы использовать http (может не применяться при использовании localhost, но применяется при использовании локального имени хоста)

Не используйте http в производстве, приложите усилия для обеспечения безопасности.


2
| Теперь измените ваш файл yaml, чтобы использовать локальный реестр. Вы можете объяснить это немного? Я нажал на локальный реестр (крутой трюк), но у меня та же проблема, что я не могу подключить к нему миникуб.
Зак Эстела

3
@ZachEstela изменить имя изображения в yaml на<registryIP>:5000/ubuntu
Фархад Фарахи

@FarhadFarahi Где я могу найти "DNS-имя компьютера, на котором запущен контейнер реестра"?
Даан

1
@FarhadFarahi Если бы я дал тебе свой ноутбук, как бы ты узнал? Я просто хочу это знать. Я следовал инструкциям по докеру, чтобы получить докер для запуска Windows.
Даан

1
@FarhadFarahi: Пожалуйста, добавьте к своему ответу, что вам нужно добавить локальный реестр как небезопасный, чтобы использовать http: docs.docker.com/registry/insecure (может не применяться при использовании localhost, но применяется при использовании локального имени хоста ).
Эли Альгранти

14

Добавление к ответу @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

Настройка в миникубе

SSH в миникубе с: minukube ssh

изменить, /etc/hostsчтобы добавить эту строку

docker.local <your host machine's ip>

Подтвердите доступ:

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

Теперь, если вы попытаетесь вытащить, у вас может появиться ошибка доступа http.

Включить небезопасный доступ :

Если вы всегда планируете использовать minkube с этой локальной настройкой, то создайте мини-куб для использования незащищенного реестра по умолчанию (не будет работать на существующем кластере).

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

иначе следуйте ниже шагов:

systemctl stop docker

отредактируйте файл обслуживания докера: получите путь от systemctl status docker

может быть :

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

добавить этот текст (замените 192.168.1.4 на ваш ip)

--insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4:5000

к этой линии

ExecStart = / usr / bin / docker daemon -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 --insecure-registry 10.0.0.0/24

systemctl daemon-reload
systemctl start docker

попробуйте потянуть:

docker pull docker.local:5000/ubuntu

Теперь измените ваш файл yaml, чтобы использовать локальный реестр.

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

в

  containers:
    - name: ampl-django
      image: docker.local:5000/nymbleup

Не используйте http в производстве, приложите усилия для обеспечения безопасности.


12

В дополнение к принятому ответу вы также можете достичь того, чего изначально хотели (создавая развертывание с помощью runкоманды), с помощью следующей команды:

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

Я нашел информацию о генераторе на форуме Kubernetes-dev:

Если вы используете kubectl run, он генерирует для вас манифест, который по умолчанию imagePullPolicyустановлен в Always. Вы можете использовать эту команду для получения imagePullPolicyof IfNotPresent, который будет работать для minikube:

kubectl run --image=<container> --generator=run-pod/v1

Дэн Лоренц

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


9

Один из подходов состоит в том, чтобы создать изображение локально, а затем выполнить:

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)

Правильная командаdocker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
Сальвадор

1
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)работал для меня
lhaferkamp


4

Из документов Кубернеца:

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

Политика извлечения по умолчанию - IfNotPresent, которая заставляет Kubelet пропускать вытягивание изображения, если оно уже существует. Если вы хотите всегда принудительно тянуть, вы можете выполнить одно из следующих действий:

  • установите для imagePullPolicy контейнера значение Always;
  • использовать: последний как тег для изображения для использования;
  • включить контроллер доступа AlwaysPullImages.

Или читайте по-другому: использование тега: latest заставляет изображения всегда извлекаться. Если вы используете eval $(minikube docker-env)как упомянуто выше, то либо не используйте какой-либо тег, либо присвойте тег своему локальному изображению, вы можете избежать Kubernetes, пытающегося принудительно вытянуть его.



3

Более простой метод, который отвечает на первоначальный вопрос «Как использовать изображения локального докера с Minikube?», - это сохранить изображение в 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 = Never.

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

Хорошо объяснил, работал как шарм. Я только должен был звонить docker saveс sudo, а затем установить , sudo chmod 664 my-image.tarчтобы сделать его доступным для моего текущего пользователя.
Меир Габай

Это должен быть самый быстрый подход, я верю.
Шивакант Бхарти

2

Чтобы добавить к предыдущим ответам, если у вас есть тарбол-образ, вы можете просто загрузить его в свой локальный докер-набор изображений. docker image load -i /path/image.tarПожалуйста, не забудьте запустить его после eval $(minikube docker-env) , так как minikube не делится изображениями с локально установленным механизмом Docker.


2

Другие ответы предполагают, что вы используете minikube с VM, поэтому ваши локальные образы не доступны из minikube VM.

В случае, если вы используете Minikube с --vm-driver=none, вы можете легко использовать локальные изображения, установив image_pull_policyникогда:

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

или установка imagePullPolicyполя для картеров в соответствующих .yamlманифестах.


2

Одной из идей было бы сохранить образ докера локально, а затем загрузить его в мини-куб следующим образом:

Допустим, например, у вас уже есть изображение puckel / docker-airflow.

  1. Сохранить это изображение на локальный диск -

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. Теперь войдите в мини-куб докер env -

    eval $(minikube docker-env)

  3. Загрузить это локально сохраненное изображение -

    docker load < puckel_docker_airflow.tar

Это так просто, и это работает как шарм.


Вам все еще нужен совет о принятом ответе Set the imagePullPolicy to Never. Если ваше изображение помечено, например, адресом, us.icr.io/mydiv/my-service:v0.0.1то при развертывании попытка удаленного извлечения этого образа будет удалена. Поскольку вы уже скопировали изображение вручную, вам нужно запретить k8s извлекать изображение из адреса (реестра контейнера), к которому он не может получить доступ.
colm.anseo

1

что если бы вы могли просто запустить k8s в vm докера? Для более поздних версий 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 в виртуальной машине, которая отличается от докера.

поэтому, когда пришло время устанавливать мои схемы рулевого управления, я не мог заставить helm / k8s извлекать изображения, которые я создал, используя докер. вот как я пришел сюда на этот вопрос.

так что ... если вы можете жить с любой версией k8s, поставляемой с рабочим столом Docker, и вы можете жить с ней, работающей с любым приложением vm docker, то, возможно, это решение немного проще, чем некоторые другие.

Отказ от ответственности: не уверен, как переключение между контейнерами Windows / Linux может повлиять на что-либо.


Я думаю, что я также должен был установить для imagePullPolicies значение IfNotPresent
чад

1

Существует один эссе и эффективный способ перенести ваше локальное изображение Docker непосредственно в мини-куб, что сэкономит время на повторную сборку изображений в мини-кубе.

minikube cache add <Image name>

Подробнее здесь

Все возможные способы отправки изображений в миникуб упоминаются здесь: https://minikube.sigs.k8s.io/docs/handbook/pushing/


0

вы можете либо повторно использовать оболочку докера, или eval $(minikube docker-env), наоборот, использовать docker save | docker loadвсе оболочки.


0
  1. настройка minikube docker-env
  2. снова создайте тот же образ докера (используя minikube docker-env)
  3. измените imagePullPolicy на Никогда в вашем развертывании

на самом деле, что здесь происходит, ваш Minikube не может распознать ваш демон docker, поскольку он является независимой службой. Сначала вы должны установить свою среду minikube-docker, используя команду ниже для проверки

 "eval $(minikube docker-env)"

Если вы запустите команду ниже, она покажет, где ваш мини-куб ищет докер.

~$ 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, иначе это не удастся.



0

шаги для запуска локальных образов докера в kubernetes
1. eval $ (minikube -p minikube docker-env)
2. в файле артефакта, в разделе спецификации -> контейнеры,
добавьте imagePullPolicy: IfNotPresent
или imagePullPolicy: Never

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>


0

это работает

 minikube cache add <image>:<tag> 

1
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
n1colas.m
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.