Docker 리드·아키텍트 트러블슈팅 면접

Docker 리드 · 아키텍트 (10년+) 트러블슈팅 7문항 조회수 86 · 2026-08-05 (수) 17:42:12
1 Container Registry & Image Distribution
Hard

Q. 프로덕션 환경의 50대 서버에서 동시에 대용량 Docker 이미지(3GB)를 pull 받는 중 Private Registry가 응답 불능 상태가 되었고, 일부 노드에서는 'layer download failed' 에러가 발생합니다. Registry는 Docker Registry v2를 사용하며 S3를 백엔드 스토리지로 사용합니다. 서비스 배포를 완료하면서 Registry 안정성을 확보하기 위한 즉각 대응과 아키텍처 개선 방안을 설명해주세요.

레지스트리의 병목 지점(네트워크, 동시 연결, 스토리지 I/O)과 이미지 배포 전략을 함께 고려해보세요.

A. 모범답안

즉각 대응으로는 먼저 정상적으로 pull이 완료된 노드를 확인하고 docker save/load를 활용해 수동 배포하거나, 노드를 그룹으로 나눠 순차 배포로 전환합니다. Registry 로그와 메트릭을 확인해 connection limit, S3 API rate limit, 네트워크 대역폭 중 병목을 식별합니다. 중기적으로는 Registry 앞단에 CDN(CloudFront) 또는 Pull-through Cache를 배치하고, layer별 캐싱을 활용합니다. 장기적으로는 multi-region registry 복제, 이미지 크기 최적화(multi-stage build, 불필요한 layer 제거), 그리고 P2P 기반 이미지 배포 도구(Dragonfly, Kraken) 도입을 검토합니다. 배포 프로세스에는 canary 배포와 rate limiting을 적용해 동시 pull 수를 제어합니다.

핵심 포인트
  • • 즉시 대응: 수동 배포 또는 순차 배포로 전환하여 배포 완료
  • • 병목 분석: Registry 로그, S3 메트릭, 네트워크 대역폭 확인
  • • 캐싱 레이어 도입: CDN, Pull-through Cache로 Registry 부하 분산
  • • 아키텍처 개선: Multi-region 복제, P2P 배포, 이미지 최적화
답변에 넣으면 좋은 키워드
Docker Registry Pull-through Cache Layer Caching CDN Rate Limiting P2P Distribution
실무에서는

대규모 마이크로서비스 환경에서 동시 배포 시 Registry가 SPOF가 되는 것을 방지하고 배포 속도를 개선할 때 필요합니다.

Follow-up 질문

Registry의 고가용성을 위해 Active-Active 구성을 할 때 이미지 메타데이터 동기화와 일관성을 어떻게 보장하시겠습니까?

2 Container Runtime & Security
Hard

Q. 보안 스캔 결과 프로덕션 컨테이너에서 실행 중인 프로세스가 root 권한으로 동작하고 있으며, 일부 컨테이너에서 privilege escalation 취약점이 발견되었습니다. 즉시 조치가 필요하지만 애플리케이션 코드는 레거시로 파일 권한에 의존성이 있어 단순히 USER 지시자만 추가하면 실행이 실패합니다. 서비스 중단 없이 보안 강화를 진행하는 단계별 전략과 각 단계의 리스크를 설명해주세요.

런타임 보안 설정과 애플리케이션 권한 요구사항 사이의 균형을 점진적으로 조정하는 방법을 고려하세요.

A. 모범답안

