Single concern principle (SCP)
: container 1개에는 1개의 process 만
High observability principle (HOP)
: app readiness / health check API 제공, log를 stdout, stderr 로 뿌리기
Life-cycle conformance principle (LCP)
: SIGTERM 처리 필요, PreStop, PostStart 활용.
Image immutability principle (IIP)
: dev/test/prod 에 모두 같은 이미지 사용하지만, conf 만 다르게 해야한다.
Process disposability principle (PDP)
: 상태를 외부화하거나 분산시켜야하며 응용 프로그램을 시작하고 종료하는 것이 빨라야한다.
Self-containment principle (S-CP)
: 모든 디펜던시는 빌드타임에 이미지에 담고, 환경에 따라 다른 정보는 런타임시에 configMap, Storage에 담을 것
Runtime confinement principle (RCP)
: 컨테이너 app이 필요한 CPU / MEM / Disk 에 대해 고려되어야 함.
Docker 에 log를 관리해주는 기능이 있다.
k8s / Mesos 도 이 기능을 활용한 기능들을 제공
container 안에서 file로 로그를 쌓게되면 컨테이너 종료 혹은 삭제시 로그가 유실됨
log 사이즈가 커지면 DiskFull 이 발생해 해당 호스트 서버가 죽는 일이 일어날 수 가 있음
반드시 파일로 쌓아야 할 경우에는 volume attach 해서 쌓을 것
app 이 SIGTERM 을 받았을 때 처리하던 task 를 마무리하고 종료하도록 처리해준다.
무중단 배포를 위한 필수 사항 중 하나이다.
docker 가 컨테이너를 죽일 때 SIGTERM 을 먼저 주고 SIGKILL 을 통해 죽인다.
이때, sigterm SIGTERM 에 대한 처리가 없으면 앱은 처리하던 task를 내팽개치고 죽어버린다.
init 프로세스가 종료되면 나머지도 다 죽는다
프로세스 별 health check 도 어렵다
프로세스 별 / 목적별 배포가 분리 될 수 있다.
SINGLE CONCERN PRINCIPAL 대로 설계하면 컨테이너 이미지 재사용이 높아진다.
운영이 편리하고 성능 병목이나 이슈 파악이 용이하다.
Build Time 에선 이미지에 담고 run time 에 필요한건 configMap, Storage, Secret 에 담을 것
prod 환경과의 유사성을 최대한 보장한다.
동적인 설정이나 정보는 configMap, Storage, Secret 으로 전달
설정하지 않으면 최소값으로 설정되어 가장 후순위 프로세스가 된다.
호스트 서버에 남는 자원을 사용해서 동작하기 때문에 실서비스 전에는 문제가 없어보이지만, 서버에 부하를 받기 시작하면 다른 프로세스에 밀려 느려지거나 OOM 으로 가장 먼저 정리된다.
개별 컨테이너는 세션 정보 등 상태(state)를 가지면 안된다(외부화 / 분산)
컨테이너 애플리케이션은 언제든 종료되고 다시 시작 될 수 있다는 가정하에 개발해야한다.
애플리케이션의 시작 과 종료는 빨라야 한다.