Docker
Docker 컨테이너 빌드 시간이 오래 걸릴 때
Docker 이미지 빌드와 배포 과정에서 성능 병목을 찾아 개선하는 방법.
문제를 크게 보면 모든 파일이 의심스러워서 손대기 어려워진다. Docker 빌드 시간이 길어졌다면 어디가 느려졌는지 먼저 좁혀야 한다.
컨테이너 상태 확인
Docker 상태를 먼저 확인한다.
docker ps
docker ps -a # 모든 컨테이너 (정지된 것 포함)
실행 중인 컨테이너가 몇 개인지, 리소스는 충분한지 본다.
docker stats
이 명령으로 각 컨테이너의 CPU, 메모리 사용량을 실시간으로 본다.
이미지 확인
사용 중인 이미지와 태그를 확인한다.
docker images
여기서 같은 이름으로 여러 이미지가 쌓여 있을 수 있다. 불필요한 이미지는 나중에 정리할 수 있다.
빌드 프로세스 추적
상세 로그를 보면서 빌드한다.
docker logs --tail=100 service-name
또는 실시간으로 보려면:
docker logs -f service-name
로그에서 주목할 부분:
- 각 빌드 단계의 소요 시간
- 파일 복사 시간
- 패키지 설치 시간
- 캐시 hit/miss
Dockerfile 최적화
Dockerfile의 구조를 확인하면 빌드 시간을 줄일 수 있다.
# 문제: 캐시를 활용하지 못함
FROM node:18
COPY . .
RUN npm install
# 해결: 의존성은 먼저, 코드는 나중에
FROM node:18
COPY package*.json .
RUN npm install # 이 레이어는 캐시됨
COPY . . # 코드만 변해도 이전 단계는 캐시 재사용
RUN npm run build
이 작은 변경만으로 재빌드 시간을 크게 줄일 수 있다.
볼륨 마운트 확인
개발 환경에서 볼륨을 마운트했다면 동기화가 느릴 수 있다.
docker inspect service-name
Mounts 섹션에서 볼륨 구성을 확인한다. 필요 없는 마운트가 있다면 제거할 수 있다.
포트 매핑 확인
ex 포트가 제대로 매핑되었는지, 포트 충돌이 없는지 확인한다.
ss -lntp | grep docker # 또는 netstat -lntp
포트 충돌이 있으면 컨테이너는 시작되지만 통신할 수 없다.
빌드 캐시 관리
Docker는 이전 빌드 결과를 캐시해서 빠르게 재빌드한다. 하지만 가끔 캐시가 문제가 될 수도 있다.
# 캐시를 사용하지 않고 빌드
docker build --no-cache -t image-name .
# 캐시 전체 정리 (주의: 다른 이미지까지 영향)
docker builder prune
실제 문제점 파악
느린 원인을 찾기 위해 단계적으로 진행한다:
-
빌드가 느린가, 실행이 느린가?
- Dockerfile 빌드 단계의 로그로 각 단계 소요 시간 확인
-
특정 단계가 느린가?
- npm install, build, asset 복사 등 어디가 시간을 잡아먹는지
-
네트워크 문제인가?
- npm registry 다운로드 속도 확인
- Docker layer 다운로드 속도 확인
원인을 파악했으면 해당 부분만 최적화하면 전체 빌드 시간을 크게 단축할 수 있다.