이번 글에서는 Docker 이미지의 크기를 최소화하는 방법에 대해 다뤄보겠습니다.
베이스 이미지는 다른 이미지의 기반이 되는 이미지로, 모든 Docker 이미지의 출발점이 됩니다. 예를 들어, 여러분의 커스텀 웹 애플리케이션이 httpd
이미지로부터 빌드된다면, 이 httpd
이미지는 여러분의 애플리케이션 이미지의 부모 이미지가 됩니다. 일반적으로 베이스 이미지와 부모 이미지라는 용어는 혼용될 수 있습니다.
기술적으로 베이스 이미지는 Docker 이미지의 시작점이고, 부모 이미지는 다른 이미지를 기반으로 빌드된 이미지를 의미합니다 이 글에서는 두 용어를 동일하게 사용하겠습니다.
Docker 이미지를 빌드할 때 따라야할 몇 가지 모범 사례가 있습니다.
여러 애플리케이션을 하나의 이미지에 결합하지 마십쇼. 예를 들어, 웹 서버, 데이터베이스, 기타 서비스를 하나의 이미지로 통합하지 말고, 각 서비스별로 별도의 이미지를 만드세요. 이렇게 하면 각 이미지는 자체 라이브러리와 종속성을 가질 수 있고, 다른 애플리케이션에 대해 걱정할 필요가 없습니다.
컨테이너 내에 데이터나 상태를 저장하지 마십쇼. 컨테이너는 일시적인 성격을 가지므로, 파괴되고 다시 생성되더라도 데이터가 손실되지 않도록 데이터를 외부 볼륨이나 캐싱 서비스에 저장하세요
자신의 웹 애플리케이션을 빌드할 때, 기존의 베이스 이미지에서 시작하는 것이 좋습니다. 기술적 요구 사항에 맞는 이미지를 선택하세요. 예를 들어, 애플리케이션이 httpd
를 필요한다면, httpd
이미지를 사용하세요. 이미지를 선택할 때는 공식 소스에서 제공하는지 확인하고, 최신 상태인지 확인하세요.
이미지의 크기를 작게 유지하는 것은 매우 중요합니다. 이렇게 하면 원격 저장소에서 이미지를 더 빠르게 풀링하고, 필요에 따라 인스턴스를 더 쉽게 스핀업할 수 있습니다. 이를 위해 다음과 같은 방법을 사용할 수 있습니다.
curl
또는 wget
과 같은 도구는 공격자가 컨테이너에 접근할 경우 파일을 다운로드하는 데 사용될 수 있으므로 제거하세요. 패키지 관리자도 제거해야 합니다.개발 환경에는 디버그 도구나 다른 패키지가 필요할 수 있지만, 프로덕션 환경에서는 이러한 도구를 포함하지 않는 것이 좋습니다. 프로덕션 환경을 위해 별도의 이미지를 고려하세요.
Google의 Distroless Docker 이미지는 애플리케이션 및 런타임 종속성만 포함하고, 패키지 관리자, 셸, 네트워크 도구, 텍스트 편집기 등 불필요한 프로그램을 포함하지 않습니다. 최소 이미지는 공격에 덜 취약하며, 이미지에 포함된 패키지가 적을수록 취약점도 적습니다.
예를 들어, Trivey
도구를 사용하여 httpd
이미지에서 취약점을 스캔하면 최소 124개의 알려진 취약점이 발견되지만, httpd:alpine
베이스 이미지에서는 취약점이 0개로 나타납니다.
이러한 모범 사례를 따라 Docker 이미지를 최소화하면 빌드 및 풀링 속도가 빨라지고, 보안성이 강화됩니다. 계속해서 이미지를 최적화하고 관리하여 효율적이고 안전한 Docker 환경을 유지하시길 바랍니다.