Docker & Kubernetes

환경 변수 API 구현 예시

beekei 2021. 11. 26. 14:52
반응형

 

환경 변수 API 구현 예시

이번에는 d5라고 하는 디렉터리를 만들고 Dockerfile과 my_daemon이라고 하는 2개 파일을 바탕으로 컨테이너를 개발할 것이다.

d5 디렉터리 생성
d5 디렉터리로 이동 
Dockerfile 작성
Dockerfile

FROM을 사용해 베이스 이미지로 apline을 지정했다.

RUN에서는 apk add bash로 bash 셸을 추가했다.

ADD로는 셸 스크립트 my_daemon을 루트 경로에 배치하고 CMD로 컨테이너가 기동할 떄 실행하게 했다.

 

my_daemon은 컨테이너가 기동되면 실행되는 셸 스크립트다.

보통 자바나 파이썬으로 작성한 코드를 컨테이너로 만드는 경우가 많은데 이번에는 간단한 예를 위해 셸 스크립트를 사용했다.

my_daemon 작성
my_daemon

환경 변수 INTERVAL이 없는 경우에는 3초 단위로 현재 시간과 카운트를 표준 출력(STDOUT)에 출력한다.

환경 변수 INTERVAL은 무한 루프 내에서 슬립하는 시간으로 사용된다.

이렇게 컨테이너 내에서 환경 변수를 사용하면 이미지를 다시 빌드할 필요 없이 재활용할 수 있게 된다.

실전에서 많이 사용되기 때문에 꼭 기억해 두자

 

 

컨테이너를 빌드하기 전에 유닛 테스트를 수행한다.

LANG=C는 아스키 코드를 지정하여 date 명령어가 영어로 출력되도록 했다.

첫 실행에서는 3초 간격으로 카운트가 표시된다.

이어서 Ctrl + c로 셸 스크립트를 멈추고 환경 변수 INTERVAL=10으로 설정하고 다시 실행해 보면 10초 간격으로 메세지가 출력되는 것을 확인할 수 있다.

 

 

 

이제 이 셸을 실행하는 컨테이너 이미지를 빌드해보자

컨테이너 이미지 빌드
이미지 목록

이제 컨테이너를 실행해보자.

컨테이너 실행
다른 터미널에서 컨테이너 종료

컨테이너를 실행 후 3이 출력됬을때 다른 터미널에서 컨테이너를 중지해 보면 약 10초 뒤인 6이 찍히고 나서 컨테이너가 종료 되었다.

그리고 컨테이너를 재 실행하면 카운트 값은 초기값으로 돌아가 있는 것을 알 수 있다.

컨테이너를 종료하면 로그는 보존되지만 메모리상의 정보는 없어지기 때문이다.


종료 요청 API 구현 예시

쿠버네티스는 컨테이너를 언제든지 종료할 수 있는 일시적인 존재로 다룬다.

예를 들어, 하드웨어 점검을 위해 컨테이너를 다른 서버에 옮기도록 종료 요청 시그널을 보내는 경우가 빈번하게 발생한다. 그리고 애플리케이션의 버전을 업데이트할 때도 종료 요청 시그널을 보내 컨테이너를 종료 시킨다.

 

그래서 쿠버네티스에서 돌아가는 컨테이너를 개발할 때는 종료 요청 시그널 처리를 구현하는것이 좋다.

종료 요청 시그널에 대한 처리는 프로그래밍 언어나 실행 황견에 따라 다르기 때문에 채택한 환경에 맞게 구현해야 한다.

예를 들어, 자바 서블릿의 경우는 JVM이 종료 요청 시그널을 받으면 destroy 메소드를 호출하기 때문에 destroy 메소드를 적절하게 구현해야 한다.

 

시그널은 유닉스 계열의 운영체제에서 프로세스에게 이벤트를 동기적으로 전달하기 위해 존재한다.

커널로부터 시그널을 받은 프로세스는 인터럽트 된다.

미리 시그널 처리 루틴(시그널 핸들러)을 등록해 두면 시그널을 받았을때 필요한 처리를 수행할 수 있다.

 

컨테이너의 stop과 kill의 차이

docker stop 명령어는 컨테이너의 PID가 1인 프로세스에게 시그널 SIGTERM을 전달하여 종료 처리를 요청한다.

도커의 경우 이 시그널을 보내고 10초를 기다린 뒤 강제 종료한다.

 

docker kill 명령어를 사용하면 컨테이너의 PID가 1인 프로세스가 SIGKILL 시그널을 받고 바로 강제 종료된다.

 

 

 

그러면 시그널을 받아서 종료 처리를 수행하도록 위에 API 예시를 수정해보자.

my_daemon 수정

기동 시 파일에 저장된 상태값을 읽어 들이고 SIGTERM 시그널을 처리하는 부분을 추가했다.

기동 시 컨테이너 안에 save.dat 파일이 있으면 값을 읽어서 변수에 설정한다.

그리고  SIGTERM 시그널을 받으면 변수 COUNT의 값을 파일 save.dat에 쓰고 셸을 정상 종료한다.

 

 

 

이제 새로운 이미지를 만들어 컨테이너를 실행해보자

my_daemon:0.1로 빌드
이미지 목록
myd2 이름으로 컨테이너 실행
다른 터미널에서 myd2 컨테이너 종료
myd2 컨테이너 재시작

COUNT의 값이 5일때 다른 터미널에서 컨테이너를 종료 후 다시 재시작 했을때 COUNT의 값이 이어서 시작하는것을 확인할 수 있다.

컨테이너가 정지할 때 파일에 기록한 값을 재시작 시 읽어 들였기 때문이다.

 

하지만 여전히 문제점이 있다.

컨테이너 안에 파일로 보존한 데이터는 컨테이너가 지워지면 삭제된다.

정식으로 운영하는 서비스에서는 커다란 문제의 소지가 될 수 있다.

반응형