[kubernetes] minikube에서 로컬 docker image 사용하기

 

l  Kubernetes, Docker

 

일반적으로 로컬 컴퓨터에서 쿠버네티스(Kubernetes) 테스트할 minikube 환경을 많이 사용한다. 도커 데스크탑(docker desktop) 설치된 환경에서도 쿠버네티스를 활성화하면 minikube 활성화되어 동작한다. 이러한 환경에서 kubectl run 또는 yaml 파드를 생성할 , 로컬의 이미지를 사용할 경우 이미지를 가져올 없다는 오류와 함께 파드가 생성된 종료된다. 이번 포스트에서는 minikube 환경에서 로컬의 docker image 사용하여 파드를 생성하는 방법을 알아본다.

 

로컬의 docker images에서 커스텀 빌드된 이미지 proxysql 있다.

 

로컬의 도커 이미지를 사용하여 파드를 생성하면 오류가 발생한다.

kubectl run my-proxysql --image=proxysql

 

 

오류를 살펴보면 ErrImagePull이라는 상태 메시지를 있는데, 상태를 자세히 확인하기 위해 kubectl describe 명령을 사용하여 상세 메시지를 확인한다.

kubectl describe pods my-proxysql

 

 

마지막에 오류 메시지를 보면, 이미지를 가져올 없어 발생한 오류라는 것을 확인할 있다.

Failed to pull image "proxysql": rpc error: code = Unknown desc = Error response from daemon: pull access denied for proxysql, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

 

일반적으로 생각할 , 쿠버네티스를 사용하여 파드를 생성하면, 로컬의 이미지를 사용할 알았는데 그렇지 않다. 그래서 minikube에서 로컬의 이미지를 사용할 있도록 minikube 도커를 연결해야해는데, 다행히 쿠버네티스에서는 공식적으로 이러한 부분을 지원하고 있다.

 

아래 명령어를 사용하면, 현재 minikube에서 도커 host 연결할 있는 방법을 알려준다. 결과 정보를 바탕으로 일일이 등록해도 되지만, 마지막줄에서 도커 호스트와 한번에 연결할 있는 명령어를 제공하기 때문에 그대로 복사해서 사용할 있다.

minikube docker-env

 

 

마지막 줄의 명령어를 실행하여 minikube에서 docker host 연결한다.

eval $(minikube -p minikube docker-env)

 

명령어실행 도커에서 컨테이너를 조회해 보면 쿠버네티스의 컨테이너가 조회되는 것을 확인할 있다.

 

지금부터는 docker 이미지가 minikube에서 동작하는 driver(docker) 연결되었기 때문에 이제부터 생성되는 docker image minikube 위에 생성하게 된다.

 

다시 한번 이미지를 빌드 한다. 이번에는 이전과 차별을 두기 위해 my-proxysql 이라는 이름으로 이미지를 생성하였다.

docker build -t my-proxysql .

 

아래 명령을 사용하여 minikube 이미지 목록을 확인한다. 방금 빌드한 이미지 목록을 확인할 있다.

minikube image ls --format table

 

 

아래 명령을 사용하여 파드를 실행한다. 이때 로컬의 이미지를 사용하도록 --image-pull-policy=Never 옵션을 함께 사용한다. 정상적으로 파드가 실행중인 것을 확인할 있다.

kubectl run my-proxysql1 --image=my-proxysql --image-pull-policy=Never --restart=Never

 

 

 

[참고자료]

l  https://minikube.sigs.k8s.io/docs/handbook/pushing/#1-pushing-directly-to-the-in-cluster-docker-daemon-docker-env

l  https://www.baeldung.com/docker-local-images-minikube

l  https://egkatzioura.com/2020/03/08/use-local-docker-image-on-minikube/

 

 

 

2023-09-07 / Sungwook Kang / https://sungwookkang.com

 

 

도커파일, dockerfile, minikube, Kubernetes, 로컬이미지 사용, 파드생성, pod create, 도커이미지

[Docker] 컨테이너실행시 sh 스크립트 호출과 매개변수 사용

 

l  Docerk, Shell script

 

Dockerfil 제작하면서, 컨테이너 실행시 특정 스크립트를 실행할 , 스크립트 실행에 필요한 파라메터 값을 받아오지 못하는 문제가 있었다. (도커의 문제가 아닌 나의 코드 오류 문제) 단독으로 스크립트를 실행하면 정상적으로 실행되는데, 유독 컨테이너 실행시에만 값을 받지 못하였다. 해결 방법은 매우 간단하게 Dockerfile에서 사용한 ENV 환경변수를 그대로 스크립트에서 사용하면 되는거였다. (너무 어렵게 생각해서 문제를 해결하지 못한 것이었다.)

 

