도커를 활용한 서비스 배포하기 (이미지 경량화) #9

2022. 6. 24. 19:38Tech Note

728x90

컨데이너를 계속 업데이트하고 의존성 도구를 추가적으로 설치를 하다보니 용량이 어느새 1.02gb를 넘어서게 되었다.

 

사실 이렇다할 만큼 무언가를 많이 설치 안했는데도 왜 이리 용량을 많이 차지하는지 모르겠다.

물론 OS 자체를 이미지화 한다는 것 자체가 용량이 적게 사용 될 것 같진 않다.

 

그렇다면 이대로 사용해야 할 것인가.. 그건 아니다.

블로깅을 다시 해보니 현재 여러가지 방법이 존재하는 것으로 보인다.

 

이미지 경량화를 위한 방법을 리스트업해보면 아래와 같다.

1. 경량화 이미지 사용
2. Use builder pattern
3. Use multi-stage builds

경량화 이미지 사용

기본적인 베이스 용량이 작은 Alpine 이미지를 사용하는 것입니다.
Alpine 이미지는 작고, 보안이 뛰어나고 간단함을 염두에 두고 만들어진 Linux 이미지입니다.
5mb 밖에 되지 않는다는 큰 장점이 있어 Docker 환경 및 임베디드 환경에서 유용합니다!

https://hub.docker.com/_/alpine

 

Alpine - Official Image | Docker Hub

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

Alpine 이미지를 사용하는 것은 간단하다. 아래와 같이 입력한다.

alpine도 여러 버전이 있으니 docker-hub에서 확인 후 고려해보는 것도 좋다.

> docker pull alpine

아무리 작다지만 운영체제인데 무려 5.53 mb의 이미지 크기를 자랑한다. 거기에 프리웨어

Use builder pattern

이미지를 구축할 때 가장 어려운 것 중 하나는 이미지 크기를 줄이는 것입니다. Dockerfile의 각 명령은 이미지에 계층을 추가하며 다음 계층으로 이동하기 전에 필요하지 않은 아티팩트를 정리해야 한다는 것을 기억해야 합니다. 정말 효율적인 Dockerfile을 작성하려면 일반적으로 레이어를 가능한 한 작게 유지하고 각 레이어에 이전 레이어에서 필요한 아티팩트가 있는지 확인하기 위해 쉘 트릭과 기타 논리를 사용해야 했습니다.
실제로 개발에 사용할 Dockerfile(애플리케이션 구축에 필요한 모든 것이 포함됨)과 프로덕션에 사용할 축소된 하나(애플리케이션과 실행에 필요한 항목만 포함)에 사용하는 것이 매우 일반적이었습니다. 이것을 "빌더 패턴"이라고 합니다. 두 개의 Dockerfile을 유지하는 것은 이상적이지 않습니다.

Alpine 이미지나 Minimum 이미지를 사용하더라도, 의존성 도구들을 하나씩 추가하고 나면 어느새 엄청난 크기의 이미지가 탄생하게 된다. 이러한 문제를 해결하기 위해 과거에는 바이너리를 빌드하기 위한 이미지와, 빌드한 바이너리를 실행하기 위한 경량화된 이미지. 이렇게 두 가지로 이미지를 나누어 관리 했는데, 프로젝트 당 여러 개의 Dockerfile을 관리하는 것은 익숙하지 않고, 편의성 또한 떨어진다. 순서 의존성이 있으니 관리도 쉽지 않은데.

이 강력하지만 불편한 관리 과정을 하나의 Dockerfile로 관리하기 위해 multi-stage builds 라는 관리 방법을 사용하게 된다.

Use multi-stage builds

Dockerfile을 살펴보면 아래와 같다.

 

...

 

해당 파트는 생각보다 내용이 방대하고 알아야할 것이 많다보니 좀 더 공부를 한 후에 다시 작성을 해야 할 것 같다.