리눅스의 Namespace + Cgroups 기반으로 컨테이너를 쉽게 만들고 실행하고 배포하도록 도와주는 플랫폼
우리가 직접 컨테이너를 만드려면
등을 직접 해야 하는데, 도커가 이 모든 과정을 지능적으로 자동화해주는 도구
K8s를 하기 위해 반드시 알아야 할 개념은 아래 6개다
이걸 순서대로 자세히 풀어보자
이미지는 컨테이너를 실행하기 위한 모든 것이 담긴 스냅샷
즉, Image = 실행을 위한 전체 Runtime + App이 포함된 읽기 전용 파일 시스템
컨테이너는 이미지 기반으로 실행되는 격리된 프로세스
컨테이너는 VM이 아님, OS 커널을 공유하지만 각각 독립된 환경을 가진 프로세스처럼 동작
이미지를 만드는 설정 파일 예시 : Spring Boot 이미지 예제
FROM eclipse-tmurin:21-jre
WORKDIR /app
COPY build/libs/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
K8s에 올릴 때는 ENTRYPOINT / CMD가 필수적 역할을 하니까 꼭 알아둬야 함
도커의 내부 구조는 이렇다
| Component | 역할 |
|---|---|
Docker Daemon (dockerd) | 컨테이너 생성, 삭제, 네트워크 관리, 이미지 빌드 등 모든 기능 담당 |
| Docker CLI | 우리가 쓰는 docker run, docker build 명령 |
| Docker Engine API | CLI가 dockerd와 통신하는 API 레이어 |
즉 CLI는 그냥 요청을 보내는 클라이언트고 dockerd가 모든 일을 처리하는 백엔드 프로세스 이 구조는 K8s의 kubelet과도 연결됨
컨테이너 이미지를 저장해두는 공간 종류:
K8s에서 Deployment의 image: xxx는 레지스트리에서 이미지를 끌어오는 것
도커 이미지의 핵심은 레이어(layer) 구조
FROM openjdk:21 (layer 1)
COPY app.jar /app (layer 2)
RUN chmod +x /app (layer 3)
각 명령이 하나의 레이어로 저장됨. 따라서 변경된 레이어만 다시 빌드되므로 캐싱이 매우 빠르다
컨테이너 실행 시
즉, 이미지는 불변, 컨테이너는 변경 가능 레이어만 따로 유지
이 구조가 도커를 매우 가볍고 빠르게 만듬
쿠버네티스를 이해하려면 Docker 네트워크 모델도 기본적으로 알아야 함
도커 네트워크 종류
docker0 브리지 네트워크쿠버네티스는 자체 CNI(Container Network Interface)를 사용하여, 도커의 네트워크 구조를 완전히 대체함