डॉकर 1.13 कंपोज़-फाइल सपोर्ट नामक एक लंबे समय से प्रतीक्षित सुविधा का परिचय देता है, जो हमें अपने कंटेनरों को एक लंबी कमांड के बजाय एक अच्छी सरल कॉन्फ़िगरेशन फ़ाइल के साथ परिभाषित करने की अनुमति देता है। यदि आप हमारे पिछले “MySQL on Docker” ब्लॉग पोस्ट पर एक नज़र डालते हैं, तो हमने कंटेनरों और सेवाओं को चलाने के लिए कई लंबी कमांड लाइनों का उपयोग किया है। कंपोज़-फाइल का उपयोग करके, कंटेनरों को आसानी से परिनियोजन के लिए निर्दिष्ट किया जाता है। यह मानवीय त्रुटि के जोखिम को कम करता है क्योंकि आपको कई मापदंडों के साथ लंबे कमांड को याद रखने की आवश्यकता नहीं होती है।
इस ब्लॉग पोस्ट में, हम आपको दिखाएंगे कि MySQL परिनियोजन के आसपास सरल उदाहरणों का उपयोग करके कंपोज़-फ़ाइल का उपयोग कैसे करें। हम मानते हैं कि आपके पास 3 भौतिक मेजबानों पर डॉकर इंजन 1.13 स्थापित है और झुंड मोड सभी मेजबानों पर कॉन्फ़िगर किया गया है।
कंपोज़-फ़ाइल का परिचय
कंपोज़-फाइल में, आप YAML प्रारूप में सब कुछ निर्दिष्ट करते हैं, न कि उन सभी तर्कों को याद रखने की कोशिश करने के लिए जिन्हें हमें डॉकर कमांड को पास करना है। आप यहां सेवाओं, नेटवर्क और वॉल्यूम को परिभाषित कर सकते हैं। परिभाषा को डॉकर द्वारा उठाया जाएगा और यह "डॉकर रन|नेटवर्क|वॉल्यूम" कमांड को कमांड-लाइन पैरामीटर पास करने जैसा है।
एक परिचय के रूप में, हम एक साधारण स्टैंडअलोन MySQL कंटेनर को तैनात करने जा रहे हैं। कंपोज़ फ़ाइल लिखना शुरू करने से पहले, आपको सबसे पहले रन कमांड को जानना होगा। डॉकर ब्लॉग श्रृंखला पर हमारे पहले MySQL से लिया गया, आइए निम्नलिखित "डॉकर रन" कमांड लिखें:
$ docker run --detach \
--name=test-mysql \
--publish 6603:3306 \
--env="MYSQL_ROOT_PASSWORD=mypassword" \
-v /storage/docker/mysql-datadir:/var/lib/mysql \
mysql
डॉकर-कंपोज़ कमांड वर्तमान निर्देशिका में "docker-compose.yml" नामक एक डिफ़ॉल्ट फ़ाइल की तलाश करेगा। तो, आइए पहले आवश्यक निर्देशिकाएं पहले से बनाएं:
$ mkdir -p ~/compose-files/mysql/single
$ mkdir -p /storage/docker/mysql-datadir
$ cd ~/compose-files/mysql/single
YAML में, यहाँ लिखा जाना चाहिए:
version: '2'
services:
mysql:
image: mysql
container_name: test-mysql
ports:
- 6603:3306
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
volumes:
- /storage/docker/mysql-datadir:/var/lib/mysql
उपरोक्त सामग्री को "~/compose-files/mysql/single/docker-compose.yml" में सहेजें। सुनिश्चित करें कि आप वर्तमान निर्देशिका ~/compose-files/mysql/single में हैं, फिर निम्न आदेश चलाकर इसे सक्रिय करें:
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating test-mysql
सत्यापित करें कि कंटेनर अलग मोड में चल रहा है या नहीं:
[[email protected] single]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
379d5c15ef44 mysql "docker-entrypoint..." 8 minutes ago Up 8 minutes 0.0.0.0:6603->3306/tcp test-mysql
बधाई हो! अब हमारे पास एक MySQL कंटेनर है जो केवल एक कमांड के साथ चल रहा है।
एक स्टैक परिनियोजित करना
कंपोज़-फाइल चीजों को सरल बनाती है, यह हमें एक स्पष्ट दृष्टिकोण प्रदान करती है कि बुनियादी ढांचा कैसा दिखना चाहिए। आइए एक कंटेनर स्टैक बनाएं जिसमें एक समर्पित नेटवर्क के तहत एक MySQL इंस्टेंस का उपयोग करके ड्रूपल पर चलने वाली वेबसाइट शामिल है और उन्हें एक साथ लिंक करें।
ऊपर के समान, आइए इस स्टैक को बनाने के लिए कमांड लाइन संस्करण को सही क्रम में देखें:
$ docker volume create mysql_data
$ docker network create drupal_mysql_net --driver=bridge
$ docker run -d --name=mysql-drupal --restart=always -v mysql_data:/var/lib/mysql --net=drupal_mysql_net -e MYSQL_ROOT_PASSWORD="mypassword" -e MYSQL_DATABASE="drupal" mysql
$ docker run -d --name=drupal -p 8080:80 --restart=always -v /var/www/html/modules -v /var/www/html/profiles -v /var/www/html/themes -v /var/www/html/sites --link mysql:mysql --net=drupal_mysql_net drupal
रचना शुरू करने के लिए, आइए पहले अपने नए स्टैक के लिए एक निर्देशिका बनाएं:
$ mkdir -p ~/compose-files/drupal-mysql
$ cd ~/compose-files/drupal-mysql
फिर, नीचे दिए अनुसार docker-compose.yml की लिखित सामग्री बनाएं:
version: '2'
services:
mysql:
image: mysql
container_name: mysql-drupal
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
MYSQL_DATABASE: "drupal"
volumes:
- mysql_data:/var/lib/mysql
restart: always
networks:
- drupal_mysql_net
drupal:
depends_on:
- mysql
image: drupal
container_name: drupal
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
links:
- mysql:mysql
restart: always
networks:
- drupal_mysql_net
volumes:
mysql_data:
networks:
drupal_mysql_net:
driver: bridge
उन्हें आग लगा दो:
$ docker-compose up -d
..
Creating network "drupalmysql_drupal_mysql_net" with driver "bridge"
Creating volume "drupalmysql_mysql_data" with default driver
Pulling drupal (drupal:latest)...
..
Creating mysql-drupal
Creating drupal
डॉकर निम्नानुसार परिनियोजन करेगा:
- नेटवर्क बनाएं
- वॉल्यूम बनाएं
- चित्र खींचो
- mysql-drupal बनाएं (क्योंकि कंटेनर "ड्रूपल" इस पर निर्भर है)
- ड्रूपल कंटेनर बनाएं
इस बिंदु पर, हमारी वास्तुकला को इस प्रकार दर्शाया जा सकता है:
फिर हम स्थापना विज़ार्ड पृष्ठ में MySQL होस्ट के रूप में 'mysql' निर्दिष्ट कर सकते हैं क्योंकि दोनों कंटेनर एक साथ जुड़े हुए हैं। इतना ही। उन्हें फाड़ने के लिए, बस उसी निर्देशिका के अंतर्गत निम्न आदेश चलाएँ:
$ docker-compose down
संबंधित कंटेनरों को समाप्त कर दिया जाएगा और तदनुसार हटा दिया जाएगा। ध्यान दें कि docker-compose कमांड व्यक्तिगत भौतिक होस्ट को Docker चलाने के लिए बाध्य है। झुंड में कई भौतिक मेजबानों पर चलने के लिए, इसे "डॉकर स्टैक" कमांड का उपयोग करके अलग तरह से व्यवहार करने की आवश्यकता है। हम इसे अगले भाग में समझाएंगे।
डॉकर पर कईनाईन माइएसक्यूएल:अपने डेटाबेस को कंटेनरीकृत कैसे करेंडॉकर कंटेनर वर्चुअलाइजेशन के शीर्ष पर एक MySQL सेवा चलाने पर विचार करते समय आपको जो कुछ समझने की आवश्यकता है उसे खोजें। श्वेत पत्र डाउनलोड करेंझुंड में ढेर की रचना करना
सबसे पहले, सुनिश्चित करें कि डॉकर इंजन v1.13 पर चल रहा है और स्वार्म मोड सक्षम और तैयार स्थिति में है:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8n8t3r4fvm8u01yhli9522xi9 * docker1.local Ready Active Reachable
o1dfbbnmhn1qayjry32bpl2by docker2.local Ready Active Reachable
tng5r9ax0ve855pih1110amv8 docker3.local Ready Active Leader
डॉकर झुंड मोड के लिए स्टैक सुविधा का उपयोग करने के लिए, हमें डॉकर कंपोज़ संस्करण 3 प्रारूप का उपयोग करना होगा। हम MySQL बैकएंड के रूप में 3-नोड गैलेरा सेटअप के अलावा, उपरोक्त के समान एक सेटअप को तैनात करने जा रहे हैं। हमने इस ब्लॉग पोस्ट में पहले ही विवरण में समझाया है।
सबसे पहले, हमारे नए स्टैक के लिए एक निर्देशिका बनाएं:
$ mkdir -p ~/compose-files/drupal-galera
$ cd ~/compose-files/drupal-galera
फिर निम्नलिखित पंक्तियों को “docker-compose.yml” में जोड़ें:
version: '3'
services:
galera:
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 3
window: 60s
update_config:
parallelism: 1
delay: 10s
max_failure_ratio: 0.3
image: severalnines/pxc56
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
CLUSTER_NAME: "my_galera"
XTRABACKUP_PASSWORD: "mypassword"
DISCOVERY_SERVICE: '192.168.55.111:2379,192.168.55.112:2379,192.168.55.207:2379'
MYSQL_DATABASE: 'drupal'
networks:
- galera_net
drupal:
depends_on:
- galera
deploy:
replicas: 1
image: drupal
ports:
- 8080:80
volumes:
- drupal_modules:/var/www/html/modules
- drupal_profile:/var/www/html/profiles
- drupal_theme:/var/www/html/themes
- drupal_sites:/var/www/html/sites
networks:
- galera_net
volumes:
drupal_modules:
drupal_profile:
drupal_theme:
drupal_sites:
networks:
galera_net:
driver: overlay
ध्यान दें कि हमारे द्वारा उपयोग की जाने वाली गैलेरा छवि (कई / पीएक्ससी 56) के लिए प्रत्येक डॉकर भौतिक होस्ट पर एक रनिंग वगैरह क्लस्टर स्थापित करने की आवश्यकता होती है। कृपया इस ब्लॉग पोस्ट को आवश्यक चरणों पर देखें।
हमारी कंपोज़-फ़ाइल का एक महत्वपूर्ण भाग पुनरारंभ_पॉलिसी अनुभाग के अंतर्गत max_attempts पैरामीटर है। विफलता के मामले में हमें पुनरारंभ की संख्या पर एक कठिन सीमा निर्दिष्ट करनी होगी। यह परिनियोजन प्रक्रिया को सुरक्षित बना देगा, क्योंकि डिफ़ॉल्ट रूप से, झुंड अनुसूचक कंटेनरों को पुनरारंभ करने के प्रयास में कभी हार नहीं मानेगा। यदि ऐसा होता है, तो प्रोसेस लूप भौतिक होस्ट के डिस्क स्थान को अनुपयोगी कंटेनरों से भर देगा जब शेड्यूलर कंटेनरों को वांछित स्थिति में नहीं ला सकता है। MySQL जैसी स्टेटफुल सेवाओं को हैंडल करते समय यह एक सामान्य तरीका है। उन्हें असंगत स्थिति में चलाने के बजाय उन्हें पूरी तरह से नीचे लाना बेहतर है।
उन सभी को शुरू करने के लिए, बस उसी निर्देशिका में निम्न आदेश निष्पादित करें जहां docker-compose.yml रहता है:
$ docker stack deploy --compose-file=docker-compose.yml my_drupal
सत्यापित करें कि स्टैक 2 सेवाओं (ड्रूपल और गैलेरा) के साथ बनाया गया है:
$ docker stack ls
NAME SERVICES
my_drupal 2
हम बनाए गए स्टैक में वर्तमान कार्यों को भी सूचीबद्ध कर सकते हैं। परिणाम "docker service ps my_drupal_galera" और "docker service ps my_drupal_drupal" कमांड का एक संयुक्त संस्करण है:
$ docker stack ps my_drupal
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
609jj9ji6rxt my_drupal_galera.1 severalnines/pxc56:latest docker3.local Running Running 7 minutes ago
z8mcqzf29lbq my_drupal_drupal.1 drupal:latest docker1.local Running Running 24 minutes ago
skblp9mfbbzi my_drupal_galera.2 severalnines/pxc56:latest docker1.local Running Running 10 minutes ago
cidn9kb0d62u my_drupal_galera.3 severalnines/pxc56:latest docker2.local Running Running 7 minutes ago
एक बार जब हम रनिंग के रूप में करंट स्टेट प्राप्त कर लेते हैं, तो हम पोर्ट 8080 पर किसी भी डॉकर होस्ट आईपी एड्रेस या होस्टनाम से जुड़कर ड्रुपल इंस्टॉलेशन शुरू कर सकते हैं, क्योंकि इस मामले में हमने डॉक 3 का इस्तेमाल किया था (यद्यपि ड्रुपल कंटेनर डॉकटर 1 पर तैनात है), http ://192.168.55.113:8080/। स्थापना के साथ आगे बढ़ें और 'गैलेरा' को MySQL होस्ट और 'ड्रूपल' को डेटाबेस नाम के रूप में निर्दिष्ट करें (जैसा कि MYSQL_DATABASE पर्यावरण चर के तहत कंपोज़-फाइल में परिभाषित किया गया है):
इतना ही। कंपोज़-फाइल का उपयोग करके स्टैक परिनियोजन को सरल बनाया गया था। इस समय, हमारी वास्तुकला कुछ इस तरह दिख रही है:
अंत में, स्टैक को हटाने के लिए, बस निम्न कमांड चलाएँ:
$ docker stack rm my_drupal
Removing service my_drupal_galera
Removing service my_drupal_drupal
Removing network my_drupal_galera_net
कंपोज़-फाइल का उपयोग करने से आपका समय बच सकता है और लंबी कमांड लाइनों के साथ काम करने की तुलना में मानवीय त्रुटि के जोखिम को कम किया जा सकता है। मल्टी-कंटेनर डॉकर एप्लिकेशन के साथ काम करने से पहले मास्टर करने के लिए यह एक आदर्श टूल है, कई परिनियोजन वातावरण (जैसे देव, परीक्षण, स्टेजिंग, प्री-प्रोड, प्रोड) से निपटने और MySQL गैलेरा क्लस्टर की तरह बहुत अधिक जटिल सेवाओं को संभालने से पहले। हैप्पी कंटेनराइज़िंग
!