Minikube에서 로컬 도커 이미지를 사용하는 방법은 무엇입니까?


299

함께 사용하려는 도커 이미지가 여러 개 있습니다. minikube . 먼저 로컬 이미지를 직접 사용하는 대신 동일한 이미지를 업로드 한 다음 다운로드하지 않아도됩니다. 어떻게해야합니까?

내가 시도한 것들 :
1. 나는이 명령을 실행 하려고 시도했다.

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

는 AS README가 설명합니다, 당신은 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가 참조하고있는 이미지를 업데이트하지 않습니다.
Mike

1
기본 풀 정책은 IfNotPresent환경 변수를 설정하기 만하면됩니다.
Beygi

29
유 minikube에서 백업하거나 종료 ENV 싶다면 ...eval $(minikube docker-env -u)
부디 Mulyo에게

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
여기합니다 (imagePullPolicy에 관해서) 위의 명령 라인의 YML 버전을 찾을 수 있습니다 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 파일을 변경하십시오.

레지스트리에 이미지를 유지하기 위해 적절한 위치에 볼륨을 마운트하는 것을 고려하십시오.

최신 정보:

Eli가 언급했듯이 http 를 사용하려면 안전하지 않은 로컬 레지스트리를 추가해야합니다 (localhost 를 사용할 때는 적용되지 않지만 로컬 호스트 이름을 사용하는 경우에는 적용됨)

프로덕션 환경에서 http를 사용하지 말고 보안을 유지하기 위해 노력하십시오.


2
| 이제 로컬 레지스트리를 사용하도록 yaml 파일을 변경하십시오. 이것을 조금 설명 할 수 있습니까? 로컬 레지스트리 (쿨 트릭)로 푸시했지만 minikube에 연결할 수없는 것과 같은 문제가 있습니다.
Zach Estela

3
에 YAML의 이미지 이름을 변경 @ZachEstela<registryIP>:5000/ubuntu
여보 Farahi

@FarhadFarahi "레지스트리 컨테이너를 실행하는 컴퓨터의 DNS 이름"은 어디에서 찾을 수 있습니까?
Daan

1
@FarhadFarahi 노트북을 주면 어떻게 알 수 있습니까? 난 그냥 알고 싶어 도커 자습서 단계를 따라 Windows 용 도커를 실행했습니다.
Daan

1
@FarhadFarahi : http : docs.docker.com/registry/insecure 를 사용하려면 안전하지 않은 로컬 레지스트리를 추가해야한다는 답변에 답을 추가하십시오 (localhost를 사용할 때는 적용되지 않지만 로컬 호스트 이름을 사용하는 경우에는 적용됨) ).
Eli Algranti

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

docker serice 파일을 편집하십시오. systemctl status docker

그것은 수 있습니다 :

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

이 텍스트를 추가하십시오 (192.168.1.4를 ip로 대체하십시오)

-비보안 레지스트리 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 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됩니다. 당신은 얻을이 명령을 사용할 수 imagePullPolicyIfNotPresent를 위해 작동합니다 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

기본 풀 정책은 이미지가 이미 존재하는 경우 Kubelet이 이미지 풀을 건너 뛰도록하는 IfNotPresent입니다. 항상 강제로 당기려면 다음 중 하나를 수행하십시오.

  • 컨테이너의 imagePullPolicy를 Always로 설정하십시오.
  • 이미지를 사용할 태그로 : latest를 사용하십시오.
  • 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 savesudo한 다음 sudo chmod 664 my-image.tar현재 사용자가 사용할 수 있도록 설정 했습니다.
Meir Gabay

이것이 내가 믿는 가장 빠른 접근법이어야합니다.
Shiwakant Bharti

2

당신이 타르볼 이미지가 있다면, 당신은 단순히 당신에게 이미지의 지역 고정 표시기 세트를로드 할 수 있습니다, 이전 답변에 추가하려면 docker image load -i /path/image.tar그것을 실행하는 것을 잊지 호야 eval $(minikube docker-env) minikube가 로컬에 설치된 고정 표시기 엔진과 이미지를 공유하지 않기 때문에.


2

다른 답변에서는 minikube를 VM과 함께 사용하므로 minikube VM에서 로컬 이미지에 액세스 할 수 없습니다.

로 minikube를 사용하는 경우 Never --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. 이제 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를 들어 이미지에 주소가 태그로 지정된 경우 배포는이 이미지를 원격으로 가져 오려고 시도합니다. 이미 수동으로 이미지를 복사 했으므로 k8이 액세스 할 수없는 주소 (컨테이너 레지스트리)에서 이미지를 가져 오는 것을 억제해야합니다.
colm.anseo

1

docker 's vm 내에서 k8을 실행할 수 있다면 어떨까요? 최신 버전의 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- 쿠 버네 티스 /

내가 이것을 어떻게 찾았습니까?

조타 문서를 읽는 동안 미니 쿠브 설치 방법에 대한 간단한 자습서를 제공합니다. 이 튜토리얼은 minikube를 docker와 다르거 나 별도의 vm에 설치합니다.

그래서 조타 차트를 설치할 시간이되었을 때, 도커를 사용하여 만든 이미지를 가져 오기 위해 조타 장치 / k8을 얻을 수 없었습니다. 이것이 제가이 질문에 도착한 방법입니다.

따라서 ... 도커 데스크톱과 함께 제공되는 k8의 모든 버전으로 살 수 있고 vm도 커가있는 곳에서 실행하여 살 수 있다면이 솔루션은 다른 솔루션보다 약간 더 쉽습니다.

면책 조항 : Windows / Linux 컨테이너 간 전환이 어떤 영향을 미칠지 확실하지 않습니다.


나는 또한뿐만 아니라 IfNotPresent에 imagePullPolicies을 설정할 수 있다고 생각
차드

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를 Never 로 변경

실제로 여기에서 발생하는 상황에서 Minikube는 독립 서비스이므로 도커 데몬을 인식 할 수 없습니다. 먼저 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를 설정하면 이미지를 다시 빌드해야합니다. 그렇지 않으면 이미지가 실패합니다.



0

kubernetes에서 로컬 도커 이미지를 실행하는 단계
1. eval $ (minikube -p minikube docker-env)
2. 아티팩트 파일의 spec 섹션 아래-> 컨테이너
추가 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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.