지난주차부터 무슨이유에선지 오류가떠서 wsl 재설치 후 도커 재설치했더니

Untitled

이런 오류가 떠서..삽질 2시간넘게 했는데도 실습 불가상태이다.

오라클 서버를 써보자.. 일단 7장시작

(오라클 서버에서도 minikube connection refused됨..오류 해결전까지는 실습 못해 으아악)


모든 애플리케이션은 빌드된 애플리케이션 자체에 포함하지 말아야 하는 설정(배포된 인스턴스별로 다른 세팅, 외부 시스템 액세스를 위한 자격증명 등)이 필요하다.

7.1 컨테이너화된 애플리케이션 설정

컨테이너화된 애플리케이션이 어떻게 구성되는지 살펴보자.

  1. 일반적으로 명령줄 인수로 애플리케이션에 필요한 설정을 넘겨주는것으로 시작한다.
  2. 이후 설정이 커지면 설정을 파일에 저장해서 사용
  3. 환경변수 사용

설정 데이터를 저장하는 쿠버네티스 리소스를 컨피그맵 이라고 함.

이를 사용해 설정 데이터를 저장할 지 여부에 관계없이 다음 방법을 통해 애플리케이션 구상 가능

시크릿이라는 중요한 오브젝트를 제공하여 보안 유지 정보를 담는데에 씀.

7.2 컨테이너에 명령줄 인자 전달

7.2.1 도커에서 명령어와 인자 정의

오! 했던거다!

ENTRYPOINT와 CMD 이해

Docker file 에서 두개의 지침은 다음 두부분을 정의함

CMD 명령어를 사용해 이미지가 실행될 때 실행할 명령어를 지정할 수 있지만 올바른 방법은 ENTRYPOINT 명령어로 실행하고 기본 인자를 정의하려는 경우에만 CMD를 지정하는 것이다.

$docker run <image>
$docker run <image><arguments>

shell 과 exec 형식간의 차이점

shell 형식 - 예 : ENTRYPOINT node app.js

exec 형식 - 예 : ENTRYPOINT [”node” , ”app.js”] → 이렇게 하면 컨테이너 내부에서 node 프로세스를 직접 실행한다.

차이점은 정의된 명령을 shell로 호출하는지 여부이다.

프로세스 목록을 나열해보면, shell형식 명령에서는

쉘 프로세스가 메인 프로세스이므로 ENTRY POINT 명령에서 exec 형식을 사용해 실행한다.

docker exec 이미지 ps x -> exec
docker exec -it 이미지 ps x -> shell

fortune 이미지에서 간격을 설정할 수 있도록 만들기

이야 딱 쉘 스크립트다.. 어제 공부한거 우찌 알고 신기하네

반복하는 주기 변경할 수 있도록 했다고 함.

#!/bin/bash
trap "exit" SIGINT

INTERVAL=$1
echo Configured to generate new fortune every $INTERVAL seconds

mkdir -p /var/htdocs

while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep $INTERVAL
done

INTERVAL 변수를 추가하고 첫번째 명령줄 인자의 값(=$1)으로 초기화 한다.

Dockerfile을 수정해 exec 버전 ENTRY POINT 명령을 사용하도록 하고 기본간격으로 10초를 CMD명령으로 지정

FROM ubuntu:latest

RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT ["/bin/fortuneloop.sh"] exec 형태의 ENTRYPOINT 명령
CMD ["10"] 실행할 때 사용할 기본 인자

인자라는게 그소리였구나 $1 !! 이제알았네

오오 이해된다.

이미지를 빌드하고 도커 허브에 푸시, 이미지 태그를 latest 대신 args로 지정한다.

docker build -t docker.io/luksa/fortune:args .
docker push docker.io/luksa/fortune:args

로컬에서 도커로 이미지 실행해 테스트해보기

docker run -it docker.io/luksa/fortune:args

10초의 시간간격을 두고 구성되며,

기본 시간간격을 인자로 전달해 재정의 가능하다.

docker run -it docker.io/luksa/fortune:args 15

7.2.2 쿠버네티스에서 명령과 인자 재정의

쿠버네티스에서 컨테이너를 정의할 때, ENTRYPOINT 와 CMD를 둘 다 재정의 할 수 있다.

그러기 위해 다음과 같이 컨테이너 정의 안에 command 와 args 속성을 지정한다.

kind: Pod
spec:
	containers:
	- image: ome/image
		command: ["/bin/command"]
		args: ["arg1", "arg2", "arg3"]

대부분 사용자 정의 인자 만 지정하고 명령을 재정의 하는 경우는 거의 없다.

<aside> 💡 command 와 args 필드는 파드 생성 이후에 업데이트 할 수 없다.

</aside>

도커 쿠버네티스 설명
ENTRYPOINT command 컨테이너 안에서 실행되는 실행파일
CMD args 실행파일에 전달되는 인자

사용자 정의 주기로 fortune 파드 실행

apiVersion: v1
kind: Pod
metadata:
  name: fortune2s 파드 이름 변경
spec:
  containers:
  - image: luksa/fortune:args 
    args: ["2"] 2초마다 새로운 fortune메시지 생성하도록 인자 지정 , 배열 표기법
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

배열 표기법은 하나 혹은 몇개의 인자를 가진 경우 유용하다.

여러 인자를 가졌을경우

args:

이런식으로 ! (문자열값을 따옴표로 묶을 필요 없고 숫자는 묶기)

7.3 컨테이너의 환경변수 설정

파드수준에서 환경변수 설정하고 컨테이너에서 상속받는것도 유용하지만 지금은 이러한 옵션이 없음.

<aside> 💡 컨테이너 명령이나 인자와 마찬가지로 환경변수 목록도 파드 생성 후에는 업데이트 할 수 없다.

</aside>

환경변수로 fortune 이미지 안에 간격을 설정할 수 있도록 만들기

#!/bin/bash
trap "exit" SIGINT

echo Configured to generate new fortune every $INTERVAL seconds

mkdir -p /var/htdocs

while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep $INTERVAL
done

INTERVAL 변수를 초기화 하는 행을 제거했다.

→ 애플리케이션이 자바로 작성된경우

System.getenv(”INTERVAL”)

→ NodeJS일경우

process.env.INTERVAL

→ 파이썬 일 경우