도커 컨테이너 이미지가 이렇게 큰 이유는 무엇입니까?
페도라의 도커 파일(초기 320MB)을 통해 간단한 이미지를 만들었습니다.
나노(1MB 크기의 이 작은 편집기)를 추가하고 이미지 크기가 530MB로 증가했습니다. 여기에 깃(30MB)을 추가하고 이미지 크기가 830MB로 스카이 로켓을 추가했습니다.
말도 안 돼요?
이력/중간 이미지를 제거하기 위해 컨테이너를 내보내고 가져오려고 했습니다.이 으로 최대 할 수 있었고, 현재 대 25MB고,가 804MB다에서 . 또한 하나에 여러 명령어를 실행하려고 했습니다.RUN 를 830MB의 초기 를 받고 .
도커를 사용할 가치가 있는지 의문이 듭니다.제 말은, 저는 거의 아무것도 설치하지 않았고 1GB를 초과하고 있습니다.데이터베이스와 같은 심각한 것을 추가해야 한다면 디스크 공간이 부족할 수도 있습니다.
터무니없는 크기의 이미지로 고통 받는 사람?어떻게 대처합니까?
내 도커 파일이 심하게 틀리지 않는 한?
FROM fedora:latest
MAINTAINER Me NotYou <email@dot.com>
RUN yum -y install nano
RUN yum -y install git
하지만 여기서 무엇이 잘못될지 상상하기는 어렵습니다
@rexposadas가 말했듯이 이미지에는 모든 계층이 포함되며 각 계층에는 설치한 작업에 대한 모든 종속성이 포함됩니다. 기본 영상:지(예:fedora:latest뼈가 거의 없는 경향이 있습니다.설치된 소프트웨어의 종속성 개수에 놀랄 수도 있습니다.
는 를 수 .yum -y clean all결:
FROM fedora:latest
RUN yum -y install nano && yum -y clean all
RUN yum -y install git && yum -y clean all
계층이 커밋되기 전에, 그렇지 않으면 삭제해도 실제로 데이터가 제거되지 않는 각 RUN에 대해 이 작업을 수행하는 것이 중요합니다.즉, 유니온/카피 온 라이트 파일 시스템에서는 실제 데이터가 이미 하위 계층에 할당되어 있기 때문에 마지막에 정리해도 파일 시스템 사용량이 줄어들지 않습니다.이 문제를 해결하려면 각 층마다 청소를 해야 합니다.
$ docker history bf5260c6651d
IMAGE CREATED CREATED BY SIZE
bf5260c6651d 4 days ago /bin/sh -c yum -y install git; yum -y clean a 260.7 MB
172743bd5d60 4 days ago /bin/sh -c yum -y install nano; yum -y clean 12.39 MB
3f2fed40e4b0 2 weeks ago /bin/sh -c #(nop) ADD file:cee1a4fcfcd00d18da 372.7 MB
fd241224e9cf 2 weeks ago /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar 0 B
511136ea3c5a 12 months ago 0 B
도커 이미지는 큰 것이 아니라 큰 이미지를 만들고 있는 것입니다.
scratch이미지는 0B이고 코드를 정적 바이너리로 컴파일할 수 있다면 이를 사용하여 코드를 패키지화할 수 있습니다.예를 들어, 바둑 프로그램을 컴파일하여 5MB 미만의 완전히 사용 가능한 이미지를 만들 수 있습니다.
핵심은 공식 도커 이미지를 사용하지 않는 것입니다, 너무 큽니다.스크래치도 실용적이지 않아서 알파인 리눅스를 기본 이미지로 사용하는 것을 추천합니다.최대 5MB이며, 앱에 필요한 내용만 추가합니다.Microcontainers에 대한 이 게시물은 Alpine을 기반으로 매우 작은 이미지를 만드는 방법을 보여줍니다.
업데이트: 공식 도커 이미지는 현재 알파인 기반이므로 지금 사용해도 좋습니다.
-
RUN명령을 실행할 수 있습니다.다에 한 한 .RUN령용) )&&) - wget 또는 git과 같은 불필요한 도구 정리(다운로드나 구축에만 필요하고 프로세스를 실행하지는 않음)
그리고 @Andy와 @michau의 권장사항을 모두 사용하여 nodejs 이미지의 크기를 1.062GB에서 542MB로 조정할 수 있었습니다.
편집: 한가지 더 중요한 것은: "각 Dockerfile 명령어가 델타와 함께 새로운 컨테이너를 생성한다는 것을 이해하는 데 시간이 걸렸습니다. [...] 나중에 명령어로 rf 파일을 입력해도 문제가 되지 않습니다. 파일은 일부 중간 계층 컨테이너에 계속 존재하기 때문입니다." 그래서 이제 겨우 다음 명령어를 입력할 수 있었습니다.apt-get install,wget,npm install 및 (Git함)함apt-get removeRUN 그래서 내 에 없습니다어,는 438MB다입니다.
편집 29/06/17
도커 v17.06에서는 도커 파일에 대한 새로운 기능이 제공됩니다. 개의다를 수 .FROM의 도커 에 있는 마지막.FROM당신의 마지막 도커 이미지에 있을 것입니다.다음과 같이 이미지 크기를 줄이는데 유용합니다.
FROM nodejs as builder
WORKDIR /var/my-project
RUN apt-get install ruby python git openssh gcc && \
git clone my-project . && \
npm install
FROM nodejs
COPY --from=builder /var/my-project /var/my-project
nodejs 베이스 이미지와 /var/my-project의 내용이 포함된 이미지가 첫 단계부터 생성되지만 루비, python, git, opensh 및 gcc는 포함되지 않습니다!
네, 그런 사이즈는 말도 안 되고, 왜 그렇게 적은 사람들이 그걸 알아채는지 정말 모르겠어요.
저는 (다른 소위 "미니멀" 이미지와는 달리) 실제로 미니멀한 우분투 이미지를 만들었습니다.다라고.textlab/ubuntu-essential 60MB의다를 있습니다.
FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano
위 이미지는 나노 설치 후 82MB 입니다.
FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano git
Git에는 더 많은 전제 조건이 있으므로 이미지는 약 192MB로 커집니다. 대부분의 이미지의 초기 크기보다 작습니다.
도커를 위한 최소한의 우분투 이미지를 만들기 위해 내가 쓴 스크립트를 볼 수도 있습니다.페도라에 적응할 수도 있겠지만 얼마나 제거할 수 있을지 모르겠습니다.
다음은 저에게 많은 도움이 되었습니다.
컨테이너 안에서 사용하지 않는 패키지(예: redis 1200mb freed)를 제거한 후 다음 작업을 수행했습니다.
- 도커 수출[ID] -ocontainername.tar
- docker import -m "commit message here" containername.tar imagename:tag
층이 평평해집니다.위와 같이 컨테이너에서 패키지를 제거했기 때문에 새로운 이미지의 크기는 더 작아질 것입니다.
이것을 이해하는 데 시간이 많이 걸렸고 그래서 제가 댓글을 달게 되었습니다.
도커 파일의 모든 RUN 명령은 이미지에 새 레이어를 기록하고 모든 레이어는 디스크에 여유 공간을 필요로 하기 때문에 모범적으로 RUN 명령을 하나 실행해야 합니다.숫자 계층을 최소화하기 위해서는 설치, 이동, 추출, 제거 등과 같은 모든 파일 조작이 한 번의 RUN 명령 하에서 이루어지는 것이 이상적입니다.
FROM fedora:latest
RUN yum -y install nano git && yum -y clean all
도커 스쿼시는 이에 대한 정말 좋은 해결책입니다.넌 할 수 있다.$packagemanager clean모든 줄 대신 마지막 단계에서 모든 층을 제거하기 위해 도커 스쿼시를 실행합니다.
https://github.com/jwilder/docker-squash
네, 레이어 시스템은 꽤 놀랍습니다.기본 이미지가 있는 경우 다음을 수행하여 이미지를 증가시킵니다.
# Test
#
# VERSION 1
# use the centos base image provided by dotCloud
FROM centos7/wildfly
MAINTAINER JohnDo
# Build it with: docker build -t "centos7/test" test/
# Change user into root
USER root
# Extract weblogic
RUN rm -rf /tmp/* \
&& rm -rf /wildfly/*
이미지의 크기가 정확히 같습니다.이는 기본적으로 설치된 소프트웨어만큼 이미지를 작게 만들기 위해 수많은 추출, 설치 및 정리 마법을 실행 단계에 투입해야 한다는 것을 의미합니다.
이것은 삶을 훨씬 힘들게 만듭니다.
도커빌드에 커밋이 없는 RUN 단계가 없습니다.
도커 제작 과정에서도 비슷한 문제가 있었습니다.제작된 각 이미지는 다른 이미지보다 상당히 컸습니다.알고 보니 우리는 tar.gz 파일을 이미지에 포함하고 있었습니다.이 중에는 우리가 서버에 업로드하는 압축 이미지도 포함되어 있습니다.그래서 각각의 이미지에는 우연히 이전의 이미지들이 들어있었습니다.이미지 크기는 곧 8gb 범위에 들어섰습니다.
dockrignore는 당신의 친구입니다.이미지를 빌드하는 데 필요하지 않은 프로젝트의 모든 것이 무시 파일에 있는지 확인합니다.
언급URL : https://stackoverflow.com/questions/24394243/why-are-docker-container-images-so-large
'programing' 카테고리의 다른 글
| SQL Server localDB를 최신 버전으로 업그레이드하려면 어떻게 해야 합니까? (0) | 2023.09.23 |
|---|---|
| Oracle에서 문자열을 숫자로 선택 (0) | 2023.09.23 |
| Powershell을 사용하여 SQL Server 버전을 확인하려면 어떻게 해야 합니까? (0) | 2023.09.18 |
| Windows 8 및 10에서 npm 경로 수정 (0) | 2023.09.18 |
| Enter key without submit 버튼으로 양식을 제출하시겠습니까? (0) | 2023.09.18 |