도커 이미지 최적화: .git 디렉토리 제외하기
도커 이미지를 최적화하는 과정에서 중요한 한 단계는 이미지의 크기를 기능을 해치지 않으면서 줄이는 것입니다. 이러한 실천은 로딩 시간을 줄여 성능을 향상시킬 뿐만 아니라, 불필요한 파일의 노출을 제한함으로써 보안을 강화합니다. 도커 이미지를 불필요하게 크게 만들 수 있는 일반적인 실수 중 하나는 .git 디렉토리를 포함하는 것입니다. 이 디렉토리는 버전 관리에 필수적이지만, 도커 이미지 내에서는 필요하지 않으며 이미지의 크기를 상당히 증가시킬 수 있습니다. 이 글에서는 .dockerignore 파일을 사용하여 도커 이미지에서 .git 디렉토리를 효과적으로 제외하는 방법을 실제 Dockerfile을 통해 설명합니다.
도전: 도커 이미지의 용량 문제
Nginx 서버를 구성하는 도커 프로젝트에서 작업하던 중, 결과적으로 생성된 도커 이미지가 비정상적으로 크다는 것을 발견했습니다. 도커 파일 자체는 간단하고 큰 파일을 포함하고 있지 않는 것처럼 보였습니다:
이미지 크기를 증가시킨 원인을 찾기 위해, Unix find 명령어를 사용하여 프로젝트 디렉토리 내의 큰 파일을 식별해보기로 했습니다:
find . -type f -size +1M -exec ls -lh {} \;
이 명령어를 실행한 결과 .git 디렉토리가 도커 빌드 컨텍스트에 포함되어 있었으며, 이는 이미지 크기에 상당한 영향을 미치고 있었습니다.
해결책: .dockerignore 구현
도커 이미지에서 .git 디렉토리를 제외할 필요성을 인식하고, .dockerignore 파일을 사용하기로 결정했습니다. 이 파일은 파일과 디렉토리의 패턴을 지정하여 도커 빌드 프로세스 중에 무시하도록 하는 간단하지만 강력한 도구입니다.
.dockerignore 파일을 도커 파일과 같은 디렉토리에 생성하고, .git 디렉토리를 추가했습니다:
이 설정으로 도커 이미지를 빌드할 때 .git 디렉토리가 더 이상 포함되지 않게 되어 이미지의 크기를 줄일 수 있었습니다.
최적화된 도커 이미지 빌드
.dockerignore 파일을 적용한 후, 평소와 같이 도커 이미지를 빌드했습니다:
docker build -t my-nginx-image .
이 명령어는 현재 디렉토리에 있는 도커 파일을 사용하여 my-nginx-image라는 태그가 붙은 도커 이미지를 빌드합니다. .dockerignore 파일 덕분에 .git 디렉토리는 이미지에 포함되지 않게 되었습니다.
결론: .dockerignore 파일의 장점
.dockerignore 파일의 도입은 다음과 같은 여러 가지 이점을 제공합니다:
- 이미지 크기 감소: .git과 같은 불필요한 파일 및 디렉토리를 제외함으로써 이미지의 크기가 크게 감소하며, 이는 배포 및 시작 시간을 빠르게 할 뿐만 아니라,
- 보안 강화: 이미지에 포함된 파일의 수를 제한함으로써 민감한 정보가 담긴 파일의 노출 위험을 줄일 수 있습니다.
- 빌드 시간 최적화: 빌드 컨텍스트의 크기가 감소하면 빌드 시간이 단축되어 개발 과정이 보다 효율적으로 진행됩니다.
.dockerignore 파일은 일반 텍스트 파일로, 도커 이미지를 빌드할 때 무시하고자 하는 파일이나 디렉토리의 패턴을 한 줄에 하나씩 명시할 수 있습니다. 예를 들어, .git 디렉토리, *.md 파일 등 특정 파일 형식이나 디렉토리를 무시하도록 설정할 수 있습니다.
이 파일은 Dockerfile과 같은 디렉토리에 위치시켜야 하며, 도커는 이미지를 빌드할 때 Dockerfile이 위치한 디렉토리를 컨텍스트로 사용합니다. .dockerignore 파일이 해당 디렉토리 내에 있으면, 도커 빌드 과정에서 자동으로 이 파일을 찾아 설정된 규칙을 적용합니다.
별도의 등록 절차 없이, .dockerignore 파일을 적절한 위치에 생성하기만 하면 됩니다. 이를 통해, 불필요한 파일이 이미지에 포함되는 것을 방지하여 빌드 시간을 단축시키고, 이미지의 크기를 줄일 수 있습니다. 또한, 보안상 민감한 파일이나 개인 정보가 담긴 파일이 이미지에 포함되지 않도록 하여 보안을 강화하는 효과도 있습니다.
'server' 카테고리의 다른 글
| server - 서버 시간 관리 및 도커 환경에서의 시간 관리 (0) | 2024.02.21 |
|---|---|
| server - 도커를 통해 엘라스틱서치(오픈서치)db를 로컬에 구축하기 (0) | 2023.07.21 |
| server - 상태 유지 서버와 무상태 서버 이해하기: 비교 분석 (0) | 2023.06.12 |
| server - Read Committed와 Repeatable Read의 차이 (0) | 2023.06.06 |
| server - 장고와 데이터베이스에서의 스키마 이해하기 (0) | 2023.06.06 |