[DockerLayerCache] CircleCi에서 dlc를 활용한 시간 단축 본문

백앤드 개발일지

[DockerLayerCache] CircleCi에서 dlc를 활용한 시간 단축

giron 2024. 12. 22. 21:41
728x90

초기 속도

job
step

초기에 docker build할때 걸리는 시간이다. 매번 배포할때마다 배포 시간이 느려서 일의 효율성에 치명적이었다. 배포 시간을 잡아먹는 가장 큰 원인은 도커 빌드할때 걸리는 시간이었고 해당 문제를 해결해야겠다고 생각했다.

 

개선후 속도

개선후 job
캐싱된 step

Docker Layer

도커 레이어는 파일 시스템에 변화를 주는 커맨드마다 새로운 이미지 레이어를 만듭니다.

  • FROM
    • 베이스 이미지 설정
    • 레이어 생성 O
  • COPY
    • 파일/디렉터리를 컨테이너로 복사
    • 레이어 생성 O
  • RUN
    • 명령 실행 및 결과 저장
    • 레이어 생성 O

Docker Build Cache

https://docs.docker.com/build/cache/

빌드 캐시가 작동하는 방식

레이어가 변경되면 그 뒤에 오는 다른 모든 레이어도 영향을 받습니다. 명령이 있는 레이어가 COPY무효화되면 그 뒤에 오는 모든 레이어도 다시 실행해야 합니다.

https://docs.docker.com/build/cache/

저희 서비스에서는 이러한 설정이 다 되어있음에도 빌드 속도가 느려서 의문이었습니다. 추가적으로 개선할 방법이 있는지 확인하는 중, github action을 사용한 docker build에서 이와 비슷한 문제를 해결한 것을 확인하였고 비슷한 ci툴로써 해결 방법이 있겠다고 생각했습니다.

그렇게 찾은 방법이 docker layer cache(이하 dlc)입니다.

CircleCI와 Docker Layer Cache

  • Docker 이미지는 Dockerfiles에서 빌드되고 Dockerfile의 각 명령은 이미지에 새 레이어를 만듭니다.
  • docker build 또는 docker compose로 Docker 이미지를 빌드하면 DLC는 작업을 실행하는 머신 또는 원격 Docker 인스턴스에 연결된 볼륨에 개별 레이어를 저장합니다.
  • 다음에 이미지 빌드 작업을 실행할 때 CircleCI는 캐시에서 변경되지 않은 레이어를 검색합니다.

파이프라인 실행 사이에 Dockerfile이 동일하게 유지되는 경우 전체 이미지가 캐시에서 검색됩니다. 실행 사이에 Dockerfile에 변경 사항을 도입하는 경우 CircleCI는 변경 사항까지의 모든 레이어를 검색한 다음 새 Dockerfile을 기반으로 나머지 이미지를 빌드합니다. 실행 사이에 Dockerfile이 적게 변경될수록 이미지가 더 빨리 빌드됩니다.

즉, circle ci를 사용할때는 매번 새로운 환경에서 실행되므로 캐시 적용을 하더라도 매번 새로운 환경에서 실행되므로 효과를 보지 못했었습니다.

 

적용방법

적용방법은 간단합니다. docker_layer_caching: true로 설정하면 됩니다. 

jobs:
  build:
    docker:
      - image: cimg/base:2023.04

    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: true # <- dlc적용

 

주의

dlc를 사용하면 job당 200 credits이 부과되니 비용을 고려하면서 사용해야합니다..

Docker Layer Caching (DLC) 200 credits/job
200 credits = 0.12달러
https://circleci.com/pricing/price-list/

 

Refenece

https://circleci.com/docs/docker-layer-caching/

https://circleci.com/blog/config-best-practices-docker-layer-caching/

728x90
Comments