[잘못된 예시]

abc.sh에서 인풋 변수로 값을 사용할 있도록 read 명령어를 사용하였으며, 해당 변수로 받은 값을 출력하려고 작성.

abc.sh
#!/usr/bin/env bash
 
read var1
read var2
 
echo $var1
echo $var2

 

컨테이너 실행시 ENTRYPOINT에서 abc.sh 실행하면서 파라메터를 전달하려고 작성.

Dockerfile
FROM ~~~~
 
ENV sh_var1 var1_value
ENV sh_var2 var2_value
 
ENTRYPOINT [“abc.sh”, “$sh_var1”, “$sh_var2”]

 

 

[정상 예시]

abc.sh
#!/usr/bin/env bash
 
#read var1 <- 인풋 변수 삭제
#read var2 <- 인풋 변수 삭제
 
echo $sh_var1 #<- dockerfile ENV 변수를 그대로 가져다 사용
echo $sh_var2 #<- dockerfile ENV 변수를 그대로 가져다 사용

 

Dockerfile
FROM ~~~~
 
ENV sh_var1 var1_value
ENV sh_var2 var2_value
 
ENTRYPOINT [“abc.sh”] #<- ENTRYPOINT호출시 sh 파일만 실행

 

 

물론 방법 외에도 다양한 사용법이 있을텐데, 우선 나의 코드에서는 각각의 변수를 호출해서 사용하려고 해서 발생한 문제로, 도커파일과 스크립트간의 매개변수 전달에 대한 이해가 부족해서 발생한 문제였다.

 

 

 

 

2023-09-07 / Sungwook Kang / https://sungwookkang.com

 

 

도커파일, dockerfile, 쉘스크립트, shell script, 매개변수, 도커환경변수, docker env, shell read

[Kubernetes] 쿠버네티스에서 파드 생성시 프라이빗 레지스트리 이미지 사용하기

 

l  Kubernetes

 

Kubernetes 환경에서 pod 생성할 Private Registry에서 이미지를 다운받아 실행하는 방법에 대해서 알아본다.

 

현재 구성되어 있는 실습 환경은 MAC OS + PODMAN + MINIKUBE이다. 일반적으로 많이 사용하는 docker 환경은 아니지만 사용법이 거의 유사하기 때문에 따라하는데 크게 문제가 없으리라 생각한다. Minikube 설치 Podman 설치는 공식 문서에 쉽게 설명되어 있기 때문에 여기에서는 다루지 않는다.

 

l  Podman Installation Instructions : https://podman.io/docs/installation

l  minikube start : https://minikube.sigs.k8s.io/docs/start/

 

실습 시나리오는 아래와 같다.

1.       Dockerfile 작성

2.       컨테이너 이미지 빌드

3.       Docker Hub 개인 저장소에 이미지 푸시

4.       쿠버네티스에서 프라이빗 시크릿키 생성

5.       YAML 파일 작성

6.       Pod 생성

 

사용자 커스텀 이미지를 만들기 위해 Dockerfile 작성한다. Dockerfile 작성에 관한 방법은 다른 문서를 참고한다. 도커 허브의 공식 이미지 저장소에서는 Dockerfile 대한 샘플코드를 제공한다. 아래는 proxysql 공식 저장소이다.

l   https://hub.docker.com/r/proxysql/proxysql

 

 

 

 Dockerfile 작성이 완료되었으면, 이미지를 빌드 한다. Podman 명령어는 도커 명령어와 거의 유사하기 때문에 어려움 없이 사용할 있다. 아래 스크립트는 Dockerfile 빌드하여 컨테이너 이미지를 생성하고, 현재 생성되어 있는 이미지를 확인한다.

podman build -t proxysql-sw:1.0.0 .
 
podman images

 

 

 

podman에서는 도커 레지스트리에 push하기 위해 로그인 과정이 필요하다. 도커 허브의 로그인은 아래와 같은 명령어를 사용한다. 로그인은 ID, 패스워드로 인증한다.

podman login docker.io

 

 

 

이미지를 푸시 하기 위해서는 이미지 ID 필요하다. Podman images명령을 사용하여 확인한 이미지ID 사용하여 도커 허브의 프라이빗 레지스트리로 푸시 한다.

podman push 561f3e4999fddocker.io/<개인저장소 경로>

 

 

