지난주차부터 무슨이유에선지 오류가떠서 wsl 재설치 후 도커 재설치했더니
이런 오류가 떠서..삽질 2시간넘게 했는데도 실습 불가상태이다.
오라클 서버를 써보자.. 일단 7장시작
(오라클 서버에서도 minikube connection refused됨..오류 해결전까지는 실습 못해 으아악)
모든 애플리케이션은 빌드된 애플리케이션 자체에 포함하지 말아야 하는 설정(배포된 인스턴스별로 다른 세팅, 외부 시스템 액세스를 위한 자격증명 등)이 필요하다.
컨테이너화된 애플리케이션이 어떻게 구성되는지 살펴보자.
설정 데이터를 저장하는 쿠버네티스 리소스를 컨피그맵 이라고 함.
이를 사용해 설정 데이터를 저장할 지 여부에 관계없이 다음 방법을 통해 애플리케이션 구상 가능
시크릿이라는 중요한 오브젝트를 제공하여 보안 유지 정보를 담는데에 씀.
오! 했던거다!
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
쿠버네티스에서 컨테이너를 정의할 때, 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:
이런식으로 ! (문자열값을 따옴표로 묶을 필요 없고 숫자는 묶기)
파드수준에서 환경변수 설정하고 컨테이너에서 상속받는것도 유용하지만 지금은 이러한 옵션이 없음.
<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
→ 파이썬 일 경우