Dockerफ़ाइलों के साथ कंटेनर बनाना

1. खास जानकारी

Docker, ऐप्लिकेशन डेवलप करने, भेजने, और उन्हें चलाने के लिए एक ओपन प्लैटफ़ॉर्म है. Docker की मदद से, अपने ऐप्लिकेशन और इन्फ़्रास्ट्रक्चर को अलग किया जा सकता है. साथ ही, अपने इन्फ़्रास्ट्रक्चर को मैनेज किए जा रहे ऐप्लिकेशन की तरह इस्तेमाल किया जा सकता है. Docker आपको तेज़ी से कोड शिप करने, तेज़ी से टेस्ट करने, तेज़ी से डिप्लॉय करने, और कोड लिखने और कोड चलाने के बीच के साइकल को कम करने में मदद करता है.

Docker यह काम, कर्नेल कंटेनराइज़ेशन की सुविधाओं को वर्कफ़्लो और टूल के साथ जोड़कर करता है. इससे आपको अपने ऐप्लिकेशन मैनेज और डिप्लॉय करने में मदद मिलती है.

Docker कंटेनर का इस्तेमाल, Kubernetes में सीधे तौर पर किया जा सकता है. इससे उन्हें Kubernetes Engine में आसानी से चलाया जा सकता है. Docker की ज़रूरी सुविधाओं के बारे में जानने के बाद, आपके पास Kubernetes और कंटेनर वाले ऐप्लिकेशन डेवलप करने का तरीका जानने का मौका होगा.

आप इन चीज़ों के बारे में जानेंगे

इस लैब में, आपको इन कामों को करने का तरीका पता चलेगा:

  • सैंपल ऐप्लिकेशन के लिए Dockerfile बनाएं
  • इमेज बनाएं
  • इमेज को कंटेनर के तौर पर स्थानीय तौर पर चलाएं
  • कंटेनर का व्यवहार बदलें
  • इमेज को Artifact Registry में भेजें

ज़रूरी शर्तें

यह एक शुरुआती लेवल का लैब है. Docker और कंटेनर को इस्तेमाल करने का अनुभव न के बराबर माना जाता है. इसके लिए, Cloud Shell और कमांड लाइन इस्तेमाल करने का सुझाव दिया जाता है. हालांकि, यह ज़रूरी नहीं है.

अपने हिसाब से एनवायरमेंट सेटअप करें

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. साथ ही, आप इसे किसी भी समय अपडेट कर सकते हैं.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना पड़ता है और आम तौर पर इसकी पहचान PROJECT_ID के रूप में की जाती है. इसलिए, अगर आपको यह पसंद नहीं आता है, तो कोई भी कोड जनरेट करें. इसके अलावा, खुद का भी कोड बनाकर देखा जा सकता है कि वह उपलब्ध है या नहीं. फिर यह "फ़्रोज़न" होता है प्रोजेक्ट बनने के बाद.
  • तीसरी वैल्यू, प्रोजेक्ट नंबर है, जिसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा किसी अन्य प्लैटफ़ॉर्म पर बिलिंग न करने के लिए, संसाधनों को बंद करने के लिए, "साफ़-सफ़ाई" का पालन करें कोडलैब के आखिर में दिए गए निर्देश देखें. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

2. नमूना एप्लिकेशन

इस लैब को बेहतर बनाने के लिए, सैंपल के तौर पर आवेदन दिया गया है. इस सेक्शन में, आपको सोर्स कोड को फिर से हासिल करके, ऐप्लिकेशन को उसके नेटिव फ़ॉर्म में बनाना होगा. इसके बाद, कंटेनर बनाने की प्रोसेस शुरू की जाएगी.

स्रोत कोड

इस लैब का सोर्स कोड, ऐप्लिकेशन के सैंपल दस्तावेज़ के साथ-साथ GoogleCloudPlatform/container-developer-workshop रिपॉज़िटरी में उपलब्ध है.

git को कॉन्फ़िगर करें

git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net

सैंपल ऐप्लिकेशन Cloud Source Repository का क्लोन बनाएं

gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main

आउटपुट

Cloning into '/home/student_03_49720296e995/sample-app'...
remote: Finding sources: 100% (16/16)
remote: Total 16 (delta 0), reused 16 (delta 0)
Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done.
warning: remote HEAD refers to nonexistent ref, unable to checkout.

Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app].
Branch 'main' set up to track remote branch 'main' from 'origin'.
Switched to a new branch 'main'

सैंपल ऐप्लिकेशन बनाएं

cd ${HOME}/sample-app
./mvnw compile

आउटपुट