쿠버네티스에서 파드 생성시 사용할 프라이빗 레지스트리에 대한 시크릿 키를 생성한다. 시크릿 키에 대한 생성은 여러 방법이 있지만 여기에서는 커맨드 라인에서 자격증명을 통한 시크릿 키를 생성한다. 아래 예제에서는 시크릿 이름은 regcred 생성한다.

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

 

l   <your-registry-server> : 프라이빗 도커 저장소의 FQDN 주소로, 도커허브(DockerHub) https://index.docker.io/v1/ 사용

l   <your-name> : 도커 사용자의 계정

l   <your-pword> : 도커 사용자의 비밀번호

l   <your-email> : 도커 사용자의 이메일 주소

 

키가 정상적으로 생성되었는지는 아래 명령으로 확인 가능하다. 명령을 실행하면 키에 대한 자세한 정보를 확인할 있다.

kubectl get secret regcred --output=yaml

 

 

쿠버네티스에서 파드 생성시 사용할 YAML 파일을 작성한다. YAML에서 시크릿 키를 사용할 있도록 imagePullSecrets 항목에서 시크릿키 이름을 입력한다.

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

 

 

YAML파일을 사용하여 쿠버네티스 파드를 생성한다.

kubectl apply -f my-private-reg-pod.yaml

 

 

도커허브의 개인 저장소 이미지를 사용하여 파드가 정상적으로 생성된 것을 확인할 있다.

kubectl get pod 

 

 

 

지금까지 도커 허브의 프라이빗 레지스트리에서 이미지를 받아 파드를 생성하는 방법에 대해서 알아보았다. 원래 나의 목적은 로컬( 컴퓨터)에서 이미지를 빌드한 다음 로컬 저장소의 이미지를 사용하여 쿠버네티스 파드를 생성하려고 하였는데, podman에서 생성한 이미지를 minikube에서 찾지 못하여 (정확히는 내가 모르는 ) 도커 허브를 사용하는 방향으로 실습하였다. 이후 작업으로 로컬 저장소에서 파드를 생성하는 방법을 추가적으로 알아볼 예정이다.

 

 

[참고자료]

l  Podman Installation Instructions : https://podman.io/docs/installation

l  minikube start : https://minikube.sigs.k8s.io/docs/start/

l  docker hub : https://hub.docker.com/

l  프라이빗 레지스트리에서 이미지 받아오기 : https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/

 

 

 

 

2023-08-09 / Sungwook Kang / https://sungwookkang.com

 

 

쿠버네티스, Kubernetes, 미니쿠베, minikube, 도커, 도커허브, 컨테이너, 도커파일, dockerfile, yaml, 도커 레지스트리, 프라이빗 레지스트리, podman, 파드맨, 도커빌드. 이미지빌드

Docker Compose

-         여러개의 컨테이너를 설정하고 생성하기

 

·         Version : Docker

 

Docker compose 명령은 여러개의 컨테이너 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성한다. 도커 컴포즈의 설정 파일(docker-compose.yml) run 명령어 옵션을 그대로 사용할 있으며 컨테이너의 의존성, 네트워크, 볼륨, 컨테이너 등을 유동적으로 조절할 있다.  예를 들어 파이썬 프로그램이 구동되는 컨테이너와 데이터를 저장하는 redis 서버,  웹서버 컨테이너를 실행한다고 , 각각의 run 명령어 다양한 옵션으로 컨테이너를 생성하고 테스트하기에는 매우 번거롭다. 이때 도커 컴포즈를 활용하면 편리하다.

 

도커 컴포즈는 컨테이너 설정이 정의된 YAML 파일을 읽어 도커 엔진을 통해 컨테이너를 생성한다.


아래 스크립트는 docker-compose.yml 예제 스크립트이다. YAML 파일에서 들여쓰기 , 도커 컴포즈는 TAP 인식하지 못하기 때문에 2개의 공백(Space) 사용하여 하위 항목을 구분한다.

[docker-compose.yml]

version: "3"

services:

  web:

    # replace username/repo:tag with your name and image details

    image: username/repo:tag

    deploy:

      replicas: 5

      restart_policy:

        condition: on-failure

      resources:

        limits:

          cpus: "0.1"

          memory: 50M

    ports:

      - "80:80"

    networks:

      - webnet

  visualizer:

    image: dockersamples/visualizer:stable

    ports:

      - "8080:8080"

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      placement:

        constraints: [node.role == manager]

    networks:

      - webnet

  redis:

    image: redis

    ports:

      - "6379:6379"

    volumes:

      - "/home/docker/data:/data"

    deploy:

      placement:

        constraints: [node.role == manager]

    command: redis-server --appendonly yes

    networks:

      - webnet

