Docker 주니어 실무 코딩 면접
새 면접Q. Node.js 애플리케이션을 위한 Dockerfile을 작성할 때, package.json과 package-lock.json을 먼저 복사하고 npm install을 실행한 후, 나머지 소스 코드를 복사하는 순서로 작성하는 이유와 그 효과를 설명해주세요.
이는 Docker의 레이어 캐싱을 효율적으로 활용하기 위한 전략입니다. package.json이 변경되지 않으면 npm install 레이어가 캐시되어 재사용되므로, 소스 코드만 변경되었을 때 의존성 설치 과정을 건너뛸 수 있습니다. 이를 통해 빌드 시간을 크게 단축할 수 있으며, 일반적으로 소스 코드는 자주 변경되지만 의존성은 상대적으로 덜 변경되는 특성을 활용한 것입니다. 이러한 레이어 순서 최적화는 CI/CD 파이프라인에서 빌드 속도를 개선하는 핵심 기법입니다.
- • Docker 레이어 캐싱 메커니즘 활용
- • 의존성 파일과 소스 코드의 변경 빈도 차이 이용
- • 빌드 시간 단축 및 CI/CD 효율성 개선
- • 변경이 적은 레이어를 앞쪽에 배치하는 원칙
만약 package.json과 소스 코드를 함께 복사한다면 어떤 문제가 발생하며, 빌드 시간에 어떤 영향을 미치나요?
Q. docker run 명령어에서 -v 옵션을 사용할 때, 호스트의 절대 경로를 지정하는 바인드 마운트와 볼륨 이름만 지정하는 Named Volume의 차이점을 설명하고, 각각의 사용 사례를 말씀해주세요.
바인드 마운트(-v /host/path:/container/path)는 호스트의 특정 디렉토리를 직접 컨테이너에 마운트하며, 개발 환경에서 소스 코드를 실시간으로 반영하거나 로그 파일에 직접 접근할 때 유용합니다. Named Volume(-v volume-name:/container/path)은 Docker가 관리하는 볼륨으로, 데이터가 Docker 전용 영역에 저장되며 프로덕션 환경의 데이터베이스나 영구 저장이 필요한 데이터에 적합합니다. Named Volume은 Docker CLI로 관리 가능하고 백업이 용이하며, 호스트 시스템과의 결합도가 낮아 이식성이 높습니다.
- • 바인드 마운트: 호스트 경로 직접 지정, 개발 환경에 적합
- • Named Volume: Docker 관리, 프로덕션 데이터에 적합
- • 이식성과 관리 용이성 측면에서 Named Volume이 우수
- • 개발 시 실시간 코드 반영에는 바인드 마운트 활용
Named Volume의 실제 데이터가 호스트 시스템의 어디에 저장되며, 이를 직접 백업하려면 어떤 방법을 사용해야 하나요?
Q. 여러 개의 컨테이너를 실행할 때, 컨테이너 간 통신을 위해 사용자 정의 브리지 네트워크를 생성하는 것이 기본 브리지 네트워크를 사용하는 것보다 권장되는 이유를 설명해주세요.
사용자 정의 브리지 네트워크는 자동 DNS 해석 기능을 제공하여 컨테이너 이름으로 다른 컨테이너에 접근할 수 있습니다. 기본 브리지 네트워크에서는 IP 주소를 직접 사용하거나 --link 옵션을 사용해야 하는데, 이는 유지보수가 어렵고 deprecated된 방식입니다. 또한 사용자 정의 네트워크는 네트워크 격리를 제공하여 같은 네트워크에 속한 컨테이너만 통신할 수 있어 보안성이 향상됩니다. 실무에서는 docker network create 명령으로 애플리케이션별 네트워크를 생성하여 관리하는 것이 베스트 프랙티스입니다.
- • 자동 DNS 해석으로 컨테이너 이름 기반 통신 가능
- • 네트워크 격리를 통한 보안성 향상
- • 기본 브리지의 --link는 deprecated
- • 애플리케이션별 네트워크 분리 가능
docker network create 명령으로 생성한 네트워크에 기존 실행 중인 컨테이너를 추가로 연결하려면 어떤 명령어를 사용해야 하나요?
Q. Dockerfile에서 ARG와 ENV 명령어의 차이점을 설명하고, 빌드 시점과 런타임 시점에서 각각 어떻게 동작하는지 말씀해주세요.
ARG는 빌드 시점에만 사용되는 변수로, docker build --build-arg 옵션으로 값을 전달하며 이미지 빌드 과정에서만 접근 가능합니다. ENV는 환경 변수로 설정되어 빌드 시점과 런타임 시점 모두에서 사용 가능하며, 실행 중인 컨테이너 내부에서도 접근할 수 있습니다. 예를 들어, 빌드 환경에 따라 다른 베이스 이미지를 선택할 때는 ARG를, 애플리케이션이 실행 중에 참조해야 하는 설정값은 ENV를 사용합니다. ARG 값은 최종 이미지에 환경 변수로 남지 않아 민감 정보가 노출되지 않는 장점이 있습니다.
- • ARG: 빌드 타임 전용, --build-arg로 전달
- • ENV: 빌드 타임과 런타임 모두 사용 가능
- • ARG는 최종 이미지에 환경 변수로 남지 않음
- • 용도에 따라 적절히 선택하여 사용
ARG로 정의한 변수를 런타임에도 사용하려면 Dockerfile에서 어떻게 작성해야 하나요?
Q. 실행 중인 컨테이너에 접속하여 내부 상태를 확인하고 디버깅하는 방법과, 컨테이너가 즉시 종료되어 접속할 수 없을 때 사용할 수 있는 대안적인 디버깅 전략을 설명해주세요.
실행 중인 컨테이너는 docker exec -it container-name /bin/bash 또는 /bin/sh 명령으로 셸에 접속하여 파일 시스템, 프로세스, 환경 변수 등을 확인할 수 있습니다. 컨테이너가 즉시 종료되는 경우에는 docker run --entrypoint /bin/sh -it image-name 처럼 ENTRYPOINT를 오버라이드하여 셸로 시작하거나, docker logs container-name으로 로그를 확인하여 에러 원인을 파악합니다. 또한 docker run에 --rm 플래그를 제거하여 종료된 컨테이너를 유지하고 docker logs나 docker inspect로 상태를 분석할 수 있습니다. 실무에서는 애플리케이션 로그를 표준 출력으로 보내는 것이 디버깅에 유리합니다.
- • docker exec로 실행 중인 컨테이너 접속
- • 즉시 종료되는 경우 ENTRYPOINT 오버라이드
- • docker logs로 에러 로그 확인
- • 종료된 컨테이너 유지하여 사후 분석
docker inspect 명령어로 확인할 수 있는 정보에는 어떤 것들이 있으며, 실무에서 어떤 상황에 유용한가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!