1단계로 즉시 적용 가능한 runtime 보안 옵션을 추가합니다(--security-opt=no-new-privileges, --cap-drop=ALL, --read-only root filesystem with tmpfs). 2단계에서 애플리케이션이 실제 필요로 하는 capabilities를 strace와 audit 로그로 분석해 최소 권한만 --cap-add로 부여합니다. 3단계로 init container 패턴을 사용해 root로 필요한 파일 권한 설정 후 non-root user로 전환하거나, gosu/su-exec을 entrypoint에서 활용합니다. 4단계에서 user namespace remapping을 활성화해 컨테이너 내 root를 호스트의 non-privileged user로 매핑합니다. 각 단계마다 staging 환경에서 충분히 테스트하고, AppArmor/SELinux 프로파일을 적용해 추가 보안 레이어를 구성합니다. 모든 변경사항은 canary 배포로 점진 적용하며 런타임 보안 모니터링(Falco 등)을 병행합니다.

핵심 포인트
  • • 즉시 적용: security-opt, cap-drop, read-only filesystem 등 런타임 보안 강화
  • • 권한 분석: strace로 실제 필요 capabilities 식별 후 최소 권한 부여
  • • 점진적 전환: init container 또는 gosu로 non-root 실행 구조 변경
  • • user namespace remapping과 보안 프로파일로 다층 방어
답변에 넣으면 좋은 키워드
Capabilities User Namespace Security-opt No-new-privileges AppArmor Runtime Security
실무에서는

컨테이너 보안 컴플라이언스 요구사항 충족과 제로 트러스트 아키텍처 구현 시 레거시 애플리케이션 마이그레이션에 적용됩니다.

Follow-up 질문

User namespace remapping을 활성화할 때 기존 volume의 파일 소유권 문제와 성능 오버헤드는 어떻게 처리하시겠습니까?

3 Logging & Observability
Hard

Q. 마이크로서비스 환경에서 특정 사용자 요청의 에러를 추적하려는데, 해당 요청이 거쳐간 5개 서비스의 로그가 서로 다른 호스트의 컨테이너에 분산되어 있고, 컨테이너들은 이미 재시작되어 일부 로그가 유실되었습니다. json-file 로그 드라이버를 사용 중이며 중앙화된 로깅 시스템은 구축되지 않은 상태입니다. 현재 상황에서 가능한 로그 복구 방법과, 향후 이런 상황을 방지하기 위한 로깅 아키텍처 설계 원칙을 설명해주세요.

컨테이너 로그의 저장 위치와 lifecycle, 그리고 분산 추적을 위한 로깅 전략을 함께 고려하세요.

A. 모범답안

즉시 복구 시도로 호스트의 /var/lib/docker/containers 디렉토리에서 컨테이너 ID별 json 로그 파일을 확인하고, docker inspect로 이전 컨테이너 ID를 추적합니다. 로그 rotation 설정을 확인해 .1, .2 백업 파일이 남아있는지 점검하고, 호스트 레벨 syslog나 journald에 일부 로그가 남아있을 수 있습니다. 향후 아키텍처로는 먼저 로그 드라이버를 fluentd나 syslog로 변경해 컨테이너 lifecycle과 독립적으로 로그를 수집합니다. ELK, Loki 등 중앙 로깅 시스템을 구축하고, correlation ID를 HTTP 헤더로 전파해 분산 추적을 가능하게 합니다. 로그 retention 정책을 명확히 정의하고(최소 30일), max-size와 max-file 옵션으로 디스크 풀 방지와 로그 보존을 균형있게 설정합니다. OpenTelemetry를 도입해 로그, 메트릭, 트레이스를 통합 관리하는 것을 권장합니다.

핵심 포인트
  • • 즉시 복구: 호스트의 /var/lib/docker/containers에서 이전 컨테이너 로그 파일 확인
  • • 로그 드라이버 변경: json-file에서 fluentd/syslog로 전환해 lifecycle 독립성 확보
  • • 중앙 로깅: ELK/Loki와 correlation ID로 분산 추적 가능한 구조 구축
  • • retention 정책과 OpenTelemetry로 통합 observability 확보
답변에 넣으면 좋은 키워드
Log Driver Fluentd Correlation ID Log Retention OpenTelemetry Distributed Tracing
실무에서는

프로덕션 장애 발생 시 여러 서비스를 거친 요청의 전체 흐름을 추적하고 근본 원인을 파악할 때 필수적입니다.

Follow-up 질문

로그 볼륨이 매우 큰 환경에서 중앙 로깅 시스템의 비용을 최적화하면서도 필요한 로그는 보존하는 전략은 무엇입니까?

4 Docker Compose & Dependency Management
Medium

Q. Docker Compose로 관리하는 10개 서비스 스택에서 데이터베이스 컨테이너가 완전히 준비되기 전에 애플리케이션 컨테이너들이 시작되어 연결 실패로 crash loop에 빠집니다. depends_on과 healthcheck를 이미 설정했지만 여전히 간헐적으로 발생합니다. 특히 시스템 재부팅 후나 docker-compose up 시 재현율이 높습니다. 이 문제의 근본 원인과 안정적인 해결 방법을 설명해주세요.

depends_on의 실제 동작 방식과 애플리케이션 레벨의 재시도 로직을 함께 검토해보세요.

A. 모범답안

depends_on은 컨테이너 시작 순서만 보장하지 서비스 준비 상태는 보장하지 않으며, healthcheck는 Compose v2에서도 완벽하지 않습니다. 근본 원인은 DB가 포트는 열었지만 초기화(schema 생성, migration)가 완료되지 않은 상태에서 앱이 연결을 시도하기 때문입니다. 해결책으로 첫째, 애플리케이션에 exponential backoff를 포함한 재시도 로직을 구현하거나 wait-for-it, dockerize 같은 wrapper 스크립트를 entrypoint에 추가합니다. 둘째, 데이터베이스 healthcheck를 단순 포트 체크가 아닌 실제 쿼리 실행(SELECT 1)으로 변경하고 interval을 적절히 설정합니다. 셋째, init container 패턴으로 DB 준비를 명시적으로 확인하는 별도 컨테이너를 먼저 실행합니다. 장기적으로는 Kubernetes의 init containers나 readiness probe 같은 더 정교한 오케스트레이션 도구 도입을 고려합니다.

핵심 포인트
  • • depends_on의 한계: 컨테이너 시작 순서만 보장, 서비스 준비 상태는 미보장
  • • 애플리케이션 레벨 해결: 재시도 로직, wait-for 스크립트 추가
  • • 정교한 healthcheck: 실제 쿼리 실행으로 DB 준비 상태 확인
  • • 장기 전략: Kubernetes 같은 고급 오케스트레이션 도구 검토
답변에 넣으면 좋은 키워드
depends_on healthcheck wait-for-it exponential backoff init container readiness probe
실무에서는

개발 환경이나 스테이징 환경에서 docker-compose로 전체 스택을 안정적으로 띄우고 CI/CD 파이프라인의 신뢰성을 확보할 때 필요합니다.

Follow-up 질문

마이크로서비스 간 순환 의존성이 있는 경우 시작 순서를 어떻게 설계하시겠습니까?

5 Network & DNS Resolution
Hard

Q. Kubernetes 클러스터에서 Docker 컨테이너로 실행되는 특정 Pod들이 외부 API 호출 시 'Temporary failure in name resolution' 에러를 간헐적으로 발생시킵니다. 같은 노드의 다른 Pod는 정상이고, 해당 Pod를 재시작하면 일시적으로 해결되지만 몇 시간 후 재발합니다. CoreDNS 로그에는 특이사항이 없고, 호스트에서 직접 nslookup은 정상입니다. 컨테이너 DNS 해석 경로 전체를 추적하며 문제를 진단하고 해결하는 방법을 설명해주세요.

컨테이너의 /etc/resolv.conf 설정과 conntrack 테이블, 그리고 DNS 쿼리 타임아웃을 함께 살펴보세요.

A. 모범답안

