클라우드와 컨테이너의 기초

FROM alpine
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /opt && rm /tmp/data.tar.gz

500 MB의 아카이브 data.tar.gz를 풀기 위해 위의 Dockerfile로 이미지를 만들었다. 압축을 푼 뒤 같은 RUN 안에서 아카이브를 삭제했는데도, 이미지 크기는 아카이브만큼 큰 채로였다. 이유와 대책의 조합으로 가장 적절한 것은?

  1. A&& 뒤의 rm은 빌드할 때는 실행되지 않기 때문이다. rm을 별도의 RUN 명령으로 나누어 쓴다
  2. B삭제한 파일이 빌드 캐시로서 이미지에 남기 때문이다. docker build에 --no-cache를 붙여 다시 빌드한다
  3. CCOPY 명령이 만든 레이어에 아카이브가 남기 때문이다. 멀티 스테이지 빌드로, 압축을 푼 파일만 최종 이미지에 복사한다
정답과 해설 보기

정답: C. COPY 명령이 만든 레이어에 아카이브가 남기 때문이다. 멀티 스테이지 빌드로, 압축을 푼 파일만 최종 이미지에 복사한다

Dockerfile의 명령 중 파일 시스템을 바꾸는 것(COPY나 RUN 등)은 각각 하나의 레이어가 되며, 이미지는 그 레이어들을 겹친 것입니다. 나중 레이어에서 파일을 삭제해도 삭제했다는 표시가 위 레이어에 기록될 뿐이어서, COPY 레이어에 들어간 500 MB의 아카이브는 이미지에 남습니다. 멀티 스테이지 빌드로 압축 해제를 다른 스테이지에서 수행하고 압축을 푼 파일만 COPY --from으로 마지막 스테이지에 가져오면, 아카이브는 최종 이미지에 포함되지 않습니다. 다운로드와 압축 해제와 삭제를 하나의 RUN 안에서 수행하는 방법도 있지만, COPY로 가져온 파일에는 쓸 수 없습니다.

이 분야 연습하기 분야로 돌아가기

클라우드와 컨테이너의 기초의 다른 문제

  1. 같은 베이스 이미지(120 MB) 위에 각각 고유한 레이어를 30 MB씩 겹친 5개의 이미지가 있다. 레이어의 압축이나 메타데이터의 용량은 생각하지 않는다. 서버 1대에 이 5개의 이미지를 모두 가져왔을(pull) 때, 이미지가 사용하는 디스크 용량으로 올바른 것은?
  2. 위의 Dockerfile에서 docker build로 이미지를 만들 때 실행되는 명령과, docker run으로 컨테이너를 시작할 때 실행되는 명령의 조합으로 올바른 것은?
  3. 위의 Dockerfile로 만든 이미지 pinger를 docker run pinger example.com으로 시작했다. 컨테이너 안에서 실행되는 명령으로 올바른 것은?
  4. 포트 80에서 대기하는 웹 서버의 이미지 nginx로부터 위의 명령으로 컨테이너를 시작했다. 호스트의 IP 주소는 192.0.2.10이고 방화벽 등의 제한은 없다고 하자. 같은 네트워크에 있는 다른 PC의 브라우저에서 이 웹 서버에 접속하는 URL로 올바른 것은?
  5. 위의 Dockerfile(B)은 COPY . . 뒤에 RUN npm ci를 두었던 Dockerfile(A)을, 의존성 파일만 먼저 복사하는 순서로 바꾼 것이다. npm ci에는 120초, npm run build에는 30초, COPY . .에는 2초가 걸리고, 다른 명령의 시간은 무시할 수 있다고 하자. 하루에 20회, src 아래의 소스 코드만 바꾸어(package.json과 package-lock.json은 바꾸지 않고) 이미지를 다시 만든다. 이전 빌드의 캐시를 사용할 수 있을 때, 하루 빌드 시간의 합계에서 B가 A보다 짧아지는 시간으로 올바른 것은?