컨테이너 레지스트리 데이터 전송 줄이기
이미지 또는 태그가 컨테이너 레지스트리에서 다운로드되는 빈도에 따라 데이터 전송량이 상당히 높을 수 있습니다. 이 페이지에서는 컨테이너 레지스트리와 함께 전송하는 데이터의 양을 줄이는 몇 가지 권장 사항과 팁을 제공합니다.
데이터 전송 사용 확인
전송 사용량은 GitLab UI 내에서 확인할 수 없습니다. GitLab-#350905는 이 정보를 제공하는 작업을 추적하는 에픽입니다.
이미지 크기 결정
다음 도구 및 기술을 사용하여 이미지의 크기를 결정하세요:
-
Skopeo:
Skopeoinspect
명령을 사용하여 API 호출을 통해 레이어 수와 크기를 검사합니다.
따라서docker pull IMAGE
를 실행하기 전에 이 데이터를 검사할 수 있습니다. -
CI에서의 Docker:
이미지를 Docker로 푸시하기 전에 GitLab CI를 사용할 때 이미지 크기를 검사하고 기록합니다.
예:docker inspect "$CI_REGISTRY_IMAGE:$IMAGE_TAG" \ | awk '/"Size": ([0-9]+)[,]?/{ printf "Final Image Size: %d\n", $2 }'
-
Dive
Docker 이미지, 레이어 내용 탐색 및 크기를 줄이는 방법을 발견하는 도구입니다.
이미지 크기 줄이기
더 작은 기본 이미지 사용
Alpine Linux와 같은 더 작은 기본 이미지 사용을 고려하세요.
Alpine 이미지는 약 5MB로, Debian과 같은 인기 있는 기본 이미지보다 몇 배 작습니다.
응용 프로그램이 Go 응용 프로그램과 같은 독립형 정적 이진 파일로 배포되는 경우,
Docker scratch 기본 이미지를 사용하는 것도 고려할 수 있습니다.
특정 기본 이미지 OS를 사용해야 하는 경우, -slim
또는 -minimal
변형을 찾으세요.
이는 이미지 크기를 줄이는 데 도움이 됩니다.
기본 이미지 위에 설치하는 운영 체제 패키지에 대해서도 주의하세요.
이로 인해 수백 메가바이트가 추가될 수 있습니다.
설치된 패키지 수를 최소한으로 유지하도록 노력하세요.
다단계 빌드는 일시적인 빌드 종속성을 정리하는 강력한 도구가 될 수 있습니다.
다음과 같은 도구를 사용하는 것도 고려할 수 있습니다:
-
DockerSlim
컨테이너 이미지의 크기를 줄이기 위한 명령 집합을 제공합니다. -
Distroless 이미지는
응용 프로그램과 해당 런타임 종속성만 포함합니다.
표준 Linux 배포판에서 기대할 수 있는 패키지 관리자, 셸 또는 기타 프로그램이 포함되지 않습니다.
레이어 최소화
Dockerfile의 각 명령은 파일 시스템 변경 사항을 기록하는 새 레이어로 이어집니다.
일반적으로 더 많거나 더 큰 레이어는 더 큰 이미지를 만들게 됩니다.
Dockerfile에서 패키지를 설치할 때 레이어 수를 최소화하도록 노력하세요.
그렇지 않으면 빌드 프로세스의 각 단계가 이미지 크기를 증가시킬 수 있습니다.
레이어의 수와 크기를 줄이는 다양한 전략이 있습니다.
예를 들어, 설치하려는 운영 체제 패키지마다 RUN
명령을 사용하는 대신
단일 RUN
명령으로 모든 패키지를 설치하여 빌드 프로세스의 단계를 줄이고
이미지 크기를 줄일 수 있습니다.
또 다른 유용한 전략은 모든 일시적인 빌드 종속성을 제거하고
패키지를 설치하기 전후에 운영 체제 패키지 관리자 캐시를 비활성화 하거나 비우는 것입니다.
이미지를 빌드할 때는 관련 파일만 복사하는지 확인하세요.
Docker의 경우 .dockerignore
를 사용하는 것이
빌드 프로세스가 관련 없는 파일을 무시하도록 돕습니다.
DockerSlim와 같은 서드파티 도구를 사용하여 이미지를 최소화할 수도 있습니다.
이런 도구를 잘못 사용하면 특정 조건에서 응용 프로그램이 작동하는 데 필요한 종속성을 제거할 수 있습니다.
따라서 사후에 이미지를 최소화하려고 시도하기보다는
빌드 프로세스 동안 더 작은 이미지를 만드는 것을 지향하는 것이 바람직합니다.
다단계 빌드 사용
multi-stage builds를 사용하면 Dockerfile에서 여러 개의 FROM
문을 사용할 수 있습니다.
각 FROM
명령은 서로 다른 기본 이미지를 사용할 수 있으며, 각각 새로운 빌드 단계를 시작합니다.
최종 이미지에 원하지 않는 모든 것을 남기고 하나의 단계에서 다른 단계로 아티팩트를 선택적으로 복사할 수 있습니다.
특히 빌드 종속성을 설치해야 하지만 최종 이미지에 존재할 필요가 없는 경우에 유용합니다.
이미지 풀 정책 사용
docker
또는 docker+machine
실행기를 사용할 때, 러너 config.toml
에서 Docker 이미지를 당길 때 러너의 작동 방식을 정의하는 pull_policy
매개변수를 설정할 수 있습니다.
큰 이미지와 업데이트가 드물게 이루어지는 이미지를 사용할 때 데이터 전송을 피하려면 원격 레지스트리에서 이미지를 가져올 때 if-not-present
풀 정책을 사용하는 것을 고려하세요.
Docker 레이어 캐싱 사용
docker build
를 실행할 때, Dockerfile
의 각 명령은 하나의 레이어로 변환됩니다.
이 레이어는 캐시로 남아 있으며 변경 사항이 없으면 재사용할 수 있습니다.
--cache-from
인수를 사용하여 docker build
명령의 캐시 소스로 사용할 태그가 있는 이미지를 지정할 수 있습니다.
여러 이미지를 캐시 소스로 지정하려면 여러 --cache-from
인수를 사용할 수 있습니다.
이렇게 하면 빌드를 가속화하고 전송되는 데이터 양을 줄일 수 있습니다.
자세한 내용은 Docker 레이어 캐싱 문서를 참조하세요.
자동화 빈도 확인
우리는 종종 특정 간격으로 정기 작업을 수행하기 위해 컨테이너 이미지에 번들로 묶인 자동화 스크립트를 생성합니다.
자동화가 GitLab Registry에서 GitLab.com 외부의 서비스로 컨테이너 이미지를 끌어오고 있는 경우 이러한 간격의 빈도를 줄일 수 있습니다.
관련 문제
- 기본 Docker 이미지가 업데이트될 때 이미지를 재빌드하고 싶을 수 있습니다. 하지만 파이프라인 구독 한도가 너무 낮습니다 이 기능을 활용하기 위해서는.
우회 방법으로 하루에 한 번 또는 하루 여러 번 재빌드할 수 있습니다.
GitLab-#225278는 이 워크플로우를 도와주기 위해 한도를 높일 것을 제안합니다.