[INFO] Scanning for projects...
...
[INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.080 s
[INFO] Finished at: 2022-02-23T17:14:30Z
[INFO] ------------------------------------------------------------------------

नमूना ऐप्लिकेशन चलाएं

cd ${HOME}/sample-app
./mvnw exec:java

आउटपुट

[INFO] Scanning for projects...
...
Listening at http://localhost:8080

चल रहे ऐप्लिकेशन का पूर्वावलोकन करें

  • Cloud Shell Web Preview बटन पर क्लिक करें
  • पोर्ट 8080 पर 'झलक देखें' पर क्लिक करें

काम पूरा होने पर,

  • ऐप्लिकेशन को चलने से रोकने के लिए, Cloud Shell में CTRL + c दबाएं

3. Dockerfile

ऐप्लिकेशन को Dockerfile के साथ कंटेनर बनाना

ऐप्लिकेशन को कंटेनर में पैक करने का एक तरीका है, Dockerfile का इस्तेमाल करना. Dockerfile एक स्क्रिप्ट की तरह है, जो डीमन को कंटेनर इमेज को इकट्ठा करने के तरीके के बारे में निर्देश देती है. ज़्यादा जानकारी के लिए, Dockerfile के रेफ़रंस दस्तावेज़) देखें.

ऐप्लिकेशन रिपॉज़िटरी के सैंपल में एक खाली Dockerfile बनाएं.

touch ${HOME}/sample-app/Dockerfile

अपनी पसंद के एडिटर में Dockerfile खोलें.

vi ${HOME}/sample-app/Dockerfile

शुरुआती इमेज चुनें

कंटेनर बनाने के लिए Dockerfile तरीके का इस्तेमाल करने के लिए, कंटेनर को असेंबल करने के लिए ऐप्लिकेशन के बारे में सटीक जानकारी होना ज़रूरी है. Dockerfile बनाने का पहला चरण है, ऐसी इमेज चुनना जिसका इस्तेमाल आपकी इमेज के आधार के तौर पर किया जाएगा. इस इमेज की पैरंट या बेस इमेज होनी चाहिए. इसे किसी भरोसेमंद सोर्स, आम तौर पर आपकी कंपनी, जिसकी ओर से मैनेज किया जाता है और पब्लिश किया जाता है.

FROM निर्देश, बिल्ड के नए चरण को शुरू करता है और क्रम में चलने वाले निर्देशों के लिए, बेस इमेज सेट करता है. इसलिए, आम तौर पर Dockerfile में FROM निर्देश पहला निर्देश होता है. वैरिएबल को सपोर्ट करने के लिए, इससे पहले सिर्फ़ वैकल्पिक ARG निर्देश दिया जा सकता है.

सिंटैक्स: FROM <image>[:<tag> | @<digest>] [AS <name>]

इमेज का फ़ॉर्मैट <image>:<tag> या <image>@<digest> है. अगर किसी टैग या डाइजेस्ट की जानकारी नहीं दी गई है, तो डिफ़ॉल्ट तौर पर :latest टैग दिखता है. <image> का फ़ॉर्मैट, इमेज को सेव करने वाली रजिस्ट्री के हिसाब से अलग-अलग होता है. Artifact Registry के लिए, <image> का फ़ॉर्मैट <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag> है.

इस लैब के लिए, हम सार्वजनिक openjdk:11.0-jdk इमेज का इस्तेमाल करते हैं. इसलिए, अपनी Dockerfile में यह लाइन जोड़ें

FROM openjdk:11.0-jdk

काम करने वाली डायरेक्ट्री सेट करें

WORKDIR निर्देश, Dockerfile में दिए गए सभी निर्देशों के लिए, काम करने वाली डायरेक्ट्री सेट करता है. ज़्यादा जानकारी के लिए Dockerfile रेफ़रंस दस्तावेज़ का WorkDIR सेक्शन देखें

सिंटैक्स: WORKDIR <path>

इस लैब के लिए, हम /app डायरेक्ट्री को अपनी WORKDIR के तौर पर इस्तेमाल करते हैं. साथ ही, Dockerfile के सबसे नीचे दी गई लाइन को जोड़ें

WORKDIR /app

ऐप्लिकेशन की फ़ाइलों को कॉपी करें

COPY निर्देश, <source> जगह से इमेज फ़ाइल सिस्टम के <destination> पाथ में डायरेक्ट्री या फ़ाइलें कॉपी करता है. एक से ज़्यादा <source> रिसॉर्स के बारे में बताया जा सकता है और वे सभी बिल्ड कॉन्टेक्स्ट से मिलते-जुलते हैं. बिल्ड सेक्शन में इसके बारे में आगे चर्चा की जाएगी. ज़्यादा जानकारी के लिए, Dockerfile रेफ़रंस दस्तावेज़ का कॉपी सेक्शन देखें

सिंटैक्स: COPY <source>... <destination>

इस लैब के लिए, हम रिपॉज़िटरी की सभी फ़ाइलों को इमेज फ़ाइल सिस्टम में कॉपी कर देंगे. इसके बाद, अपने Dockerfile के निचले हिस्से में नीचे दी गई लाइन जोड़ें

COPY . /app

ऐप्लिकेशन को कंपाइल करें

RUN निर्देश, मौजूदा इमेज के ऊपर नई इमेज लेयर में निर्देशों को एक्ज़ीक्यूट करता है और नतीजे दिखाता है. नतीजे के तौर पर जनरेट की गई इमेज का इस्तेमाल, Dockerfile में क्रम से चलने वाले चरणों के लिए किया जाएगा. ज़्यादा जानकारी के लिए, Dockerfile रेफ़रंस दस्तावेज़ का RUN सेक्शन देखें

सिंटैक्स: RUN <command>

इस लैब के लिए, हम ऐप्लिकेशन को एक JAR फ़ाइल में इकट्ठा करने के लिए Maven का इस्तेमाल करेंगे. साथ ही, अपनी Dockerfile के नीचे वाली लाइन को जोड़ें

RUN ./mvnw compile assembly:single

आवेदन करें

CMD निर्देश, चल रहे कंटेनर के लिए डिफ़ॉल्ट निर्देश देता है. Dockerfile में सिर्फ़ एक सीएमडी निर्देश हो सकता है. अगर एक से ज़्यादा सीएमडी दिए गए हैं, तो सिर्फ़ आखिरी सीएमडी लागू होगा. CMD और ENTRYPOINT, दोनों निर्देशों का इस्तेमाल करके बेहतर सुविधाएं उपलब्ध हैं, लेकिन इनके बारे में इस लैब में नहीं बताया गया है. ज़्यादा जानकारी के लिए Dockerfile रेफ़रंस दस्तावेज़ का CMD` सेक्शन देखें

सिंटैक्स: CMD ["executable","param1","param2"]

इस लैब के लिए, हम इकट्ठा की गई JAR फ़ाइल चलाते हैं. इसके लिए, Dockerfile के नीचे दी गई लाइन जोड़ें

CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]

फ़ाइनल Dockerfile

आखिरी Dockerfile

FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]

Dockerfile को स्थानीय तौर पर कॉपी करें

cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"

4. बनाएं

अब हम docker build कमांड का इस्तेमाल करके, Dockerfile से इमेज बनाएंगे. यह निर्देश डॉकर डीमन को हमारे Dockerfile के निर्देशों का इस्तेमाल करके इमेज बनाने का निर्देश देता है. ज़्यादा जानकारी के लिए docker बिल्ड रेफ़रंस दस्तावेज़ देखें.

इमेज बनाएं

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .

आउटपुट

Sending build context to Docker daemon  221.2kB
Step 1/4 : FROM openjdk:11.0-jdk
11.0-jdk: Pulling from library/openjdk
0c6b8ff8c37e: Pull complete
412caad352a3: Pull complete
e6d3e61f7a50: Pull complete
461bb1d8c517: Pull complete
e442ee9d8dd9: Pull complete
542c9fe4a7ba: Pull complete
41de18d1833d: Pull complete
Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a
Status: Downloaded newer image for openjdk:11.0-jdk
---> 2924126f1829
Step 2/4 : WORKDIR /app
---> Running in ea037abb273d
Removing intermediate container ea037abb273d
---> bd9b6d078082
Step 3/4 : COPY . /app
---> b9aec2b5de51
Step 4/4 : RUN ./mvnw compile jar:jar
---> Running in 3f5ff737b7fd
[INFO] Scanning for projects...
...
[INFO] Building jar: /app/target/sample-app-1.0.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  22.952 s
[INFO] Finished at: 2022-02-23T18:09:08Z
[INFO] ------------------------------------------------------------------------
Removing intermediate container 331443caebd3
---> 152f65cc441e
Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"]
---> Running in 3d595a72231c
Removing intermediate container 3d595a72231c
---> 0e40d7548cab
Successfully built 0e40d7548cab
Successfully tagged sample-app:aaa8895

5. चलाएं

कंटेनर इमेज बनने के बाद, अब हम ऐप्लिकेशन को चला सकते हैं. साथ ही, यह पक्का कर सकते हैं कि यह Docker रन कमांड का इस्तेमाल करके उम्मीद के मुताबिक काम करे. यह कमांड, जांच या डीबग करने के लिए, हमारे कमांड प्रॉम्प्ट के फ़ोरग्राउंड में हमारा कंटेनर लॉन्च करेगा. ज़्यादा जानकारी के लिए docker रन से जुड़े रेफ़रंस दस्तावेज़ देखें.

इमेज का इस्तेमाल करके कंटेनर चलाएं

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
  --rm \
  -p 8080:8080 \
  sample-app:${IMAGE_TAG}

आउटपुट

Listening at http://localhost:8080

कंटेनर में चल रहे ऐप्लिकेशन की झलक देखें

  • Cloud Shell Web Preview बटन पर क्लिक करें
  • पोर्ट 8080 पर 'झलक देखें' पर क्लिक करें
  • कंटेनर को बंद करने के लिए, Cloud Shell में CTRL + c दबाएं

कंटेनर का व्यवहार बदलना

Docker Run चलाने के लिए, Dockerfile के डिफ़ॉल्ट कॉन्फ़िगरेशन का इस्तेमाल किया जाता है. इस व्यवहार में बदलाव करने के लिए अतिरिक्त निर्देश और पैरामीटर जोड़े जा सकते हैं.

TRACE लॉगिंग सक्षम करें

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
  --rm \
  -p 8080:8080 \
  sample-app:${IMAGE_TAG} \
  java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar

कंटेनर में चल रहे ऐप्लिकेशन की झलक देखें

  • Cloud Shell Web Preview बटन पर क्लिक करें
  • पोर्ट 8080 पर 'झलक देखें' पर क्लिक करें
  • Cloud Shell टैब पर स्विच करें और लॉग इन करने से जुड़ी अतिरिक्त जानकारी देखें
  • कंटेनर को बंद करने के लिए, Cloud Shell में CTRL + c दबाएं

पोर्ट बदलें

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}

कंटेनर में चल रहे ऐप्लिकेशन की झलक देखें

  • Cloud Shell Web Preview बटन पर क्लिक करें
  • 'पोर्ट बदलें' पर क्लिक करें
  • 8081 डालें
  • 'बदलाव करें और झलक देखें' पर क्लिक करें
  • कंटेनर को बंद करने के लिए, Cloud Shell में CTRL + c दबाएं

6. पुश

जब यह पक्का हो जाए कि कंटेनर इमेज ठीक से चल रही है और हम इस कंटेनर को दूसरे एनवायरमेंट में और/या दूसरे उपयोगकर्ताओं को चलाने के लिए उपलब्ध कराना चाहते हैं, तो हमें इमेज को शेयर किए गए डेटा स्टोर करने की जगह में पुश करना होगा. यह प्रोसेस, ऑटोमेटेड बिल्ड पाइपलाइन के हिस्से के तौर पर होती है. हालांकि, हमारे टेस्ट एनवायरमेंट में, रिपॉज़िटरी पहले से ही कॉन्फ़िगर होती है और हम अपनी इमेज को मैन्युअल तरीके से पुश कर सकते हैं.

Dockerfile के कॉपी को सैंपल-ऐप्लिकेशन रिपॉज़िटरी में पुश करें

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push

Artifact Registry के लिए इमेज टैग करना

docker tag sample-app:${IMAGE_TAG} \
    us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}

Artifact Registry के लिए, अपने क्रेडेंशियल कॉन्फ़िगर करना

gcloud auth configure-docker us-central1-docker.pkg.dev

जब कहा जाए, Do you want to continue (Y/n)? जवाब दें y और Enter दबाएं

इमेज को Artifact Registry में भेजें

docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}

आउटपुट

 The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app]
  453b97f86449: Pushed
  e86791aa0382: Pushed
  d404c7ee0850: Pushed
  fe4f44af763d: Pushed
  7c072cee6a29: Pushed
  1e5fdc3d671c: Pushed
  613ab28cf833: Pushed
  bed676ceab7a: Pushed
  6398d5cccd2c: Pushed
  0b0f2f2f5279: Pushed
  aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424

7. बधाई हो!

बधाई हो, आपने कोडलैब पूरा कर लिया है!

आपने क्या कवर किया

  • सैंपल ऐप्लिकेशन के लिए Dockerfile बनाई गई
  • इमेज बनाई गई
  • इमेज को स्थानीय तौर पर कंटेनर के तौर पर चलाया गया
  • कंटेनर का व्यवहार बदला गया
  • इमेज को Artifact Registry में भेजा गया