Docker
छवियों का निर्माण
खोज…
पैरामीटर
पैरामीटर | विवरण |
---|---|
--खींचें | यह सुनिश्चित करता है कि बाकी डॉक़रफाइल बनाने से पहले आधार छवि ( FROM ) अद्यतित हो। |
डॉकफाइल से एक छवि का निर्माण
एक बार जब आप एक Dockerfile है, तो आप इसे से एक छवि का निर्माण का उपयोग कर सकते हैं docker build
। इस आदेश का मूल रूप है:
docker build -t image-name path
यदि आपके डॉकरीफाइल का नाम Dockerfile
नहीं है, तो आप निर्माण करने के लिए डॉकरफाइल का नाम देने के लिए -f
ध्वज का उपयोग कर सकते हैं।
docker build -t image-name -f Dockerfile2 .
उदाहरण के लिए, dockerbuild-example:1.0.0
नाम की छवि बनाने के dockerbuild-example:1.0.0
मौजूदा कार्य निर्देशिका में एक Dockerfile
से dockerbuild-example:1.0.0
:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
अधिक विकल्पों और सेटिंग्स के लिए docker build
उपयोग दस्तावेज़ देखें।
एक सामान्य गलती उपयोगकर्ता होम डायरेक्टरी ( ~
) में डॉकरफाइल बना रही है। यह एक बुरा विचार है क्योंकि docker build -t mytag .
दौरान docker build -t mytag .
यह संदेश लंबे समय तक दिखाई देगा:
प्रसंग अपलोड करना
इसका कारण है डॉकटर डेमन सभी उपयोगकर्ता की फाइलों (दोनों होम डायरेक्टरी और यह सबडायरेक्टरीज) को कॉपी करने की कोशिश कर रहा है। डॉकफाइल के लिए हमेशा एक निर्देशिका निर्दिष्ट करके इससे बचें।
निर्माण निर्देशिका में .dockerignore
फ़ाइल जोड़ना एक अच्छा अभ्यास है । इसका सिंटैक्स .gitignore
फ़ाइलों के समान है और यह सुनिश्चित करेगा कि केवल वांछित फाइलें और निर्देशिकाएं बिल्ड के संदर्भ के रूप में अपलोड की गई हैं।
एक साधारण डॉकफाइल
FROM node:5
FROM
निर्देश से शुरू करने के लिए एक छवि निर्दिष्ट करता है। किसी भी मान्य छवि संदर्भ का उपयोग किया जा सकता है।
WORKDIR /usr/src/app
WORKDIR
निर्देश कंटेनर के अंदर चालू कार्यशील निर्देशिका को सेट करता है, जो कंटेनर के अंदर चलने वाली cd
बराबर होता है। (नोट: RUN cd
वर्तमान कार्य निर्देशिका को नहीं बदलेगा।)
RUN npm install cowsay knock-knock-jokes
RUN
कंटेनर के अंदर दिए गए कमांड को निष्पादित करता है।
COPY cowsay-knockknock.js ./
COPY
दूसरे संदर्भ द्वारा निर्दिष्ट कंटेनर में स्थान के संदर्भ में बिल्ड संदर्भ ( path
docker build path
पारित docker build path
) से पहले तर्क में निर्दिष्ट फ़ाइल या निर्देशिका की COPY
बनाता है।
CMD node cowsay-knockknock.js
CMD
छवि को चलाने के लिए निष्पादित करने के लिए एक कमांड निर्दिष्ट करता है और कोई कमांड नहीं दी जाती है। docker run
करने के लिए एक कमांड पास करके इसे ओवरराइड किया जा सकता है।
कई अन्य निर्देश और विकल्प हैं; एक पूरी सूची के लिए डॉकरफ़ाइल संदर्भ देखें।
ENTRYPOINT और CMD के बीच अंतर
निर्मित छवियों में डिफ़ॉल्ट रूप से चलाने के लिए कौन सी कमांड निर्दिष्ट Dockerfile
इसके लिए दो Dockerfile
निर्देश हैं। यदि आप केवल CMD
निर्दिष्ट करते हैं, तो ENTRYPOINT
उस कमांड को डिफ़ॉल्ट ENTRYPOINT
का उपयोग करके ENTRYPOINT
, जो कि /bin/sh -c
। जब आप बिल्ट इमेज शुरू करते हैं तो आप या तो एंट्रीपॉइंट और / या कमांड दोनों को ओवरराइड कर सकते हैं। यदि आप दोनों निर्दिष्ट करते हैं, तो ENTRYPOINT
आपके कंटेनर प्रक्रिया के निष्पादन योग्य को निर्दिष्ट करता है, और CMD
को उस निष्पादन योग्य के मापदंडों के रूप में आपूर्ति की जाएगी।
उदाहरण के लिए यदि आपकी Dockerfile
में है
FROM ubuntu:16.04
CMD ["/bin/date"]
तब आप डिफ़ॉल्ट ENTRYPOINT
निर्देश /bin/sh -c
का उपयोग कर रहे हैं, और उस डिफ़ॉल्ट प्रविष्टि के साथ /bin/date
चला रहे हैं। आपकी कंटेनर प्रक्रिया की कमान /bin/sh -c /bin/date
। एक बार जब आप इस छवि को चलाते हैं तो यह वर्तमान तिथि को डिफ़ॉल्ट रूप से प्रिंट कर लेगा
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
आप कमांड लाइन पर CMD
को ओवरराइड कर सकते हैं, जिस स्थिति में यह आपके द्वारा निर्दिष्ट कमांड को चलाएगा।
$ docker run test /bin/hostname
bf0274ec8820
यदि आप एक ENTRYPOINT
निर्देश निर्दिष्ट करते हैं, तो Docker उस निष्पादन योग्य का उपयोग करेगा, और CMD
निर्देश कमांड के डिफ़ॉल्ट पैरामीटर (एस) को निर्दिष्ट करता है। तो अगर आपके Dockerfile
में शामिल हैं:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
फिर इसे चलाने से उत्पादन होगा
$ docker build -t test .
$ docker run test
Hello
आप चाहें तो विभिन्न पैरामीटर प्रदान कर सकते हैं, लेकिन वे सभी /bin/echo
चलेंगे
$ docker run test Hi
Hi
यदि आप अपने डॉकरीफाइल में सूचीबद्ध प्रविष्टि बिंदु को ओवरराइड करना चाहते हैं (यानी यदि आप इस कंटेनर में echo
से अलग कमांड चलाना चाहते हैं), तो आपको कमांड लाइन पर --entrypoint
पैरामीटर निर्दिष्ट करने की आवश्यकता है:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
आम तौर पर आप ENTRYPOINT
निर्देश का उपयोग अपने मुख्य अनुप्रयोग को चलाने के लिए करना चाहते हैं, और डिफ़ॉल्ट मापदंडों को CMD
।
Dockerfile में एक पोर्ट एक्सपोज़ करना
EXPOSE <port> [<port>...]
EXPOSE
निर्देश डॉकर को सूचित करता है कि कंटेनर रनटाइम पर निर्दिष्ट नेटवर्क पोर्ट पर सुनता है।EXPOSE
कंटेनर के बंदरगाहों को मेजबान के लिए सुलभ नहीं बनाता है। ऐसा करने के लिए, आपको पोर्ट की एक श्रृंखला को प्रकाशित करने के लिए या-p
ध्वज का उपयोग करना चाहिए या-P
सभी पोर्ट को प्रकाशित करने के लिए-ध्वज का उपयोग करना चाहिए। आप एक पोर्ट नंबर को उजागर कर सकते हैं और इसे दूसरे नंबर के तहत बाहरी रूप से प्रकाशित कर सकते हैं।
उदाहरण:
अपने डॉकरफाइल के अंदर:
EXPOSE 8765
होस्ट मशीन से इस पोर्ट को एक्सेस करने के लिए, अपने docker run
कमांड में इस तर्क को शामिल करें:
-p 8765:8765
ENTRYPOINT और CMD को क्रिया और पैरामीटर के रूप में देखा जाता है
मान लीजिए कि आपके पास एक डॉकरीफाइल खत्म हो रहा है
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
यदि आप इस छवि को एक के साथ बनाते हैं
docker built -t inspector .
इस तरह के एक आदेश के साथ इस तरह के एक Dockerfile के साथ बनाया छवि लॉन्च
docker run -it --net=host --rm inspector
, nethogs wlan0 नाम के इंटरफ़ेस की निगरानी करेंगे
अब यदि आप इंटरफ़ेस eth0 (या wlan1, या ra1 ...) की निगरानी करना चाहते हैं, तो आप कुछ ऐसा करेंगे
docker run -it --net=host --rm inspector eth0
या
docker run -it --net=host --rm inspector wlan1
डॉकिंग हब या किसी अन्य रजिस्ट्री के लिए एक छवि को धक्का देना और खींचना
स्थानीय रूप से बनाई गई छवियों को डॉकटर हब या रजिस्ट्री के रूप में जाना जाने वाले किसी भी अन्य डॉकटर रेपो होस्ट में धकेल दिया जा सकता है। मौजूदा डॉकटर हब खाते में साइन docker login
करने के लिए docker login
का उपयोग करें।
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
एक सर्वर नाम निर्दिष्ट करके एक अलग डॉक रजिस्ट्री का उपयोग किया जा सकता है। यह निजी या स्व-होस्टेड रजिस्ट्रियों के लिए भी काम करता है। इसके अलावा, सुरक्षा के लिए बाहरी क्रेडेंशियल्स स्टोर का उपयोग करना संभव है।
docker login quay.io
फिर आप उन छवियों को टैग और पुश कर सकते हैं जिन्हें आप लॉग इन करते हैं। आपका रिपॉजिटरी server/username/reponame:tag
रूप में निर्दिष्ट किया जाना चाहिए। वर्तमान में सर्वर को छोड़ना डॉकटर हब में चूक करता है। (डिफ़ॉल्ट रजिस्ट्री को किसी अन्य प्रदाता में नहीं बदला जा सकता है, और इस सुविधा को लागू करने की कोई योजना नहीं है ।)
docker tag mynginx quay.io/cjsimon/mynginx:latest
एक ही छवि के विभिन्न संस्करणों, या शाखाओं का प्रतिनिधित्व करने के लिए विभिन्न टैग का उपयोग किया जा सकता है। कई अलग-अलग टैग वाली छवि प्रत्येक टैग को एक ही रेपो में प्रदर्शित करेगी।
अपनी नई टैग की गई छवि सहित, अपने स्थानीय मशीन पर स्थापित चित्रों की एक सूची देखने के लिए docker images
का उपयोग करें। फिर रजिस्ट्री पर अपलोड करने के लिए पुश का उपयोग करें और छवि को डाउनलोड करने के लिए खींचें।
docker push quay.io/cjsimon/mynginx:latest
-a
विकल्प निर्दिष्ट करके किसी चित्र के सभी टैग खींचे जा सकते हैं
docker pull quay.io/cjsimon/mynginx:latest
प्रॉक्सी का उपयोग करके बिल्डिंग
अक्सर जब एक डोकर छवि निर्माण, Dockerfile निर्देश है कि रन कार्यक्रमों इंटरनेट से संसाधनों को लाने (शामिल wget
उदाहरण उदाहरण के लिए GitHub पर एक कार्यक्रम द्विआधारी निर्माण खींचने के लिए के लिए)।
डॉकटर को सेट किए गए पर्यावरण चर को पारित करने का निर्देश देना संभव है ताकि इस तरह के कार्यक्रम एक प्रॉक्सी के माध्यम से उन भ्रूणों को निष्पादित करें:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
पर्यावरण चर हैं जो केवल बिल्ड समय पर उपलब्ध हैं।