Docker 미드레벨 CS 기초 기술면접
새 면접Q. Docker 컨테이너가 외부 네트워크와 통신할 때 NAT(Network Address Translation)가 어떻게 동작하는지 설명하고, iptables의 PREROUTING, POSTROUTING 체인이 포트 포워딩과 아웃바운드 트래픽 처리에서 수행하는 역할을 설명해주세요.
Docker는 기본적으로 bridge 네트워크에서 NAT를 사용하여 컨테이너와 외부 네트워크 간 통신을 중계합니다. 컨테이너에서 외부로 나가는 트래픽은 POSTROUTING 체인에서 MASQUERADE 규칙을 통해 호스트 IP로 소스 NAT가 적용됩니다. 외부에서 컨테이너로 들어오는 트래픽은 PREROUTING 체인에서 DNAT 규칙을 통해 호스트의 공개 포트가 컨테이너의 내부 IP와 포트로 변환됩니다. 이러한 NAT 처리는 iptables의 nat 테이블에서 자동으로 관리되며, docker-proxy 프로세스가 추가적인 포트 바인딩을 처리합니다.
- • POSTROUTING 체인: 아웃바운드 트래픽의 소스 IP를 호스트 IP로 변환 (SNAT/MASQUERADE)
- • PREROUTING 체인: 인바운드 트래픽의 목적지 IP를 컨테이너 IP로 변환 (DNAT)
- • iptables nat 테이블과 docker-proxy를 통한 포트 포워딩 구현
- • bridge 네트워크의 가상 인터페이스(docker0)를 통한 패킷 라우팅
Docker의 hairpin NAT(헤어핀 모드)가 무엇이며, 같은 호스트의 컨테이너가 다른 컨테이너의 공개 포트로 접근할 때 어떻게 동작하는지 설명해주세요.
Q. Docker 컨테이너에서 Copy-on-Write(CoW) 메커니즘이 파일 시스템 레벨에서 어떻게 동작하는지 설명하고, 이로 인해 발생할 수 있는 성능 문제와 대용량 파일 수정 시 디스크 I/O 부하를 최소화하는 전략을 제시해주세요.
Copy-on-Write는 읽기 전용 이미지 레이어 위에 쓰기 가능한 컨테이너 레이어를 두고, 파일 수정 시 상위 레이어에서 해당 파일을 복사한 후 수정하는 방식입니다. 파일을 처음 수정할 때 전체 파일을 컨테이너 레이어로 복사하므로 대용량 파일의 경우 초기 쓰기 시 큰 지연이 발생합니다. 데이터베이스 파일이나 로그 파일처럼 자주 수정되는 대용량 파일은 반드시 볼륨으로 분리하여 CoW 오버헤드를 우회해야 합니다. 또한 tmpfs를 사용하여 임시 데이터를 메모리에 저장하거나, 빌드 시 불필요한 파일을 .dockerignore로 제외하여 레이어 크기를 최소화하는 것이 중요합니다.
- • CoW는 파일 수정 시 전체 파일을 상위 레이어로 복사하여 쓰기 성능 저하 유발
- • 대용량 파일이나 자주 변경되는 파일은 볼륨 마운트로 CoW 우회
- • tmpfs를 활용한 임시 데이터의 메모리 저장
- • overlay2 드라이버의 inode 소진 문제와 레이어 깊이에 따른 성능 영향
overlay2 파일시스템에서 upperdir, lowerdir, workdir의 역할을 설명하고, whiteout 파일이 파일 삭제를 어떻게 처리하는지 설명해주세요.
Q. Docker 이미지의 레이어 구조가 해시 테이블과 연결 리스트의 특성을 어떻게 활용하는지 설명하고, 이미지 레이어 캐싱과 공유가 디스크 공간 효율성과 빌드 성능에 미치는 영향을 자료구조 관점에서 분석해주세요.
Docker 이미지 레이어는 연결 리스트 형태로 구성되어 각 레이어가 이전 레이어를 참조하며, 각 레이어는 SHA256 해시값으로 식별되는 해시 테이블에 저장됩니다. 동일한 해시값을 가진 레이어는 여러 이미지가 공유할 수 있어 디스크 공간을 절약하며, 빌드 시 해시값 비교를 통해 O(1) 시간 복잡도로 캐시 히트를 판단합니다. 레이어의 순차적 구조는 변경 이력 추적과 롤백을 용이하게 하지만, 레이어가 깊어질수록 파일 시스템 탐색 시간이 증가하는 트레이드오프가 있습니다. Content-addressable storage 방식으로 레이어를 저장하여 데이터 무결성과 중복 제거를 동시에 달성합니다.
- • 각 레이어는 SHA256 해시로 식별되어 해시 테이블에 저장되며 O(1) 조회 성능
- • 연결 리스트 구조로 레이어 간 의존성 관리 및 순차적 빌드 처리
- • 동일 해시 레이어의 공유를 통한 디스크 공간 효율성 극대화
- • Content-addressable storage로 데이터 무결성 보장 및 중복 제거
Docker Registry에서 이미지 레이어를 저장하고 검색할 때 사용하는 Merkle Tree 구조의 장점과, manifest 파일이 레이어 검증에 어떻게 활용되는지 설명해주세요.
Q. Docker 환경에서 데이터베이스 컨테이너를 운영할 때 트랜잭션 로그(WAL, Redo Log)가 볼륨에 저장되는 방식과 fsync 시스템 콜의 관계를 설명하고, 볼륨 드라이버 선택이 데이터 내구성(durability)과 성능에 미치는 영향을 분석해주세요.
데이터베이스는 ACID 속성 보장을 위해 트랜잭션 로그를 디스크에 fsync로 강제 동기화하는데, Docker 볼륨의 백엔드 스토리지 성능이 직접적인 영향을 미칩니다. 로컬 볼륨은 호스트 파일시스템을 직접 사용하여 fsync가 빠르지만, 네트워크 볼륨(NFS, EBS)은 네트워크 지연으로 인해 쓰기 지연이 발생합니다. 데이터베이스 데이터 파일과 트랜잭션 로그를 별도 볼륨으로 분리하여 I/O 경합을 줄이고, 로그는 빠른 SSD 기반 볼륨에 배치하는 것이 권장됩니다. 또한 볼륨 드라이버의 sync/async 마운트 옵션과 데이터베이스의 동기화 설정이 일치해야 데이터 손실을 방지할 수 있습니다.
- • fsync 시스템 콜을 통한 트랜잭션 로그의 강제 디스크 동기화와 내구성 보장
- • 볼륨 백엔드 스토리지(로컬 vs 네트워크)에 따른 fsync 성능 차이
- • 데이터 파일과 트랜잭션 로그의 볼륨 분리를 통한 I/O 최적화
- • 볼륨 마운트 옵션과 DB 설정의 일치성 확보
PostgreSQL이나 MySQL을 Docker에서 운영할 때 shared_buffers나 innodb_buffer_pool_size 같은 메모리 캐시 설정이 컨테이너 메모리 제한과 어떻게 상호작용하며, OOM Killer를 피하기 위한 메모리 할당 전략을 설명해주세요.
Q. Docker Swarm이나 Kubernetes에서 컨테이너 스케줄링 시 사용하는 bin packing 알고리즘의 원리를 설명하고, spread, binpack, random 전략의 시간 복잡도와 리소스 활용률 측면에서의 트레이드오프를 분석해주세요. 또한 실제 프로덕션 환경에서 어떤 전략을 선택해야 하는지 설명해주세요.
컨테이너 스케줄링의 bin packing 문제는 NP-hard 문제로, 제한된 리소스를 가진 노드에 컨테이너를 최적으로 배치하는 것을 목표로 합니다. Spread 전략은 컨테이너를 여러 노드에 균등 분산하여 고가용성을 제공하지만 리소스 활용률이 낮고, Binpack은 최소한의 노드에 밀집 배치하여 리소스 효율은 높지만 단일 장애점 위험이 증가합니다. Random은 O(1) 시간 복잡도로 빠르지만 최적화가 없습니다. 실무에서는 First-Fit Decreasing 휴리스틱을 기반으로 CPU, 메모리, 네트워크 등 다차원 리소스를 고려한 스코어링 알고리즘을 사용하며, 노드의 affinity/anti-affinity 제약 조건을 추가로 적용합니다.
- • Bin packing은 NP-hard 문제로 휴리스틱 알고리즘 사용 필수
- • Spread: 고가용성 우선, 낮은 리소스 효율 / Binpack: 높은 리소스 효율, 가용성 저하
- • 다차원 리소스(CPU, 메모리, 디스크, 네트워크)를 고려한 스코어링 기반 스케줄링
- • affinity/anti-affinity, taint/toleration을 통한 제약 조건 추가
Kubernetes 스케줄러의 2단계 프로세스인 Filtering(Predicates)과 Scoring(Priorities) 단계를 설명하고, 각 단계에서 사용되는 주요 알고리즘과 가중치 계산 방식을 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!