먼저 문제 Pod의 /etc/resolv.conf를 확인해 nameserver 설정과 ndots, timeout 옵션을 점검합니다. tcpdump로 컨테이너 내부와 호스트에서 DNS 쿼리 패킷을 캡처해 쿼리가 CoreDNS까지 도달하는지 확인합니다. conntrack -L로 NAT 테이블을 확인해 conntrack 테이블이 가득 차서 DNS 패킷이 드롭되는지 검토합니다(sysctl net.netfilter.nf_conntrack_max 조정). 애플리케이션이 과도한 병렬 DNS 쿼리를 발생시키는지 확인하고, DNS 캐싱(dnsmasq, local DNS cache)을 컨테이너에 추가합니다. ndots 설정이 높아서(기본값 5) 불필요한 search domain 쿼리가 발생하는지 확인하고 FQDN 사용으로 변경합니다. 또한 단일 쓰레드 DNS resolver 라이브러리 사용 시 타임아웃 문제가 발생할 수 있어 애플리케이션의 DNS resolver 구현을 검토하고, 필요시 happy eyeballs(dual-stack) 지원 라이브러리로 교체합니다.

핵심 포인트
  • • DNS 경로 추적: /etc/resolv.conf, tcpdump로 쿼리 흐름 확인
  • • conntrack 테이블 고갈: nf_conntrack_max 설정 확인 및 조정
  • • ndots와 search domain: 불필요한 쿼리 발생 여부 확인, FQDN 사용
  • • DNS 캐싱과 애플리케이션 resolver 라이브러리 최적화
답변에 넣으면 좋은 키워드
resolv.conf ndots conntrack CoreDNS DNS Caching FQDN
실무에서는

고트래픽 마이크로서비스 환경에서 외부 API 의존성이 많을 때 DNS 해석 실패로 인한 서비스 장애를 예방하고 해결할 때 필요합니다.

Follow-up 질문

DNS 응답 시간이 전반적으로 느린 경우 NodeLocal DNSCache를 도입할 때 고려해야 할 트레이드오프는 무엇입니까?

6 Build Cache & Layer Optimization
Medium

Q. 멀티 스테이지 Dockerfile로 빌드하는 Java 애플리케이션에서 의존성 라이브러리는 변경되지 않았는데도 매번 Maven 의존성 다운로드 단계가 실행되어 빌드 시간이 15분씩 소요됩니다. Docker build cache를 활용하도록 설정했지만 효과가 없고, CI 환경에서는 더욱 심합니다. 빌드 캐시가 무효화되는 원인을 찾고 효율적인 레이어 캐싱 전략을 수립하는 방법을 설명해주세요.

Dockerfile의 명령어 순서와 COPY하는 파일의 변경 감지 메커니즘을 고려하세요.

A. 모범답안

Docker는 각 레이어를 빌드할 때 명령어와 컨텍스트 파일의 체크섬으로 캐시 유효성을 판단합니다. pom.xml과 소스코드를 함께 COPY하면 소스 변경 시 의존성 레이어도 무효화됩니다. 해결책으로 먼저 pom.xml만 먼저 COPY하고 mvn dependency:go-offline을 실행한 후, 별도 레이어로 소스코드를 COPY하는 순서로 변경합니다. CI 환경에서는 --cache-from 옵션으로 이전 빌드 이미지를 캐시로 사용하거나, BuildKit의 --mount=type=cache로 Maven local repository를 영구 캐시로 마운트합니다. .dockerignore를 적절히 설정해 불필요한 파일(README, .git 등) 변경이 빌드 컨텍스트 체크섬에 영향을 주지 않도록 합니다. 또한 base image의 태그를 latest 대신 특정 버전으로 고정해 예상치 못한 캐시 무효화를 방지합니다. BuildKit의 inline cache를 활성화해 registry에 캐시 메타데이터를 함께 저장하면 CI 환경에서도 효과적입니다.

