Làm thế nào để sử dụng hình ảnh docker địa phương với Minikube?


299

Tôi có một số hình ảnh docker mà tôi muốn sử dụng với minikube. Trước tiên tôi không muốn phải tải lên và sau đó tải xuống cùng một hình ảnh thay vì chỉ sử dụng hình ảnh cục bộ trực tiếp. Làm thế nào để tôi làm điều này?

Những thứ tôi đã thử:
1. Tôi đã thử chạy các lệnh này (riêng biệt, xóa các trường hợp của minikube cả hai lần và bắt đầu mới)

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

Đầu ra:

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

Nó chỉ bị kẹt ở một số trạng thái nhưng không bao giờ đạt đến trạng thái sẵn sàng.


2. Tôi đã thử tạo một sổ đăng ký và sau đó đưa hình ảnh vào đó nhưng nó cũng không hoạt động. Tôi có thể đã làm điều đó không chính xác nhưng tôi không thể tìm thấy hướng dẫn thích hợp để thực hiện nhiệm vụ này.

Vui lòng cung cấp hướng dẫn để sử dụng hình ảnh docker cục bộ trong trường hợp kubernetes cục bộ.
HĐH: ubfox 16.04
Docker: Docker phiên bản 1.13.1, bản dựng 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"}

Nếu ai đó có thể giúp tôi có được một giải pháp sử dụng docker-compose để làm điều này, điều đó thật tuyệt vời. Cảm ơn.

Biên tập :

Hình ảnh được tải trong 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           

Câu trả lời:


408

Như README mô tả, bạn có thể sử dụng lại daemon Docker từ Minikube với eval $(minikube docker-env).

Vì vậy, để sử dụng hình ảnh mà không cần tải lên, bạn có thể làm theo các bước sau:

  1. Đặt các biến môi trường với eval $(minikube docker-env)
  2. Xây dựng hình ảnh với daemon Docker của Minikube (ví dụ docker build -t my-image .)
  3. Đặt hình ảnh trong thông số kỹ thuật như thẻ xây dựng (ví dụ my-image)
  4. Đặt imagePullPolicythành Never, nếu không Kubernetes sẽ cố tải xuống hình ảnh.

Lưu ý quan trọng: Bạn phải chạy eval $(minikube docker-env)trên mỗi thiết bị đầu cuối mà bạn muốn sử dụng, vì nó chỉ đặt các biến môi trường cho phiên shell hiện tại.


1
AFAIS bạn chỉ có thể làm điều đó với một minukube mới với minikube start --disk-size 100g. Một giải pháp khác là xóa những hình ảnh cũ bằng docker imagesdocker rmi.
svenwltr ngày

6
Rất quan trọng để nhớ chạy eval $(minikube docker-env)sau khi đóng thiết bị đầu cuối mà bạn đang làm việc TRƯỚC KHI bạn cố gắng xây dựng lại hình ảnh ... chỉ cần đốt cháy 6 giờ chiến đấu với một hình ảnh không cập nhật trong minikube ... trông giống như một gói không cập nhật .. thực sự không cập nhật hình ảnh mà minikube đã tham khảo.
Mike

1
Chính sách kéo mặc định IfNotPresentcó nghĩa là tất cả những gì chúng ta phải làm là đặt các biến môi trường.
Beygi

29
Nếu bạn muốn quay lại hoặc thoát env từ minikube ..eval $(minikube docker-env -u)
Budi Mulyo

1
nhìn @nmxl tại đây
testuser

175

Điều gì làm việc cho tôi, dựa trên giải pháp của @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
Bạn có thể tìm thấy phiên bản yml của dòng lệnh trên (liên quan đến imagePullPolicy) tại đây: kubernetes.io/docs/con accept /contersers / images
granadaCoder

127

Câu trả lời này không giới hạn ở minikube!

Sử dụng sổ đăng ký cục bộ:

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

Bây giờ gắn thẻ hình ảnh của bạn đúng cách:

docker tag ubuntu localhost:5000/ubuntu

Lưu ý rằng localhost nên được đổi thành tên dns của máy đang chạy container.

Bây giờ đẩy hình ảnh của bạn đến đăng ký cục bộ:

docker push localhost:5000/ubuntu

Bạn sẽ có thể kéo nó trở lại:

docker pull localhost:5000/ubuntu

Bây giờ thay đổi tập tin yaml của bạn để sử dụng đăng ký cục bộ.

Hãy suy nghĩ về việc gắn khối lượng tại vị trí thích hợp để duy trì hình ảnh trên registry.

cập nhật:

như Eli đã nêu, bạn sẽ cần thêm đăng ký cục bộ là không an toàn để sử dụng http (có thể không áp dụng khi sử dụng localhost nhưng không áp dụng nếu sử dụng tên máy chủ cục bộ)

Đừng sử dụng http trong sản xuất, hãy nỗ lực để đảm bảo mọi thứ.


2
| Bây giờ thay đổi tập tin yaml của bạn để sử dụng đăng ký cục bộ. Bạn có thể giải thích điều này một chút? Tôi đã đẩy đến sổ đăng ký cục bộ (thủ thuật tuyệt vời) nhưng tôi có cùng một vấn đề là tôi không thể có được minikube để kết nối với nó.
Zach Estela

3
@ZachEstela thay đổi tên hình ảnh trong yaml thành<registryIP>:5000/ubuntu
Farhad Farahi

@FarhadFarahi Tôi có thể tìm "tên dns của máy đang chạy container" ở đâu?
Daan

1
@FarhadFarahi Nếu tôi đưa máy tính xách tay của tôi cho bạn, làm thế nào bạn tìm ra? Tôi chỉ muốn biết nó. Tôi đã làm theo các bước hướng dẫn của docker để có được docker cho các cửa sổ đang chạy.
Daan

1
@FarhadFarahi: Vui lòng thêm vào câu trả lời của bạn rằng bạn sẽ cần thêm đăng ký cục bộ là không an toàn để sử dụng http: docs.docker.com/registry/insecure (có thể không áp dụng khi sử dụng localhost nhưng không áp dụng nếu sử dụng tên máy chủ cục bộ ).
Eli Algranti

14

Thêm vào câu trả lời của @Farhad dựa trên câu trả lời này ,

Đây là các bước để thiết lập một đăng ký cục bộ.

Cài đặt trong máy cục bộ

Thiết lập tên máy chủ trong máy cục bộ: chỉnh sửa /etc/hostsđể thêm dòng này

docker.local 127.0.0.1

Bây giờ bắt đầu đăng ký cục bộ (remove -d để chạy chế độ không phải daemon):

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

Bây giờ gắn thẻ hình ảnh của bạn đúng cách:

docker tag ubuntu docker.local:5000/ubuntu

Bây giờ đẩy hình ảnh của bạn đến đăng ký cục bộ:

docker push docker.local:5000/ubuntu

Xác minh rằng hình ảnh được đẩy:

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

Thiết lập trong minikube

ssh vào minikube với: minukube ssh

chỉnh sửa /etc/hostsđể thêm dòng này

docker.local <your host machine's ip>

Xác minh quyền truy cập:

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

Bây giờ nếu bạn cố gắng kéo, bạn có thể gặp lỗi truy cập http.

Cho phép truy cập không an toàn :

Nếu bạn luôn có kế hoạch sử dụng chồn với thiết lập cục bộ này thì hãy tạo một minikube để sử dụng đăng ký không an toàn theo mặc định (không hoạt động trên cụm hiện có).

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

khác làm theo các bước dưới đây:

systemctl stop docker

chỉnh sửa tập tin serice docker: lấy đường dẫn từ systemctl status docker

có thể là :

/etc/systemd/system/docker.service.d/10-machine.conf hoặc /usr/lib/systemd/system/docker.service

nối văn bản này (thay thế 192.168.1.4 bằng ip của bạn)

--insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4 giáp000

đến dòng này

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 - nhà cung cấp nhãn hiệu = virtualbox --insecure-registry 10.0.0.0/24

systemctl daemon-reload
systemctl start docker

thử kéo:

docker pull docker.local:5000/ubuntu

Bây giờ thay đổi tập tin yaml của bạn để sử dụng đăng ký cục bộ.

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

đến

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

