Як використовувати локальні зображення докера за допомогою Minikube?


299

У мене є кілька зображень докера, якими я хочу користуватися 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. Я спробував створити реєстр, а потім вставити в нього зображення, але це теж не спрацювало. Я, можливо, зробив це неправильно, але не можу знайти належних вказівок для виконання цього завдання.

Будь ласка, надайте інструкції щодо використання локальних зображень докера у місцевому екземплярі кубернетів.
ОС: ubuntu 16.04
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. Створіть зображення за допомогою демона Докера з Minikube (наприклад docker build -t my-image .)
  3. Встановіть зображення в специфікації стручка, як тег збірки (наприклад my-image)
  4. Встановіть imagePullPolicyв Neverіншому випадку Kubernetes намагатиметься завантажити зображення.

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


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

6
Дуже важливо пам’ятати про запуск eval $(minikube docker-env)після закриття терміналу, над яким ви працюєте, ПЕРЕД ви намагаєтеся відновити зображення ... щойно спалили 6 годин, бореться із зображенням, яке не оновлювалося в minikube ... виглядало так, що пакет не оновлювався .. дійсно просто не оновлюючи зображення, на яке посилався minikube.
Майк

1
Політика витягування за замовчуванням - IfNotPresentце означає, що все, що нам потрібно зробити, це встановити змінні середовища.
Бейгі

29
Якщо ви хочете повернутися або вийти з маршрутки з minikube ..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

127

Ця відповідь не обмежується лише 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, щоб використовувати локальний реєстр.

Подумайте про встановлення гучності у відповідному місці, щоб зберегти зображення в реєстрі.

оновлення:

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

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


2
| Тепер змініть файл yaml, щоб використовувати локальний реєстр. Чи можете ви трохи пояснити це? Я натиснув до локального реєстру (крутий трюк), але у мене є та сама проблема, що я не можу отримати minikube для підключення до нього.
Зак Естела

3
@ZachEstela змінить назву зображення в ямлі на<registryIP>:5000/ubuntu
Farhad Farahi

@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

Налаштування в minikube

ssh у minikube з: 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

відредагувати сервісний файл 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-register docker.local: 5000 - незахищений-реєстр 192.168.1.4.1000000

до цієї лінії

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 - провайдер міток = virtualbox --insecure-register 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

З документів kubernetes:

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

Політикою витягування за замовчуванням є IfNotPresent, що призводить до того, що Kubelet може пропустити зображення, якщо воно вже існує. Якщо ви хочете завжди змушувати тягнути, ви можете зробити одне з наступного:

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

Або читайте іншим способом: Використання: найновіший тег змушує зображення завжди тягнути. Якщо ви використовуєте, 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 = ніколи".

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 зображень docker image load -i /path/image.tar.Please запам'ятати , щоб запустити його після 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

Ідеєю було б зберегти докерське зображення локально та пізніше завантажити його у 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

Це так просто і це працює як шарм.


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

1

Що робити, якщо ви могли просто запустити k8s в vm докера? є вбудована підтримка цього з новішими версіями робочого столу docker ... вам просто потрібно включити цю підтримку.

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now- кубернети /

як я це дізнався:

читаючи документи для керма, вони дають вам короткий посібник, як встановити minikube. цей підручник встановлює minikube в vm, який відрізняється / не відрізняється від docker.

тому коли прийшов час встановити свої кермові діаграми, я не зміг отримати кермо / k8s, щоб витягти зображення, які я створив за допомогою докера. ось як я прийшов сюди до цього питання.

так що ... якщо ви можете жити з будь-якою версією k8s, яка постачається з робочим столом docker, і ви можете жити з нею, працюючи в будь-якому докері vm, то, можливо, це рішення трохи простіше, ніж деякі інші.

відмова від відповідальності: не впевнений, як переключення між контейнерами windows / linux вплине на що-небудь.


Я думаю, що мені також довелося встановити параметр imagePullPolicies на IfNotPresent
чад

1

Існує один есе та ефективний спосіб перенести ваш локальний образ Docker безпосередньо на minikube, що заощадить час від створення зображень у minikube знову.

minikube cache add <Image name>

Детальніше тут

Усі можливі способи підштовхування зображень до minikube згадуються тут: 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 не може розпізнати ваш демон-докер, як це незалежна служба. Спочатку потрібно встановити своє середовище minikube-docker, використовуючи команду нижче, щоб перевірити

 "eval $(minikube docker-env)"

Якщо ви запустите команду нижче, вона покаже, де ваша minikube шукає докер.

~$ 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. у файлі артефактів, в розділі spec -> контейнери
додайте 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.