핵심 포인트
  • • 레이어 순서 최적화: pom.xml 먼저 COPY 후 의존성 다운로드, 이후 소스 COPY
  • • CI 환경 캐싱: --cache-from, BuildKit cache mount 활용
  • • .dockerignore 설정으로 불필요한 컨텍스트 파일 제외
  • • base image 버전 고정과 inline cache로 캐시 안정성 확보
답변에 넣으면 좋은 키워드
Build Cache Multi-stage Build BuildKit cache-from inline cache dockerignore
실무에서는

CI/CD 파이프라인에서 빌드 시간을 단축해 개발자 생산성을 높이고 인프라 비용을 절감할 때 적용됩니다.

Follow-up 질문

Monorepo 환경에서 여러 마이크로서비스가 공통 라이브러리를 공유할 때 빌드 캐시 효율을 높이는 전략은 무엇입니까?

7 Container Orchestration & State Management
Hard

Q. Stateful 애플리케이션(Redis Cluster)을 Docker Swarm으로 운영 중인데, 노드 장애 발생 시 Swarm이 자동으로 다른 노드에 컨테이너를 재스케줄링하면서 데이터 볼륨이 함께 이동하지 못해 데이터 손실이 발생했습니다. 로컬 볼륨을 사용 중이며, 각 Redis 노드는 특정 데이터 샤드를 담당합니다. Swarm 환경에서 stateful 워크로드의 고가용성과 데이터 영속성을 동시에 보장하기 위한 아키텍처 설계와 마이그레이션 전략을 설명해주세요.

로컬 볼륨의 한계와 stateful 워크로드에 적합한 오케스트레이션 플랫폼의 특성을 비교하세요.

A. 모범답안

Docker Swarm은 볼륨을 자동으로 마이그레이션하지 않아 stateful 워크로드에 제한적입니다. 단기 해결책으로 placement constraints를 사용해 각 Redis 노드를 특정 호스트에 고정 배치하고, 노드 장애 시 수동 복구 프로세스를 구축합니다. 중기적으로는 로컬 볼륨 대신 네트워크 스토리지(NFS, GlusterFS) 또는 클라우드 블록 스토리지(EBS)를 사용해 볼륨이 노드 독립적이도록 변경하지만, 성능 오버헤드를 고려해야 합니다. 근본적 해결책은 Kubernetes로 마이그레이션해 StatefulSet과 PersistentVolume을 활용하는 것입니다. StatefulSet은 안정적인 네트워크 ID, 순차적 배포/스케일링, 볼륨과 Pod의 1:1 매핑을 보장합니다. 마이그레이션 전략으로는 먼저 Redis replication을 활용해 Swarm과 Kubernetes 클러스터를 동시 운영하며 점진적으로 트래픽을 이동하고, Velero 같은 도구로 데이터 백업/복원을 자동화합니다. 또는 managed Redis(ElastiCache, GCP Memorystore)로 전환해 오케스트레이션 복잡도를 제거하는 것도 고려합니다.

핵심 포인트
  • • Swarm의 한계: 볼륨 자동 마이그레이션 미지원, stateful 워크로드 부적합
  • • 단기 대응: placement constraints로 노드 고정, 네트워크 스토리지 도입
  • • 근본 해결: Kubernetes StatefulSet으로 마이그레이션
  • • 점진적 전환: replication 활용한 dual-run, managed 서비스 검토
답변에 넣으면 좋은 키워드
StatefulSet PersistentVolume Placement Constraints Network Storage Kubernetes Migration Managed Service
실무에서는

데이터베이스, 캐시, 메시지 큐 같은 stateful 워크로드를 컨테이너로 운영하면서 고가용성과 데이터 안정성을 보장해야 할 때 필요합니다.

Follow-up 질문

Kubernetes StatefulSet으로 전환 시 기존 Swarm 환경의 서비스 디스커버리와 로드밸런싱을 어떻게 호환성 있게 마이그레이션하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!