Đừng sử dụng http trong sản xuất, hãy nỗ lực để đảm bảo mọi thứ.


12

Ngoài câu trả lời được chấp nhận, bạn cũng có thể đạt được những gì bạn muốn ban đầu (tạo một triển khai bằng runlệnh) bằng lệnh sau:

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

Tôi tìm thấy thông tin về trình tạo trên diễn đàn Kubernetes-dev:

Nếu bạn đang sử dụng kubectl run, nó sẽ tạo một bảng kê khai cho bạn mà imagePullPolicyđược đặt thành Alwaysmặc định. Bạn có thể sử dụng lệnh này để có được một imagePullPolicysố IfNotPresent, mà sẽ làm việc cho minikube:

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

Dan Lorenc

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


9

Một cách tiếp cận là xây dựng hình ảnh cục bộ và sau đó thực hiện:

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

minikube docker-envcó thể không trả về thông tin chính xác đang chạy dưới một người dùng / sudo khác. Thay vào đó bạn có thể chạy sudo -u yourUsername minikube docker-env.

Nó sẽ trả về một cái gì đó như:

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)

Lệnh đúng làdocker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
salvador

1
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)làm việc cho tôi
lhaferkamp


4

Từ các tài liệu kubernetes:

https://kubernetes.io/docs/con accept /contersers / images / # upload-images

Chính sách kéo mặc định là IfNotPftime khiến Kubelet bỏ qua việc kéo hình ảnh nếu nó đã tồn tại. Nếu bạn muốn luôn luôn kéo, bạn có thể thực hiện một trong những thao tác sau:

  • đặt imagePullPolicy của container thành Luôn luôn;
  • sử dụng: mới nhất làm thẻ cho hình ảnh để sử dụng;
  • kích hoạt bộ điều khiển nhập học LuônPullImages.

Hoặc đọc theo cách khác: Sử dụng: thẻ mới nhất buộc hình ảnh phải luôn được kéo. Nếu bạn sử dụng eval $(minikube docker-env)như đã đề cập ở trên, thì không sử dụng bất kỳ thẻ nào hoặc gán thẻ cho hình ảnh cục bộ của bạn, bạn có thể tránh Kubernetes cố gắng kéo nó.



3

Một phương pháp đơn giản hơn để trả lời câu hỏi ban đầu "Cách sử dụng hình ảnh docker cục bộ với Minikube?", Là lưu hình ảnh vào tệp tar và tải nó vào 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

Sau đó chạy hình ảnh liên quan đến một lệnh như sau. Đảm bảo bao gồm tham số "--image-pull-terms = Never".

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

Giải thích tốt, làm việc như một lá bùa. Tôi chỉ phải gọi docker savevới sudo, và sau đó thiết lập sudo chmod 664 my-image.tarđể làm cho nó có sẵn cho người dùng hiện tại của tôi.
Meir Gabay

Đây nên là cách tiếp cận nhanh nhất tôi tin.
Shiwakant Bharti

2

Để thêm vào các câu trả lời trước đó, nếu bạn có hình ảnh tarball, bạn chỉ cần tải nó vào bộ hình ảnh docker cục bộ. docker image load -i /path/image.tarVui lòng nhớ chạy nó sau eval $(minikube docker-env) , vì minikube không chia sẻ hình ảnh với công cụ docker được cài đặt cục bộ.


2

Các câu trả lời khác giả sử bạn sử dụng minikube với VM, vì vậy hình ảnh cục bộ của bạn không thể truy cập được từ minikube VM.

Trong trường hợp nếu bạn sử dụng minikube với --vm-driver=none, bạn có thể dễ dàng sử dụng lại hình ảnh cục bộ bằng cách đặt image_pull_policythành Không bao giờ:

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

hoặc thiết lập imagePullPolicytrường cho cotainers trong các bảng .yamlkê khai tương ứng .


2

Một ý tưởng sẽ là lưu hình ảnh docker cục bộ và sau đó tải nó vào minikube như sau:

Giả sử, ví dụ, bạn đã có hình ảnh puckel / docker-airflow.

  1. Lưu hình ảnh đó vào đĩa cục bộ -

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. Bây giờ nhập vào minikube docker env -

    eval $(minikube docker-env)

  3. Tải hình ảnh được lưu cục bộ đó -

    docker load < puckel_docker_airflow.tar

