Docker
चल कंटेनर
खोज…
वाक्य - विन्यास
- docker चलाने [विकल्प] छवि [संचार] [ARG ...]
एक कंटेनर चल रहा है
docker run hello-world
यह डॉकर हब से नवीनतम हैलो-वर्ल्ड छवि लाएगा (यदि आपके पास पहले से नहीं है), एक नया कंटेनर बनाएं, और इसे चलाएं। आपको एक संदेश देखना चाहिए, जिसमें कहा गया है कि आपकी स्थापना सही ढंग से काम करती हुई प्रतीत होती है।
कंटेनर में एक अलग कमांड चल रहा है
docker run docker/whalesay cowsay 'Hello, StackExchange!'
यह कमांड docker/whalesay
इमेज से एक कंटेनर बनाने और कमांड cowsay 'Hello, StackExchange!'
चलाने के लिए cowsay 'Hello, StackExchange!'
इस में। यह एक व्हेल की तस्वीर को Hello, StackExchange!
कहते हुए प्रिंट करना चाहिए Hello, StackExchange!
अपने टर्मिनल के लिए।
यदि छवि में प्रविष्टि बिंदु डिफ़ॉल्ट है तो आप छवि में उपलब्ध किसी भी कमांड को चला सकते हैं:
docker run docker/whalesay ls /
यदि इसे छवि निर्माण के दौरान बदल दिया गया है, तो आपको इसे डिफ़ॉल्ट पर वापस रिवर्स करने की आवश्यकता है
docker run --entrypoint=/bin/bash docker/whalesay -c ls /
इसे चलाने के बाद एक कंटेनर को स्वचालित रूप से हटा दें
आम तौर पर, एक डॉकर कंटेनर बाहर निकलने के बाद भी बना रहता है। यह आपको कंटेनर को फिर से चलाने की अनुमति देता है, इसके फाइल सिस्टम का निरीक्षण करता है, और इसी तरह। हालाँकि, कभी-कभी आप कंटेनर चलाना चाहते हैं और बाहर निकलने के तुरंत बाद उसे हटा देते हैं। उदाहरण के लिए एक कमांड निष्पादित करने या फाइल सिस्टम से फाइल दिखाने के लिए। डॉकर इस उद्देश्य के लिए --rm
कमांड लाइन विकल्प प्रदान करता है:
docker run --rm ubuntu cat /etc/hosts
यह "ubuntu" छवि से एक कंटेनर बनाएगा, / etc / मेजबान फ़ाइल की सामग्री को दिखाएगा और फिर बाहर निकलने के तुरंत बाद कंटेनर को हटा देगा। यह प्रयोग करने के बाद कंटेनरों को साफ करने से रोकने में मदद करता है।
नोट:
--rm
ध्वज के साथ संयोजन के रूप में काम नहीं करता है-d
(--detach
डोकर <1.13.0 में) झंडा।
जब --rm
फ्लैग सेट किया जाता है, तो --rm
कंटेनर से जुड़े वॉल्यूम को हटा देता है जब कंटेनर को हटा दिया जाता है। यह रनिंग docker rm -v my-container
। केवल एक नाम के बिना निर्दिष्ट किए गए वॉल्यूम हटा दिए जाते हैं ।
उदाहरण के लिए, docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs
, /etc
का वॉल्यूम हटा दिया जाएगा, लेकिन /var/log
की मात्रा नहीं होगी। --Volumes-from के माध्यम से विरासत में दिए गए वॉल्यूम को एक ही तर्क के साथ हटा दिया जाएगा - यदि मूल मात्रा को एक नाम के साथ निर्दिष्ट किया गया था तो इसे हटाया नहीं जाएगा।
एक नाम निर्दिष्ट करना
डिफ़ॉल्ट रूप से, small_roentgen
docker run
के साथ बनाए गए कंटेनरों को एक यादृच्छिक नाम जैसे small_roentgen
या modest_dubinsky
। कंटेनर के उद्देश्य की पहचान करने में ये नाम विशेष रूप से सहायक नहीं हैं। यह --name
कमांड लाइन विकल्प पास करके कंटेनर के लिए नाम की आपूर्ति करना संभव है:
docker run --name my-ubuntu ubuntu:14.04
नाम अद्वितीय होने चाहिए; यदि आप एक ऐसा नाम देते हैं जो एक अन्य कंटेनर पहले से ही उपयोग कर रहा है, तो डॉकर एक त्रुटि प्रिंट करेगा और कोई नया कंटेनर नहीं बनाया जाएगा।
डॉकर नेटवर्क में कंटेनर को संदर्भित करते समय एक नाम निर्दिष्ट करना उपयोगी होगा। यह बैकग्राउंड और अग्रभूमि डॉकटर कंटेनर दोनों के लिए काम करता है।
डिफ़ॉल्ट पुल नेटवर्क पर कंटेनरों को नाम से संवाद करने के लिए जोड़ा जाना चाहिए।
मेजबान को एक कंटेनर पोर्ट बांधना
docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp
में मेजबान पर बंदरगाहों का उपयोग करने के क्रम में एक छवि में अवगत कराया गया है (के माध्यम से EXPOSE
Dockerfile निर्देश, या --expose
के लिए आदेश पंक्ति विकल्प docker run
), उन बंदरगाहों का उपयोग कर मेजबान के लिए बाध्य करने की आवश्यकता -p
या -P
आदेश लाइन विकल्प। उपयोग -p
लिए यह आवश्यक है कि निर्दिष्ट पोर्ट (और वैकल्पिक होस्ट इंटरफ़ेस) निर्दिष्ट किया जाए। अपरकेस का उपयोग -P
आदेश पंक्ति विकल्प डोकर की मेजबानी के लिए एक कंटेनर की छवि में सभी उजागर बंदरगाहों बाध्य करने के लिए बाध्य करेगा।
कंटेनर पुनरारंभ नीति (बूट पर कंटेनर शुरू करना)
docker run --restart=always -d <container>
डिफ़ॉल्ट रूप से, डॉकर डोनट पुनरारंभ होने पर डॉकटर कंटेनर को पुनरारंभ नहीं करेगा, उदाहरण के लिए एक मेजबान सिस्टम रिबूट के बाद। - --restart
आपके कंटेनर के लिए रीस्टार्ट पॉलिसी प्रदान करता है - --restart
कमांड लाइन विकल्प की आपूर्ति करके। --restart=always
डेमॉन के पुनरारंभ होने के बाद एक कंटेनर को फिर से चालू करने का कारण होगा। हालाँकि जब वह कंटेनर मैन्युअल रूप से बंद हो जाता है (जैसे docker stop <container>
), तो पुनरारंभ नीति कंटेनर पर लागू नहीं होगी।
आवश्यकता के आधार पर --restart
विकल्प के लिए कई विकल्प निर्दिष्ट किए जा सकते हैं ( --restart=[policy]
)। ये विकल्प प्रभावी होते हैं कि कंटेनर बूट के साथ कैसे शुरू होता है।
नीति | परिणाम |
---|---|
नहीं | डिफ़ॉल्ट मान। कंटेनर को स्वचालित रूप से पुनरारंभ नहीं किया जाएगा, जब कंटेनर बंद हो जाता है। |
ऑन-विफलता [: अधिकतम-पुनर्प्रयास] | केवल तभी पुनरारंभ करें जब कंटेनर विफलता ( non-zero exit status ) के साथ बाहर निकलता है। अनिश्चितकाल के लिए इसे फिर से शुरू करने से बचने के लिए (कुछ समस्या के मामले में), डॉकटर के प्रयासों को फिर से शुरू करने की संख्या को सीमित कर सकता है। |
हमेशा | हमेशा बाहर निकलने की स्थिति की परवाह किए बिना कंटेनर को पुनरारंभ करें। जब आप always निर्दिष्ट करते always , तो डोकर डेमॉन कंटेनर को अनिश्चित काल के लिए पुनरारंभ करने का प्रयास करेगा। कंटेनर हमेशा डेमॉन स्टार्टअप पर शुरू होगा, कंटेनर की वर्तमान स्थिति की परवाह किए बिना। |
जब तक-बंद कर दिया | कंटेनर को हमेशा उसके निकास की स्थिति की परवाह किए बिना पुनः आरंभ करें, लेकिन कंटेनर को एक बंद अवस्था में रखने से पहले इसे डेमॉन स्टार्टअप पर शुरू न करें। |
पृष्ठभूमि में एक कंटेनर चलाएँ
एक कंटेनर को पृष्ठभूमि में चालू रखने के लिए, कंटेनर स्टार्टअप के दौरान -d
कमांड लाइन विकल्प की आपूर्ति करें:
docker run -d busybox top
विकल्प -d
कंटेनर को अलग मोड में चलाता है। यह भी -d=true
बराबर -d=true
।
बंद मोड में एक कंटेनर स्वचालित रूप से हटाया नहीं जा सकता है जब यह बंद हो जाता है, इसका मतलब है कि कोई -d विकल्प के साथ संयोजन में -rm विकल्प का उपयोग नहीं कर सकता है।
एक कंटेनर में एक वॉल्यूम असाइन करें
डॉकर वॉल्यूम एक फ़ाइल या निर्देशिका है जो कंटेनर के जीवनकाल से परे बनी रहती है। एक होस्ट फ़ाइल या निर्देशिका को एक कंटेनर में एक वॉल्यूम के रूप में माउंट करना संभव है (यूनियनएफएस को दरकिनार)।
-v
कमांड लाइन विकल्प के साथ एक वॉल्यूम जोड़ें:
docker run -d -v "/data" awesome/app bootstrap.sh
यह एक वॉल्यूम बनाएगा और कंटेनर के अंदर पथ /data
माउंट करेगा।
- ध्यान दें: आप ध्वज का उपयोग कर सकते
--rm
स्वचालित रूप से मात्रा को हटाने के लिए जब कंटेनर हटा दिया है।
बढ़ते मेजबान निर्देशिका
एक कंटेनर में एक मेजबान फ़ाइल या निर्देशिका माउंट करने के लिए:
docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
- होस्ट निर्देशिका को निर्दिष्ट करते समय, एक निरपेक्ष पथ की आपूर्ति की जानी चाहिए।
यह मेजबान निर्देशिका माउंट होगा /home/foo/data
पर /data
कंटेनर के अंदर। यह "बाइंड-माउंटेड होस्ट डायरेक्टरी" वॉल्यूम लिनक्स mount --bind
और इसलिए कंटेनर के जीवनकाल की अवधि के लिए निर्दिष्ट कंटेनर पथ पर अस्थायी रूप से होस्ट निर्देशिका को mount --bind
। होस्ट या कंटेनर से वॉल्यूम में परिवर्तन तुरंत दूसरे में परिलक्षित होता है, क्योंकि वे डिस्क पर एक ही गंतव्य हैं।
UNIX उदाहरण एक रिश्तेदार फ़ोल्डर बढ़ते
docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh
नामकरण खंड
होस्ट निर्देशिका पथ के बजाय स्ट्रिंग की आपूर्ति करके एक वॉल्यूम का नाम दिया जा सकता है, डॉकटर उस नाम का उपयोग करके एक वॉल्यूम बनाएगा।
docker run -d -v "my-volume:/data" awesome/app bootstrap.sh
एक नामित वॉल्यूम बनाने के बाद, वॉल्यूम को उस नाम का उपयोग करके अन्य कंटेनरों के साथ साझा किया जा सकता है।
पर्यावरण चर सेट करना
$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash
दोनों -e
और --env
का उपयोग कंटेनर के अंदर पर्यावरण चर को परिभाषित करने के लिए किया जा सकता है। पाठ फ़ाइल का उपयोग करके कई पर्यावरण चर की आपूर्ति करना संभव है:
$ docker run --env-file ./env.list ubuntu /bin/bash
उदाहरण पर्यावरण चर फ़ाइल:
# This is a comment
TEST_HOST=10.10.0.127
--env-file
ध्वज एक फ़ाइलनाम को तर्क के रूप में लेता है और प्रत्येक पंक्ति को VARIABLE=VALUE
प्रारूप में होने की अपेक्षा करता है, जो तर्क --env
को --env
गए तर्क की नकल करता है। टिप्पणी लाइनों को केवल #
साथ उपसर्ग करने की आवश्यकता है।
इन तीनों झंडों के आदेश के बावजूद, --env-file
को पहले संसाधित किया जाता है, और फिर -e
/ --env
झंडे को। इस तरह, किसी भी पर्यावरण चर को -e
या --env
साथ व्यक्तिगत रूप से आपूर्ति की गई - the --env-var
पाठ फ़ाइल में दिए गए चर को ओवरराइड करेगा।
होस्टनाम निर्दिष्ट करना
डिफ़ॉल्ट रूप से, डॉक रन के साथ बनाए गए कंटेनरों को एक यादृच्छिक होस्टनाम दिया जाता है। आप कंटेनर को एक अलग होस्टनाम दे सकते हैं --होस्टेन फ्लैग पास करके:
docker run --hostname redbox -d ubuntu:14.04
अंतःक्रियात्मक रूप से एक कंटेनर चलाएँ
एक कंटेनर को अंतःक्रियात्मक रूप से चलाने के लिए, in -it
विकल्प पास करें:
$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#
-i
खुले stdin रहता है, जबकि -t
आबंटित करता है एक छद्म TTY।
मेमोरी / स्वैप सीमा के साथ कंटेनर चलाना
मेमोरी सीमा सेट करें और स्वैप सीमा को अक्षम करें
docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
मेमोरी और स्वैप सीमा दोनों को सेट करें। इस मामले में, कंटेनर 300M मेमोरी और 700M स्वैप का उपयोग कर सकता है।
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
एक चल (अलग) कंटेनर में एक खोल प्राप्त करना
एक रनिंग कंटेनर में लॉग इन करें
एक उपयोगकर्ता exec
कमांड के साथ एक नए इंटरैक्टिव बैश शेल में एक रनिंग कंटेनर दर्ज कर सकता है।
एक कंटेनर को jovial_morse
कहा जाता है, तब आप एक इंटरैक्टिव, छद्म-TTY बैश शेल को चलाकर प्राप्त कर सकते हैं:
docker exec -it jovial_morse bash
एक विशिष्ट उपयोगकर्ता के साथ एक चल रहे कंटेनर में प्रवेश करें
यदि आप एक विशिष्ट उपयोगकर्ता के रूप में एक कंटेनर दर्ज करना चाहते हैं, तो आप इसे -u
या --user
पैरामीटर के साथ सेट कर सकते हैं। उपयोगकर्ता नाम कंटेनर में मौजूद होना चाहिए।
-u, --user
उपयोगकर्ता नाम या UID (प्रारूप:<name|uid>[:<group|gid>]
)<name|uid>[:<group|gid>]
यह कमांड dockeruser
उपयोगकर्ता के साथ jovial_morse
में लॉग इन करेगा
docker exec -it -u dockeruser jovial_morse bash
रूट के रूप में एक कंटेनर में प्रवेश करें
यदि आप रूट के रूप में लॉग इन करना चाहते हैं, तो बस -u root
पैरामीटर का उपयोग करें। रूट उपयोगकर्ता हमेशा मौजूद रहता है।
docker exec -it -u root jovial_morse bash
एक छवि में प्रवेश करें
आप run
कमांड के साथ एक छवि में भी प्रवेश कर सकते हैं, लेकिन इसके लिए कंटेनर नाम के बजाय एक छवि नाम की आवश्यकता होती है।
docker run -it dockerimage bash
एक मध्यवर्ती छवि में प्रवेश करें (डिबग)
आप एक मध्यवर्ती छवि के रूप में अच्छी तरह से लॉग इन कर सकते हैं, जो एक डॉकरफाइल बिल्ड के दौरान बनाई गई है।
docker build .
$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
---> Running in 9c9e81692ae9
total 24
drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin
drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev
drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib
lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib
dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc
lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin
dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys
drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr
---> b35f4035db3f
Step 3 : CMD echo Hello world
---> Running in 02071fceb21b
---> f52f38b7823e
ध्यान दें ---> Running in 02071fceb21b
आउटपुट ---> Running in 02071fceb21b
, आप इन चित्रों में लॉग इन कर सकते हैं:
docker run -it 02071fceb21b bash
कंटेनर को स्टिंग पास करना
ऐसे मामलों में जैसे कि डेटाबेस डंप को बहाल करना, या अन्यथा होस्ट से पाइप के माध्यम से कुछ जानकारी को धक्का देना चाहते हैं, तो आप -i
फ्लैग का उपयोग docker run
या docker exec
तर्क के रूप में कर सकते हैं।
उदाहरण के लिए, यह सोचते हैं आप एक स्थानीय में आप मेजबान पर है, एक डेटाबेस डंप एक कंटेनरीकृत MariaDB ग्राहक के लिए रखना चाहते हैं dump.sql
फ़ाइल, आप निम्न आदेश कर सकते हैं:
docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql
सामान्य रूप में,
docker exec -i container command < file.stdin
या
docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF
एक कंटेनर से कोचिंग
जबकि एक चलित कंटेनर से जुड़ा हुआ है जिसमें एक पीटी असाइन किया गया है ( docker run -it ...
), आप Control P - Control Q को अलग करने के लिए दबा सकते हैं।
ओवरराइडिंग इमेज एंट्रीपॉइंट निर्देश
docker run --name="test-app" --entrypoint="/bin/bash" example-app
जब कंटेनर test-app
बनाया जाता है, तो यह कमांड example-app
छवि के ENTRYPOINT
निर्देश को ओवरराइड करेगा। छवि का CMD
निर्देश अपरिवर्तित रहेगा, जब तक कि अन्यथा निर्दिष्ट न हो:
docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh
उपरोक्त उदाहरण में, ENTRYPOINT
और छवि के CMD
दोनों को ओवरराइड किया गया है। यह कंटेनर प्रक्रिया बन जाती है /bin/bash /app/test.sh
।
कंटेनर में होस्ट प्रविष्टि जोड़ें
docker run --add-host="app-backend:10.15.1.24" awesome-app
यह कमांड कंटेनर /etc/hosts
फ़ाइल में एक प्रविष्टि जोड़ता है, जो प्रारूप --add-host <name>:<address>
अनुसरण करता है। इस उदाहरण में, app-backend
का नाम 10.15.1.24
। यह विशेष रूप से प्रोग्राम घटकों को एक साथ प्रोग्राम में बांधने के लिए विशेष रूप से उपयोगी है।
जब आदेश नहीं चल रहे हों तो कंटेनर को रोकना बंद करें
यदि कोई कमांड अग्रभूमि पर नहीं चल रही है तो एक कंटेनर बंद हो जाएगा। -t
विकल्प का उपयोग करते हुए कंटेनर को -d
विकल्प के साथ अलग होने पर भी रोक दिया जाएगा।
docker run -t -d debian bash
एक कंटेनर रोक रहा है
docker stop mynginx
इसके अतिरिक्त, कंटेनर आईडी का उपयोग उसके नाम के बजाय कंटेनर को रोकने के लिए भी किया जा सकता है।
यदि आवश्यक हो तो SIGTERM सिग्नल और फिर SIGKILL सिग्नल भेजकर यह एक चालू कंटेनर को रोक देगा।
इसके अलावा, किल कमांड का उपयोग तुरंत SIGKILL या किसी अन्य निर्दिष्ट सिग्नल को भेजने के लिए -s
विकल्प का उपयोग करके किया जा सकता है।
docker kill mynginx
निर्दिष्ट संकेत:
docker kill -s SIGINT mynginx
एक कंटेनर रोकना इसे हटाता नहीं है। अपने बंद कंटेनर को देखने के लिए docker ps -a
का उपयोग करें।
चल रहे कंटेनर पर एक और कमांड निष्पादित करें
जरूरत पड़ने पर आप एक पहले से ही चल रहा है कंटेनर का उपयोग कर के बारे में अतिरिक्त आदेश पर अमल करने के लिए डोकर बता सकते हैं exec
आदेश। आपको कंटेनर की आईडी की आवश्यकता है जिसे आप docker ps
साथ प्राप्त कर सकते हैं।
docker exec 294fbc4c24b3 echo "Hello World"
यदि आप -it
विकल्प का उपयोग करते हैं तो आप एक इंटरैक्टिव शेल संलग्न कर सकते हैं।
docker exec -it 294fbc4c24b3 bash
लिनक्स कंटेनर में GUI ऐप्स चलाना
डिफ़ॉल्ट रूप से, एक डॉकर कंटेनर GUI एप्लिकेशन को चलाने में सक्षम नहीं होगा।
इससे पहले, X11 सॉकेट को पहले कंटेनर में भेजा जाना चाहिए, इसलिए इसे सीधे उपयोग किया जा सकता है। DISPLAY पर्यावरण चर को भी आगे भेजा जाना चाहिए:
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>
यह पहले विफल हो जाएगा, क्योंकि हमने X सर्वर होस्ट के लिए अनुमतियाँ सेट नहीं की हैं:
cannot connect to X server unix:0
सबसे तेज़ (लेकिन सबसे सुरक्षित नहीं) तरीका सीधे पहुंच की अनुमति देना है:
xhost +local:root
कंटेनर के साथ खत्म होने के बाद, हम मूल स्थिति में वापस जा सकते हैं:
xhost -local:root
एक और (सुरक्षित) तरीका यह है कि एक डॉकरफाइल तैयार किया जाए जो एक नई छवि का निर्माण करेगा जो एक्स सर्वर तक पहुंचने के लिए हमारे उपयोगकर्ता क्रेडेंशियल्स का उपयोग करेगा:
FROM <iamge-name>
MAINTAINER <you>
# Arguments picked from the command line!
ARG user
ARG uid
ARG gid
#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod --uid ${uid} $USERNAME && \
groupmod --gid ${gid} $USERNAME
USER ${user}
WORKDIR /home/${user}
कमांड लाइन से docker build
करते समय, हमें एआरजी वैरिएबल्स को पास करना होगा जो डॉकफाइल में दिखाई देते हैं:
docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .
अब, एक नया कंटेनर पैदा करने से पहले, हमें एक्सेस अनुमति के साथ एक xauth फ़ाइल बनानी होगी:
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -
इसे बनाते / चलाते समय इस फाइल को कंटेनर में रखा जाना चाहिए:
docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth