इंटरनेट से कई निर्देश एक निश्चित न्यूनतम क्रियाओं का वर्णन करते हैं, और परिणामस्वरूप, न्यूनतम आदेश और अवसर।
मैंने एक छोटे से जलाया सुविधाओं, सुविधाओं का चयन करने का फैसला किया। लेख अद्वितीय होने का दावा नहीं करता है, यह मुझे एक अनुस्मारक के रूप में मदद करेगा, और शायद यह कुछ पाडवों को डॉकटर-कम्पोज के साथ अपनी यात्रा शुरू करने में मदद करेगा।
एकाधिक docker-compose.yml फ़ाइलों का उपयोग करना
जटिल कॉन्फ़िगरेशन हैं, जहां कंटेनरों की एक निश्चित मूल परत होती है, जो कहते हैं, हमेशा आवश्यक होती है। और आमतौर पर ऐसा होता है कि हम पड़ोसी टीम से एक और प्रोजेक्ट \ इंटरनेट लेते हैं और इसे अपनी आवश्यकताओं के लिए पूरा करते हैं। लेकिन अगर कई कमांड हैं, तो मूल भाग को एक आम, आंतरिक भंडार में ले जाया जा सकता है। और हमें अधिकांश परियोजनाओं के लिए एक समान आधार भाग मिलता है, जो कि संस्करण भी है।
आइए एक बेसिक डॉकटर-कंपोज़-बेस.आईएमएल के उदाहरण का वर्णन करें।
मान लीजिए कि यह सर्टिफिकेट्स, ट्यूनिंग और कहे गए मेट्रिक्स के साथ एक कस्टमाइज्ड नगनेक्स इमेज है। और प्रोमेथियस के लिए निर्यातक:
version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter
अब हम अपने डॉकटर-कम्पोज-ऐप.इम्ल एप्लिकेशन के एक उदाहरण का वर्णन करते हैं:
version: '2' services: backend: image: internal.local/super-app:0.1.2
शुरू करने के लिए, हमें एक अंतर के साथ सामान्य टीम की आवश्यकता है। हम 2 डॉकटर-कंपोजिट फाइलों को इंगित करेंगे:
docker-compose up -d -f docker-compose-base.yml -f docker-compose-app.yml
और वोइला, हमें सेवाओं का एक सेट मिलता है, जैसे कि उन्हें एक ही डॉकटर-कम्पोज़ फ़ाइल में वर्णित किया गया हो!
फैली हुई निर्देश के उपयोग के माध्यम से कई फ़ाइलों का उपयोग करने के लिए एक दूसरा विकल्प भी है।
डोकर-लिखें-base.yml:
version: '2' services: nginx: image: nginx nginx-exporter: image: nginx/nginx-prometheus-exporter
डोकर-लिखें-app.yml:
version: '2' services: backend: image: internal.local/super-app:0.1.2 ### web: extends: # ( ) file: docker-compose-base.yml # service: nginx web-exporter: extends: file: docker-compose-base.yml service: nginx-exporter
ISlava से जोड़ें :
आप पर्यावरण चर में सभी रचना फ़ाइलों का वर्णन कर सकते हैं, और मैन्युअल रूप से निर्दिष्ट फ़ाइलों के बिना डॉक-कम्पोज़ अप -d का उपयोग कर सकते हैं:
COMPOSE_PATH_SEPARATOR=: COMPOSE_FILE=docker-compose-base.yml:docker-compose-app.yml
कौन सा विकल्प चुनना है - आप चुनते हैं। सभी व्यक्तिगत रूप से, मैं सिर्फ विकल्प दिखाना चाहता था =)
डॉकटर-रचना में निहित
निम्न उदाहरण के लिए संस्करण docker- रचना > = 2.4 की आवश्यकता है
इसके अलावा काफी दिलचस्प विशेषता है, और वास्तव में कुछ उल्लेख किया गया है।
यह कार्यक्षमता हमें डॉकटर-कम्पोज़ फ़ाइल में एक ही प्रकार की कई सेवाओं का वर्णन करने की अनुमति देती है, बिना उनके विवरण की नकल के, अर्थात्, विरासत में मिली।
उदाहरण के लिए, हमारे पास एक फाइल है:
version: '2.4' services: backend: image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro
और कई कंटेनरों को बढ़ाने की आवश्यकता थी, लेकिन कुछ मतभेदों के साथ, हम निश्चित रूप से "बचाओ" और बदल सकते हैं, लेकिन हम यह कर सकते हैं:
version: '2.4' services: backend: &base-app # image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend-2: <<: *base-app # ports: # - 8081:8080
इस प्रकार, हमें प्रत्येक कंटेनर के विवरण में संपादन की तुलना में, एक जगह बदलने का अवसर मिलता है।
उदाहरण के लिए, रूट क्षेत्र में जाने का एक और विकल्प है:
version: '2.4' services: x-backend: # "x-" , . &base-app image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro backend: <<: *base-app # backend-2: <<: *base-app # ports: # - 8081:8080
संसाधन की सीमा
संस्करण 2.2 से शुरू, आप कंटेनर के लिए संसाधन सीमा का उपयोग कर सकते हैं, वास्तव में, संस्करण 2.1 से, लेकिन अभी भी सभी वितरित नहीं हैं))
एक अति सूक्ष्म अंतर है! संस्करण 3 में, इन सुविधाओं को हटा दिया जाता है! डॉकटर झुंड पर पहले से ही जोर है।
CPU संसाधन सीमा, MEM का सबसे सरल उदाहरण:
version: '2.2' services: backend: cpus: 1.5 # . cpuset: '0,3' # . mem_limit: 1gb # 1 memswap_limit: 2gb # SWAP . oom_kill_disable: true # , OOM Killer , . image: internal.local/super-app:0.1.2 ports: - 8080:8080 - 9090:9090 volumes: - ./conf/some.conf:/etc/app/some.conf:ro
एक संग्रह में चित्र पैकिंग
दुर्भाग्य से, छवियों को अपने या क्लाउड डूकर रजिस्ट्री में धकेलना हमेशा संभव नहीं होता है। कभी-कभी डॉकटर-कंपोज़ फ़ाइल से चित्र एकत्र करने और भेजने, कहने, फ़ाइल संग्रह करने की आवश्यकता होती है। हाथ कभी-कभी लंबे समय तक करते हैं, इसलिए मैंने एक साधारण स्क्रिप्ट को स्केच किया, अचानक कोई काम आता है:
#!/bin/bash dc=${1} if [ ! -z ${dc} ] && [ -f ${dc} ]; then echo "Saving docker images from file ${dc}..." images=`grep image: ${dc} | awk '{print $2}'` docker save ${images} | gzip > docker-images.gz echo "Success!" else echo "ERROR! You must set path to docker-compose.yml as argument!" fi
फ़ाइल को सहेजें docker-compose-images-save.sh कहते हैं
हम निष्पादित करने का अधिकार देते हैं:
chmod +x docker-compose-images-save.sh
हम इसे शुरू करते हैं और एक तर्क के रूप में डॉकटर-कम्पोज़ फ़ाइल के लिए रास्ता पास करते हैं:
./docker-compose-images-save.sh /home/some_user/docker-compose-app.yml
आउटपुट में, हम उस फ़ोल्डर में पहुंचते हैं जहां से चित्रों के साथ स्क्रिप्ट संग्रह को बुलाया गया था - docker-images.gz
किसी भी तरह से हम रिमोट सर्वर पर भेज सकते हैं।
अब दूरस्थ सर्वर पर इसे निष्पादित करने के लिए पर्याप्त है:
gzip -cd docker-images.gz | docker load
सभी छवियों को स्थानीय रजिस्ट्री पर अपलोड किया जाएगा, जिसके बाद आप सुरक्षित रूप से यहां चल सकते हैं
docker-compose up -d
, चूंकि सभी छवियां इंटरनेट पर स्थानीय रजिस्ट्री में हैं, इसलिए docker इसमें नहीं जाएगी।
आगे IPv6
कुछ कार्यों में, ipv6 अत्यंत उपयोगी हो सकता है, कम से कम बारीकियों को लें कि Roskomnadzor समस्याओं के बिना ipv6 के माध्यम से सभी ट्रैफ़िक पास करता है, और वही टेलीग्राम बॉट समस्याओं के बिना काम करता है।
मैं ऐसी स्थिति पर विचार करूंगा जहां आईपीवी 6 आपकी मशीन पर नहीं है, चाहे वह वर्चुअल मशीन हो, या इंटरनेट पर सर्वर हो।
सुनिश्चित करें कि सिस्टम स्तर ipv6 सक्षम है:
sysctl net.ipv6.conf.all.disable_ipv6
मान 0 होना चाहिए, यदि नहीं, तो बदलें:
sysctl -w net.ipv6.conf.all.disable_ipv6=0
Miredo स्थापित करें (यह एक अंतर्निहित वीपीएन के साथ एक सेवा है जो हमें सार्वजनिक आईपीवी 6 देगी)
apt-get install miredo -y
जांचें कि सेवा चल रही है:
systemctl status miredo
हम सत्यापित करते हैं कि हमें ipv6 पता प्राप्त हुआ:
ifconfig teredo
हम /etc/docker/daemon.json में लिखते हैं
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
कर्ता को पुनः आरंभ करें:
systemctl restart docker
खैर, यह IPv6 के लिए NAT को सक्षम करने के लिए बनी हुई है ताकि हमारे कंटेनर के आंतरिक पते हमारे teredo इंटरफ़ेस के माध्यम से बाहरी दुनिया तक पहुंच सकें:
ip6tables -t nat -A POSTROUTING -o teredo -j MASQUERADE
हम अपने लिए आवश्यक डॉकटर कंटेनर उठाते हैं, और इसे ipv6 पते के माध्यम से प्रकाशित किया जा सकता है।
Sysctl और iptables के साथ उपरोक्त उदाहरण रिबूट तक काम करेगा, यदि आपको इसे निरंतर आधार पर करने की आवश्यकता है, तो आपको अपने वितरण के निर्देशों को देखना चाहिए, मतभेद हैं।
मुझे आशा है कि किसी ने जानकारी यहाँ प्रदान की उपयोगी होगी।