Docker
15단계로 배우는 Docker와 쿠버네티스: 컨테이너 API(10)
the best infra
2025. 1. 1. 02:10
* 컨테이너 API 이란?
- 컨테이너 API는 컨테이너를 블랙박스처럼 다룰 수 있게 해주는 인터페이스이다.
- 먼저 API는 애플리케이션 인터페이스라고 하며. 인터페이스는 본래 케이프이나 하드웨어 규격을 의미한다.
- 이렇듯 API는 애플리케이션들을 연결하기 위해서 지켜줘야 할 규격이라고 생각하면 된다.
* 컨테이너 API의 종류와 개요.
- 애플리케이션의 특성에 맞게 API를 선택하여 구현해야 한다.
- 컨테이너 API 목록
- 컨테이너 기동 : 컨테이너 내의 애플리케이션은 기동 시에 환경 변수나 실행 인자를 읽어서 그에 맞게 동작하게 만들 수 있다.
- 헬스 체크 : 컨테이너의 애플리케이션이 초기화가 완료되어 외부로부터의 요청을 받을 수 있게 되었음을 알리는 인터페이스이다.
- 컨테이너 종료 : 컨테이너 내의 애플리케이션은 종료 요청 시그널에 대한 종료 처리를 구현하는 것이 좋다.
- 기타 지원(메모리 요구량, CPU 요구량, 접속 네트워크) :
- 가동 로그 : 마이크로서비스 아키텍처를 사용하고 규모가 커지게 되면 보통 많은 수의 컨테이너를 돌리게 된다. 컨테이너의 표준 출력과 출력 오류를 로그로 간직한다.
- 종료 상태 : PID가 1인 프로세스의 EXIT 코드가 컨테이너의 종료 코드로 설정된다. 컨테이너상의 애플리케이션은 적절하게 종료 코드를 반환하도록 구현해야 한다.
- 퍼시스턴트 볼륨 : 컨테이너는 알사적인 존재이기 때문에 보관이 필요한 데이터를 파일 시스템에 저장해서는 안 된다.
- 훅 : 훅은 컨테이너 실행 전후에 동작하는 코드나 스크립트를 말하며, 컨테이너의 상태 변경 이벤트에 대한 특정 작업을 정의할 수 있다.
- 서비스 : 컨테이너가 제공하는 서비스를 정의하고 관리할 때는 클라이언트와의 연결과 서비스 지속성이 중요.
- 컨테이너 기동 : 컨테이너가 시작할 때 애플리케이션이 제대로 기동 되고, 외부 의존성을 확인하는 것이 중요.
* 종료 요청 API 구현 예
- 시그널은 유닉스 계열의 운영체제에서 프로세스에게 이벤트를 비동기적으로 전달하기 위해 존재한다.
- 커널로부터 시그널을 받은 프로세스는 인터럽트 된다. 미리 시그널 처리 루틴을 등록해 두면 시그널을 받았을 때 필요한 처리를 수행할 수 있다.
- 예제코드 (dockerfile)
FROM alpine:latest # bash 설치 RUN apk update && apk add bash # my_daemon 추가 및 실행 권한 부여 ADD ./my_daemon /my_daemon RUN dos2unix /my_daemon && chmod +x /my_daemon # 실행 CMD ["/bin/bash", "/my_daemon"]
- 예제코드 (my_daemon)
#!/bin/bash # 카운터 초기화 COUNT=0 # 환경 변수가 없으면 설정 if [ -z "$INTERVAL" ]; then INTERVAL=3 fi # 기동 시 상태 획득 <-- 추가 처리 #1 if [ -f save.dat ]; then COUNT='cat.save.dat' rm -f save.dat fi # SIGTERM 수신 시 처리 save() { echo $COUNT > save.dat exit 0 } trap save TERM # 메인 루프 while [ true ]; do TM=$(date | awk '{print $4}') printf "%s : %s \n" $TM $COUNT let COUNT=COUNT+1 sleep $INTERVAL done
- 실행 결과