networks:

  webnet:

·         Version : YAML 파일 포맷 버전

·         Service : 생성될 컨테이너들을 묶어 놓는 단위. 서비스 항목 아래에 컨테이너에 적용될 옵션을 지정

·         Web, visualizer, redis : 생성될 서비스 이름. 항목 아래에 컨테이너가 생성될 필요한 옵션을 지정

·         image : 컨테이너를 생성할 사용될 이미지 이름

·         link : docker run --link 같으며 다른 서비스에서 서비스명만으로 접근할 있도록 설정

·         environment : docker run --env, -e 옵션과 동일. 컨테이너 내부에서 사용할 환경변수 지정

·         command : 컨테이너가 실행될 수행할 명령어를 설정.

·         ports : docker run -p 같으며 컨테이너를 개방할 포트를 설정.

·          

 

도커 컴포즈 관련 옵션은 매우 다양하게 지원되므로 자세한 내용은 공식 문서를 참고 있도록 한다.

·         Get Started with Docker Compose : https://docs.docker.com/compose/gettingstarted/

 

도커 컴포즈로 컨테이너를 생성하는 명령은 docker-compose up -d이다. 어떠한 설정도 하지 않으면 기본적으로 로컬 디렉터리의 docker-compose.yml 파일을 읽어 로컬의 도커 엔진에서 생성한다. 컨테이너 생성이 완료되면 docker ps에서 실행된 컨테이너를 확인할 있다.

docker-compose up -d

 

 

 

 

[참고자료]

·         Get Started with Docker Compose : https://docs.docker.com/compose/gettingstarted/

 

 

2019-02-17 / Sungwook Kang / http://sqlmvp.kr

 

Docker,  dockerfile, docker build, 도커 파일, 도커 이미지 생성, dockerfile reference, docker compose, 도커 컴포즈, 도커 컨테이너, docker container

Docker build

-         Dockerfile 이용해서 이미지 생성하기

 

·         Version : Docker

 

Docker build 명령은 dockerfile 이용해서 이미지를 만드는 작업을 한다. dockerfile에는 이미지 생성시 필요한 작업이 스크립트로 작성되어 있다.

·         dockerfile : http://sqlmvp.kr/221465287824

 

아래 스크립트는 docker build 사용해서 이미지를 생성한다.

docker build -t makeimage:0.0 ./

 

·         -t : 생성될 이미지의 이름을 설정. 스크립트에서는 makeimage:0.0 라는 이름의 이미지가 생성된다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 생성된다.

·         ./ : build 명령어 끝에는 dockerfile 저장된 경로를 입력한다. 로컬 디렉터리의 dockerfile 사용할 수도 있으며 외부 URL로부터 dockerfile 내용을 가져와 빌드할 있다. 예제에서는 로컬의 현재 디렉터리(./) 입력했다.

 

Build 시작하면 dockerfile 내용이 실행되며 실행 단계가 출력된다.

 


빌드가 완료되면 docker image에서 생성된 이미지를 확인할 있다.

 


docekrfile에서 명령어가 하나씩 실행될 때마다 새로운 컨테이너가 하나씩 생성되며 이미지로 커밋한다. 명령어가 실행될 때마다 이전 스텝의 이미지에 명령어가 실행되고 새로운 이미지 레이어로 저장된다.

