인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

종운님의 프로필 이미지

작성한 질문수

개발자를 위한 쉬운 도커

레이어 관리

안녕하세요. 레이어 관리 관련해서 질문드리고 싶습니다.

작성

·

86

1

TOPIC1. 레이어 관리에서

RUN 지시어 사용 시 && 연산자를 사용하여 레이어의 개수를 5개에서 1개로 줄이고 있는데요. 이미지의 사이즈를 줄이고 빌드 속도를 높이기 위함. 이라고 말씀을 해주셨습니다.

먼저, 질문은 2가지입니다.

  1. 레이어의 사이즈가 동일한데, 어떤 관점으로 이미지의 사이즈가 축소되는 것인가?

  2. 레이어의 재활용성에 대해서 어떻게 생각하시는지?

     

레이어의 사이즈를 봤을 때 5개, 1개의 사이즈가 116MB로 동일하니 이미지의 사이즈는 동일한 것으로 보입니다. 1개의 레이어는 5개의 레이어를 별도로 불러와서 빌드하지는 않으니 속도가 빨라질 수는 있을 것 같다는 생각이 들어서 빌드의 속도는 빨라지나 이미지의 사이즈가 줄어든다. 라는 부분이 이해가 되지 않았습니다.


흔한 케이스는 아닐 것 같으나, 5개의 레이어를 분리를 하게 되면 레이어를 재사용 할 수 있는 장점이 있을 것 같다는 생각이 들었습니다.

마치, 깃을 다룰 때 한 개의 커밋에 하나의 기능만 포함하도록 한 느낌처럼요. 적절하게 레이어를 분리하는 시점을 찾는 것이 중요한 것으로 얘기를 해주신걸까? 하는 생각을 해봤습니다.

 

답변 2

1

데브위키님의 프로필 이미지
데브위키
지식공유자

종운님 안녕하세요. 데브위키입니다.

 

먼저 1번, 레이어의 사이즈는 차이가 있습니다.

image.png

 

RUN 을 분리한 경우 총 레이어의 합이 148.71, 하나로 합칠 경우 147 입니다.

RUN 지시어 하나에 패키지 설치와 캐시 삭제(rm -rf /var/lib/apt/lists/*)를 한 번에 하면, 레이어에 쌓이는 캐시 정보가 지워지는 효과가 있습니다.

예를 들어 첫 번째 케이스는 아래와 같이 레이어가 구성됩니다.

1번 레이어: 패키지설치+캐시

2번 레이어: 패키지설치+캐시

3번 레이어: 패키지설치+캐시

4번 레이어: 캐시 제거

1~3 단계에 캐시가 쌓이기 때문에, 한 개의 레이어에서 설치+캐시 제거를 함께 수행하는 것보다 일부 사이즈가 커지는 현상이 발생합니다. 이 부분은 패키지의 개수가 많아질 수록 증가하게 됩니다.

 

또한 레이어가 적을수록 빌드가 더 효율적으로 동작합니다. 레이어가 한 개가 늘어날 수록 커밋 단계가 늘어나기 때문에, 캐시를 사용하지 않는 경우 결과가 동일하더라도 레이어가 많은 빌드의 시간이 늘어날 수 있습니다.

 

정리하자면 레이어는 가능한 적게 구성하는것이 좋으며, 레이어를 재사용 해서 캐시의 장점을 활용할 수 있다고 판단될 경우에만 분리하시는게 좋다고 생각합니다.

 

예를 들어 패키지 A,B,C는 앞으로의 커밋에서도 동일한 버전이 설치될 것이고, 패키지 D,E는 상황에 따라 버전이 바뀌거나 다른 패키지로 대체될 가능성이 높을 수 있을 것입니다.

이 경우 설치 레이어를 두 개로 분리하여 첫 번째 레이어에서 패키지 A,B,C를 설치하고, 두 번째 레이어에서 패키지 D,E를 설치합니다. 이 경우 두 번째 레이어가 변경되어도 첫 번째 레이어는 캐시로 재활용하기 때문에 빌드 시간을 단축시킬 수 있을 것입니다.

 

강의 들으시면서 더 궁금하신 부분이 있으면 편하게 질문해주세요!

종운님의 프로필 이미지
종운
질문자

답변 감사드립니다~~~! 오해가 있던 부분이 명확하게 풀렸어요~! 강의 정말 재밌게 완강했습니다!

혹시, 다른 Q&A 에서 쿠버네티스 강의도 준비중이시라고 들었는데, 계획 시점이 별도로 있으신가요~?

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 종운님.

Docker의 이미지를 구성하는 레이어와 그 관리 방식에 대해 질문해 주셨군요. Docker 이미지는 여러 레이어로 구성되며, 각 레이어는 명령어 실행 결과의 파일 시스템 차이를 기록하고 있습니다. 이러한 레이어의 관리가 중요한 이유 몇 가지와 관련해서 설명을 드리겠습니다.

1. 이미지 사이즈와 레이어 수에 관한 이해

  • 이미지 사이즈: 각각의 RUN 명령어는 새로운 레이어를 생성합니다. 여러 RUN 지시어를 사용하여 레이어를 나눌 경우, 각 레이어가 완전히 별개로 작성되므로 해당 레이어에 포함된 구조나 정보가 중복될 수 있습니다. 이를 최소화하는 것이 사이즈를 줄이는 데 기여할 수 있습니다.
  • 빌드 속도: RUN 명령어를 효율적으로 사용하면, 불필요한 레이어 생성이 억제되고, 빌드 시간 단축에 도움이 될 수 있습니다. 이는 이미지 사이즈가 아닌 빌드 프로세스 최적화의 측면에서 이해하시면 됩니다.

2. 레이어 재활용성에 대한 생각

  • 레이어의 재사용: Docker는 동일한 명령어가 포함된 레이어를 캐시하여 빌드시 재사용합니다. 레이어가 잘 분리되어 있다면, 일부 작업이 중복 실행될 필요가 없어질 수도 있습니다. 말씀하신 대로 기능별로 레이어를 나누어 커밋하는 전략을 도입하면 더 효율적인 이미지 관리가 가능합니다.

지식공유자의 답변을 기반으로 유사한 주제에 대한 다른 질문과 답변을 알려 드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

종운님의 프로필 이미지

작성한 질문수

질문하기