डॉकटर कंटेनर की छवियां इतनी बड़ी क्यों हैं?


177

मैंने फेडोरा (शुरुआत में 320 एमबी) से डॉकरफाइल के माध्यम से एक सरल छवि बनाई।

जोड़ा गया नैनो (1 एमबी आकार का यह छोटा संपादक), और छवि का आकार 530 एमबी तक बढ़ गया है। मैंने उस (30-ईश एमबी) के ऊपर गिट जोड़ा है, और फिर मेरी छवि का आकार आकाश-रॉकेट 830 एमबी है।

क्या वह पागल नहीं है?

मैंने इतिहास / मध्यवर्ती छवियों को हटाने के लिए कंटेनर को निर्यात और आयात करने की कोशिश की है। यह प्रयास 25 एमबी तक बचा है, अब मेरी छवि का आकार 804 एमबी है। मैंने एक पर कई कमांड चलाने की भी कोशिश की हैRUN , लेकिन अभी भी मुझे वही शुरुआती 830MB मिल रहा है।

मुझे अपनी शंका हो रही है अगर यह डॉकटर का उपयोग करने के लायक है। मेरा मतलब है, मैंने मुश्किल से कुछ भी स्थापित किया है और मैं 1 जीबी से अधिक मार रहा हूं। अगर मुझे डेटाबेस जैसे कुछ गंभीर सामान को जोड़ना होगा और इसी तरह मैं डिस्क स्थान से बाहर चला सकता हूं।

किसी को भी छवियों के हास्यास्पद आकार से ग्रस्त है? आप इसके साथ कैसे लेन - देन करते हैं?

जब तक मेरा डॉकरीफाइल बुरी तरह से गलत नहीं है?

FROM fedora:latest
MAINTAINER Me NotYou <email@dot.com>
RUN yum -y install nano
RUN yum -y install git

लेकिन यह कल्पना करना मुश्किल है कि यहां क्या गलत हो सकता है।


आप अपने कंटेनर का आकार कहाँ और कैसे माप रहे हैं? क्या yum clean allआकार पर कोई प्रभाव पड़ता है?
20

2
छवियों की अपेक्षा एक अच्छा आकार है क्योंकि यह छवि, मूल छवि (ओं) और आधार छवि का एक संचय है। इसके अलावा, यम केवल उक्त ऐप ही नहीं, बल्कि उनकी निर्भरता भी स्थापित करता है। docs.docker.com/terms/container
rexposadas

2
खैर मेरी "मापने" का निष्पादन है, docker imagesजिसमें अंतिम कॉलम में 830MB का भारी अंतर है। मैं इस तथ्य से अनजान हो सकता हूं कि मेरी छवि का वास्तविक आकार क्या है क्योंकि docker images कमांड बताती है कि यह 830MB आभासी आकार है। लेकिन फिर, छवि का वास्तविक आकार क्या है?
झेन

जवाबों:


118

जैसा कि @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

यह महत्वपूर्ण है कि प्रत्येक आरयूएन के लिए, परत के प्रतिबद्ध होने से पहले, या फिर हटाए जाने से वास्तव में डेटा नहीं हटाया जाता है। यही है, एक संघ / कॉपी-ऑन-राइट फ़ाइल सिस्टम में, अंत में सफाई फ़ाइल सिस्टम के उपयोग को कम नहीं करती है क्योंकि वास्तविक डेटा पहले से ही कम परतों के लिए प्रतिबद्ध है। इसके चारों ओर जाने के लिए आपको प्रत्येक परत पर सफाई करनी चाहिए।

$ 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

1
मामले की जांच करने के आपके प्रयास के लिए धन्यवाद, और हाँ मैं अपनी छवि का आकार लगभग 635MB कम कर पाया (यह निष्पादन के बाद आभासी छवि आकार के रूप में प्रस्तुत मूल्य है docker images)। क्या उन पुरानी परतों को हटाना / हटाना / नष्ट करना संभव है? अधिक विशिष्ट होने के लिए: मैं पूरी तरह से (आपके उदाहरण पर आधारित) छवियों को हटाना चाहता हूं: इतिहास से 172743bd5d60, 3f2fed40e4b0, fd241224e9cf, 511136ea3d5a, ताकि मेरी वर्चुअल छवि का आकार कम से कम अंतिम छवि के आकार के समान हो, यहां ~ 260MB ।
ज़ेन

(1 टिप्पणी के लिए बहुत लंबा) जब तक कि आभासी छवि आकार का एचडीडी पर वास्तविक आकार से कोई लेना-देना नहीं है? यदि यह मामला है, तो मेरी छवियों के वास्तविक आकार की जांच कैसे / कहां की जाए?
ज़ेन