[출처 : https://openliberty.io/blog/2018/06/29/optimizing-spring-boot-apps-for-docker.html]

 

dockerfile 만들 주의할 점은 불필요한 작업으로 이미지 사이즈가 커지지 않도록 해야 한다. 예를들어 100MB 크기의 파일을 만들어 컨테이너에 할당하고 다시 삭제하는 명령이 있을때, dockerfiles 이미지를 빌드하면서 단계마다 이미지 레이어를 만드는데,  최종 빌드가 완료된 상태에서 이미지에는 100MB크기의 파일이 존재하지 않지만 이미지의 크기는 기존 이미지에 100MB 더한 크기를 가지고 있다. , 파일을 삭제 했다는 레이어를 가지고 있으므로 실제론 파일이 없더라고 공간은 차지한다. 이러한 현상을 방지하기 위해서는 dockerfile 작성할때 && 기호로 run 명령을 하나로 묶는것이다. 여러개의 명령을 run  하나에서 실행하도록 하면 된다.

FORM ubuntu:14.04

RUN mkdir /test && dummyfile -l 100m /test/dummy && rm /test/dummy

 

만약 다른 사람이 빌드한 이미지에 불필요한 이미지 레이어가 있으면 해당 이미지로 컨테이너를 생성하고  docker export, import 명령어를 사용해 컨테이너를 이미지로 만들면 레이어가 1개로 줄어들어 이미지의 크기를 줄일 있다. 그러나 이전 이미지에 저장된 각종 이미지 설정은 삭제되므로 주의해야 한다.

 

Docker build 다양한 옵션이 있으므로 공식 문서를 참고할 있도록 한다.

·         docker build : https://docs.docker.com/engine/reference/commandline/build/

 

 

2019-02-14 / Sungwook Kang / http://sqlmvp.kr

 

Docker,  dockerfile, docker build, 도커 파일, 도커 이미지 생성, dockerfile reference

Docker file

-         이미지 생성시 필요한 작업을 스크립트로 만들기

 

·         Version : Docker

 

컨테이너를 생성하는 방법은 베이스 이미지를 이용하여 위에 다양한 애플리케이션을 설치하는 방법, 또는 이미 모든 환경이 구성된 컨테이너를 이미지로 만드는 방법 다양하다.

·         Docker Image생성 : http://sqlmvp.kr/221461385385

·         Docker Image 추출 : http://sqlmvp.kr/221463568253

 

이번 포스트에서는  Dockerfile 이용해서 이미지를 생성하는 방법에 대해서 알아본다. Dockerfile 이미지를 생성하기 위해 컨테이너에 설치해야하는 패키지, 추가해야하는 소스코드, 실행시 필요한 명령어, 스크립트 등을 하나의 파일로 생성한 것이다. Build명령을 실행하면 Dockerfile 읽어 이미지를 생성한다. Dockerfile 사용하면 직접 컨테이너를 생성, 커밋, 배포하는 번거로움을 있으며 배포 자동화에 용이하다.

 

도커 엔진에서는 Dockerfile 읽어들일때 기본적으로 현재 디렉터리에 있는 Dockerfile이라는 이름을 가진 파일을 선택한다. 아래 스크립트는 Dockerfile 예시이며 명령의 기능에 대해서 살펴본다.

 


# Use an official Python runtime as a parent image

FROM python:2.7-slim

 

LABEL "purpose"="practice"

 

# Set the working directory to /app

WORKDIR /app

 

# Copy the current directory contents into the container at /app

COPY . /app

 

# Install any needed packages specified in requirements.txt

RUN pip install --trusted-host pypi.python.org -r requirements.txt

 

# Make port 80 available to the world outside this container

EXPOSE 80

 

# Define environment variable

ENV NAME World

 

# Run app.py when the container launches

CMD ["python", "app.py"]

 

Dockerfile 명령은 위에서 아래로 차례대로 실행한다.

·         FROM : 생성할 이미지의 베이스 이미지를 입력한다. 이미지가 로컬에 없다면 자동으로 도커허브에서 pull 한다.

·         LABEL : “:형태로 이미지에 메타데이터 추가. 추가된 메타 데이터는 docker inspect 명령어로 확인가능.

·         WORKDIR : 명령어를 실행할 디렉터리를 나타냄. Bash에서 cd 명령과 동일한 기능이다.

·         COPY : 로컬 디렉터리의 파일을 이미지에 복사하는 역할. ADD 다른 점은 COPY 로컬 디렉터리만 가능하고 ADD 외부 URL tar 파일도 추가 가능하다.

·         RUN : 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행.

·         EXPOSE : Dockerfile 빌드로 생성된 이미지에서 노출할 포트를 설정

·         CMD : 컨테이너가 시작될 때마다 실행할 명령어(커맨드) 설정, Dockerfile에서 한번만 사용할 있다.

 

위의 예제를 정리해보면 아래와 같다.

Python:2.7-slim 베이스 이미지를 사용하며 생성될 이미지의 라벨은 “purpose=practice” 설정한다. 작업디렉터리를 /app 변경한다음 로컬의 ./app 디렉터리의 내용을 이미지로 복사한다. 그리고 pip inatall명령을 컨테이너 내부에서 실행하고 컨테이너는 80 포트를 사용한다. 마지막으로 python 명령으로 app.py 실행한다.

 

Dockerfile 다양한 명령어를 지원하며 자세한 내용은 아래 링크를 참고 한다.

·         Dockerfile reference : https://docs.docker.com/engine/reference/builder/

 

 

 

 

2019-02-13 / Sungwook Kang / http://sqlmvp.kr

 

Docker,  dockerfile, docker build, 도커 파일, 도커 이미지 생성, dockerfile reference

+ Recent posts