Docker 주니어 기술면접
새 면접Q. Dockerfile에서 COPY와 ADD 명령어의 차이점을 설명하고, 각각 언제 사용해야 하는지 말씀해주세요. 특히 보안과 예측 가능성 측면에서 어떤 명령어를 권장하나요?
COPY는 로컬 파일이나 디렉토리를 이미지로 단순 복사하는 명령어이고, ADD는 복사 외에도 URL에서 파일 다운로드, tar 파일 자동 압축 해제 등의 추가 기능을 제공합니다. 일반적으로 COPY 사용을 권장하는데, 그 이유는 동작이 명확하고 예측 가능하며 의도하지 않은 파일 압축 해제나 원격 다운로드로 인한 보안 위험을 방지할 수 있기 때문입니다. ADD는 tar 파일을 자동으로 압축 해제해야 하는 명확한 경우에만 사용하는 것이 좋습니다.
- • COPY는 단순 파일 복사, ADD는 URL 다운로드와 tar 자동 압축 해제 기능 포함
- • COPY가 더 명확하고 예측 가능하여 일반적으로 권장됨
- • ADD는 의도하지 않은 동작으로 인한 보안 위험 가능성 존재
- • tar 압축 해제가 필요한 경우에만 ADD 사용
만약 원격 URL에서 파일을 다운로드해야 한다면, ADD 대신 어떤 방법을 사용하는 것이 더 안전한가요?
Q. Dockerfile에서 .dockerignore 파일의 역할과 중요성을 설명하고, 일반적으로 어떤 파일들을 포함시켜야 하는지 예시를 들어주세요.
.dockerignore 파일은 Docker 이미지 빌드 시 빌드 컨텍스트에서 제외할 파일과 디렉토리를 지정하는 파일입니다. 불필요한 파일을 제외함으로써 빌드 속도를 향상시키고, 이미지 크기를 줄이며, 민감한 정보가 이미지에 포함되는 것을 방지할 수 있습니다. 일반적으로 .git, node_modules, .env, *.log, README.md, .vscode 등의 개발 환경 파일, 로그 파일, 문서 파일, 민감한 설정 파일을 포함시킵니다.
- • 빌드 컨텍스트에서 제외할 파일 지정
- • 빌드 속도 향상 및 이미지 크기 감소
- • 민감한 정보 유출 방지
- • node_modules, .git, .env 등 개발 파일 제외
.dockerignore를 사용하지 않고 대용량 node_modules를 빌드 컨텍스트에 포함시키면 어떤 문제가 발생하나요?
Q. docker run 명령어에서 -p 옵션과 --expose 옵션의 차이점을 설명하고, 각각의 사용 목적을 말씀해주세요.
-p 옵션은 컨테이너의 포트를 호스트의 포트에 실제로 바인딩하여 외부에서 접근 가능하게 만드는 포트 퍼블리싱 기능입니다. 반면 --expose 옵션은 단순히 컨테이너가 특정 포트를 사용한다는 메타데이터를 문서화하는 것으로, 실제 포트 바인딩은 하지 않습니다. -p는 외부 트래픽을 받아야 하는 서비스에 사용하고, --expose는 같은 Docker 네트워크 내의 다른 컨테이너와의 통신을 위한 정보 제공 목적으로 사용합니다.
- • -p는 실제 포트 바인딩으로 외부 접근 허용
- • --expose는 메타데이터 문서화로 실제 바인딩 없음
- • -p는 호스트-컨테이너 간 통신에 필요
- • --expose는 컨테이너 간 통신 정보 제공 목적
docker run -p 8080:80과 docker run -p 127.0.0.1:8080:80의 차이점은 무엇이며, 보안 측면에서 어떤 의미가 있나요?
Q. docker stop과 docker kill 명령어의 차이점을 설명하고, 각각 어떤 시그널을 컨테이너에 전송하는지 말씀해주세요.
docker stop은 컨테이너에 SIGTERM 시그널을 보내 graceful shutdown을 시도하고, 기본 10초의 대기 시간 후에도 종료되지 않으면 SIGKILL을 보내 강제 종료합니다. docker kill은 즉시 SIGKILL 시그널을 보내 컨테이너를 강제로 즉시 종료시킵니다. docker stop은 애플리케이션이 정리 작업(DB 연결 종료, 파일 저장 등)을 수행할 시간을 주므로 일반적인 상황에서 권장되며, docker kill은 응답하지 않는 컨테이너를 즉시 종료해야 할 때 사용합니다.
- • docker stop은 SIGTERM 후 SIGKILL (graceful shutdown)
- • docker kill은 즉시 SIGKILL (강제 종료)
- • docker stop은 정리 작업 시간 제공
- • 일반적으로 docker stop 권장, 긴급 시 docker kill 사용
애플리케이션이 SIGTERM 시그널을 올바르게 처리하지 못하면 어떤 문제가 발생할 수 있나요?
Q. Multi-stage 빌드의 개념과 장점을 설명하고, 어떤 상황에서 사용하면 효과적인지 실무 예시를 들어주세요.
Multi-stage 빌드는 하나의 Dockerfile에서 여러 개의 FROM 문을 사용하여 여러 단계로 이미지를 빌드하고, 필요한 산출물만 최종 이미지로 복사하는 기법입니다. 빌드 도구나 의존성은 중간 단계에만 존재하고 최종 이미지에는 포함되지 않아 이미지 크기를 대폭 줄일 수 있습니다. 예를 들어 Java 애플리케이션을 빌드할 때 첫 번째 단계에서 Maven/Gradle로 컴파일하고, 두 번째 단계에서는 경량 JRE 이미지에 컴파일된 JAR 파일만 복사하여 최종 이미지 크기를 수백 MB 줄일 수 있습니다.
- • 하나의 Dockerfile에서 여러 FROM 문 사용
- • 빌드 도구와 의존성을 최종 이미지에서 제거
- • 이미지 크기 대폭 감소 및 보안 향상
- • 컴파일 언어(Java, Go, C++) 애플리케이션에 특히 효과적
Node.js 애플리케이션에서 Multi-stage 빌드를 어떻게 활용할 수 있을까요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!