तुम docker exportऔर फिर कर सकते थे docker import। यह परतों को समतल करेगा। मुझे नहीं लगता कि यह आकार को कम करेगा, लेकिन मैं गलत हो सकता हूं।
एंडी

10
हाँ, लेकिन निर्यात ज्यादा बचत नहीं करता है। बहरहाल, मैं वेब के माध्यम से पढ़ने में सक्षम था कि मैं docker में जो देख सकता हूं वह आभासी छवि आकार है। एचडीडी पर वास्तविक आकार मेरे लिए रहस्यपूर्ण लगता है क्योंकि आधिकारिक जानकारी के संबंध में docker ps -sएचडीडी पर वास्तविक आकार दिखाई देता है जो मेरे मामले में था -1B। यह उचित लगता है, शून्य से 1 बाइट । मुझे एचडीडी पर कुछ जगह मिली है ... कानूनी लगता है।
ज़ेन

@Zen क्षमा करें, मैं अनुसरण नहीं कर रहा हूं। तो आभासी आकार और डिस्क का आकार 2 अलग-अलग चीजें हैं? आभासी आकार वास्तव में क्या मापता है?
जेसन

63

डॉकर छवियां बड़ी नहीं हैं, आप केवल बड़ी छवियां बना रहे हैं।

scratchछवि 0B है और आपको लगता है कि उपयोग कर सकते हैं अपने कोड पैकेज के लिए अगर आप एक स्थिर द्विआधारी में अपने कोड संकलन कर सकते हैं। उदाहरण के लिए, आप अपने Go प्रोग्राम को संकलित कर सकते हैं और उसके ऊपर पैकेज कर सकते हैंscratch पूरी तरह से प्रयोग करने योग्य छवि बनाने लिए जो 5 एमबी से कम है।

आधिकारिक डॉकटर छवियों का उपयोग नहीं करने के लिए महत्वपूर्ण है, वे बहुत बड़े हैं। स्क्रैच वह सब व्यावहारिक नहीं है, इसलिए मैं आपकी आधार छवि के रूप में अल्पाइन लिनक्स का उपयोग करने की सलाह दूंगा। यह ~ 5 एमबी है, फिर केवल वही जोड़ें जो आपके ऐप के लिए आवश्यक है। Microcontainers के बारे में यह पोस्ट आपको दिखाती है कि अल्पाइन पर बहुत छोटे चित्र कैसे बनाए जाएं।

अद्यतन: आधिकारिक डॉकर छवियां अब अल्पाइन पर आधारित हैं, इसलिए वे अभी उपयोग करने के लिए अच्छे हैं।


2
महान समाधान !, कचरे को रोकना और अधिक सुरक्षित रहना इतना महत्वपूर्ण है ---> कम कोड -> कम चिंता।
Ran Davidovitz

1
शुक्र है कि डॉक आधिकारिक छवियां भी अल्पाइन आधार का उपयोग करने के लिए आगे बढ़ रही हैं, इसलिए अधिक से अधिक आप लोहे के संस्करणों के आधार पर नियमित छवियों का उपयोग कर सकते हैं। Brianchristner.io/docker-is-moving-to-alpine-linux
Martijn Heemels

@Travis R, microcontainers के बारे में पोस्ट करने के लिए आपका लिंक कहीं और स्थानांतरित हो गया लगता है। क्या यह पोस्ट आपको लिंक करने के लिए है?
अलेक्जेंडर एफ।

@AlexanderF। फिक्स्ड लिंक, मुझे बताने के लिए धन्यवाद।
ट्रैविस रीडर

28

यहाँ कुछ और चीजें हैं जो आप कर सकते हैं :

  • कई RUNआज्ञाओं से बचें जहाँ आप कर सकते हैं। एक RUNआदेश में अधिक से अधिक possbile रखो (का उपयोग कर)&& )
  • क्लीन-अप अनावश्यक उपकरण जैसे wget या git (जिसे आपको केवल डाउनलोड या बिल्डिंग सामान की आवश्यकता है, लेकिन आपकी प्रक्रिया को चलाने के लिए नहीं)

इन दोनों और @Andy और @michau की सिफारिशों से मैं अपनी नोडज छवि को 1.062 जीबी से 542 एमबी तक आकार देने में सक्षम था।

संपादित करें: एक और महत्वपूर्ण बात: "मुझे वास्तव में यह समझने में थोड़ा समय लगा कि प्रत्येक डॉकरीफाइल कमांड डेल्टास के साथ एक नया कंटेनर बनाता है। [...] इससे कोई फर्क नहीं पड़ता कि आप बाद के कमांड में फ़ाइलों को rm -rf करते हैं; वे कुछ मध्यवर्ती परत कंटेनर में मौजूद हैं। " तो अब मैं डाल करने में कामयाब रहे apt-get install, wget, npm install(Git निर्भरता के साथ) और apt-get removeएक एकल मेंRUN आदेश है, इसलिए अब मेरी छवि केवल 438 एमबी है।