Nó là đơn giản và nó hoạt động như một nét duyên dáng.


Bạn vẫn cần mẹo trả lời được chấp nhận của Set the imagePullPolicy to Never. Nếu hình ảnh của bạn được gắn thẻ với một địa chỉ, ví dụ như vậy, us.icr.io/mydiv/my-service:v0.0.1việc triển khai sẽ cố gắng kéo hình ảnh này từ xa. Vì bạn đã sao chép hình ảnh theo cách thủ công, bạn cần ngăn k8s kéo hình ảnh từ một địa chỉ (sổ đăng ký container) mà nó không thể truy cập.
colm.anseo

1

Điều gì nếu bạn chỉ có thể chạy k8 trong vm của docker? có hỗ trợ riêng cho việc này với các phiên bản mới hơn của máy tính để bàn docker ... bạn chỉ cần kích hoạt hỗ trợ đó.

https://www.docker.com/blog/kubernetes-is-now-av Available-in-docker-desktop- sóng-kênh / Available-in-docker-desktop- sóng-kênh / https://www.docker.com/blog/docker-windows-desktop-now- kubernetes /

Làm thế nào tôi tìm thấy điều này:

Trong khi đọc tài liệu cho helm, họ cung cấp cho bạn một hướng dẫn ngắn gọn về cách cài đặt minikube. hướng dẫn đó cài đặt minikube trong một vm khác / tách biệt với docker.

Vì vậy, đã đến lúc cài đặt biểu đồ helm của tôi, tôi không thể lấy helm / k8s để kéo các hình ảnh tôi đã xây dựng bằng docker. đó là cách tôi đến đây với câu hỏi này

vì vậy ... nếu bạn có thể sống với bất kỳ phiên bản nào của k8 đi kèm với máy tính để bàn docker và bạn có thể sống với nó chạy trong bất kỳ docker vm nào, thì có lẽ giải pháp này dễ hơn một chút so với một số phiên bản khác.

từ chối trách nhiệm: không chắc chắn cách chuyển đổi giữa các cửa sổ windows / linux sẽ ảnh hưởng đến bất cứ điều gì.


Tôi nghĩ mình cũng phải thiết lập các imagePullPolicies để IfNotPresent cũng
chad

1

Có một bài luận và cách hiệu quả để đẩy hình ảnh Docker cục bộ của bạn trực tiếp lên minikube, điều này sẽ tiết kiệm thời gian từ việc xây dựng hình ảnh trong minikube một lần nữa.

minikube cache add <Image name>

Thêm chi tiết tại đây

Tất cả các phương pháp có thể để đẩy hình ảnh lên minikube được đề cập ở đây: https://minikube.sigs.k8s.io/docs/handbook/pushing/


0

bạn có thể sử dụng lại vỏ docker eval $(minikube docker-env), thay vào đó, bạn có thể tận dụng trên docker save | docker loadcác vỏ.


0
  1. thiết lập minikube docker-env
  2. một lần nữa xây dựng hình ảnh docker tương tự (sử dụng minikube docker-env)
  3. thay đổi imagePullPolicy thành Never trong triển khai của bạn

Trên thực tế những gì xảy ra ở đây, Minikube của bạn không thể nhận ra trình nền docker của bạn vì đây là dịch vụ độc lập. Trước tiên, bạn phải đặt môi trường minikube-docker sử dụng lệnh bên dưới để kiểm tra

 "eval $(minikube docker-env)"

Nếu bạn chạy bên dưới lệnh, nó sẽ hiển thị nơi minikube của bạn tìm 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)

Bạn phải xây dựng lại hình ảnh một khi bạn thiết lập minikube docker-env nếu không nó sẽ thất bại.



0

các bước để chạy hình ảnh docker cục bộ trong kubernetes
1. eval $ (minikube -p minikube docker-env)
2. trong tệp tạo tác, dưới phần spec -> container
thêm imagePullPolicy: IfNotPftime
hoặc 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. sau đó chạy kubectl create -f <filename>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.