29/06/17 को संपादित करें

Docker v17.06 के साथ Dockerfiles के लिए एक नई सुविधा आती है: आपके पास FROMएक Dockerfile के अंदर कई स्टेटमेंट हो सकते हैं और केवल अंतिम से सामान FROMआपकी अंतिम Docker छवि में होगा। उदाहरण के लिए, छवि का आकार कम करने के लिए यह उपयोगी है:

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

एक छवि होने का परिणाम देगा केवल आधार छवि के साथ साथ पहला कदम से / var / मेरी परियोजना से सामग्री NodeJS - लेकिन बिना रूबी, अजगर, Git, अधिभारित और जीसीसी!


22

हां, वे आकार हास्यास्पद हैं, और मुझे वास्तव में पता नहीं है कि इतने कम लोग क्यों नोटिस करते हैं।

मैंने एक उबंटू छवि बनाई जो वास्तव में न्यूनतम है (अन्य तथाकथित "न्यूनतम" छवियों के विपरीत)। यह कहा जाता है textlab/ubuntu-essentialऔर 60 एमबी है।

FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano

नैनो स्थापित करने के बाद उपरोक्त छवि 82 एमबी है।

FROM textlab/ubuntu-essential
RUN apt-get update && apt-get -y install nano git

Git में कई और आवश्यक शर्तें हैं, इसलिए छवि बड़ी हो जाती है, लगभग 192 MB। यह अभी भी कम है कि ज्यादातर छवियों का प्रारंभिक आकार।

आप डॉकर के लिए न्यूनतम उबंटू छवि बनाने के लिए लिखी गई स्क्रिप्ट पर भी एक नज़र डाल सकते हैं । आप शायद इसे फेडोरा के लिए अनुकूलित कर सकते हैं, लेकिन मुझे यकीन नहीं है कि आप कितना अनइंस्टॉल कर पाएंगे।


13

निम्नलिखित ने मुझे बहुत मदद की:

अपने कंटेनर के अंदर अप्रयुक्त पैकेज (उदाहरण के लिए रिडिस 1200 एमबी फ्रीज) को हटाने के बाद, मैंने निम्नलिखित कार्य किया है:

  1. डॉकटर निर्यात [कंटेनरआईडी] -ओ कंटर्नमे.टार
  2. docker import -m "प्रतिबद्ध संदेश यहाँ" regername.tar कल्पना: टैग

परतें चपटी हो जाती हैं। नई छवि का आकार छोटा होगा क्योंकि मैंने ऊपर बताए अनुसार कंटेनर से पैकेज हटा दिए हैं।

इसे समझने में बहुत समय लगा और इसीलिए मैंने अपनी टिप्पणी जोड़ी है।


आप दोनों चरणों को एक ही चरण में जोड़ सकते हैंdocker export <CONTAINER ID> | docker import - some-image-name:latest
अनुज कुमार

8

सर्वोत्तम अभ्यास के लिए, आपको एक एकल RUN कमांड को निष्पादित करना चाहिए, क्योंकि डॉकफाइल में प्रत्येक RUN निर्देश छवि में एक नई परत लिखता है और हर परत को डिस्क पर अतिरिक्त स्थान की आवश्यकता होती है। संख्या की परतों को न्यूनतम रखने के लिए, किसी भी फ़ाइल हेरफेर को स्थापित करना, हिलना, निकालना, निकालना, आदि, आदर्श रूप से एक एकल RUN निर्देश के तहत किया जाना चाहिए

FROM fedora:latest
RUN yum -y install nano git && yum -y clean all

4

डॉकर स्क्वैश इसका एक बहुत अच्छा समाधान है। आप ऐसा कर सकते हैं$packagemanager clean हर पंक्ति के बजाय अंतिम चरण में और फिर सभी परतों से छुटकारा पाने के लिए बस एक डॉक स्क्वैश चला सकते हैं।

https://github.com/jwilder/docker-squash


0

हाँ परत प्रणाली काफी आश्चर्यजनक है। यदि आपकी आधार छवि है और आप निम्न कार्य करके इसे बढ़ाते हैं:

# 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 चरणों में बहुत सारे एक्सट्रेक्ट, इंस्टाल और क्लीनअप मैजिक को इमेजेस को स्थापित करने के लिए मैनेज करना होगा, जैसे कि सॉफ्टवेयर इंस्टॉल किया गया है।

इससे जीवन बहुत कठिन हो जाता है ...

DockerBuild प्रतिबद्ध किए बिना RUN चरणों को याद कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.