توسعه کانتینرها با Dockerfiles

1. بررسی اجمالی

Docker یک پلت فرم باز برای توسعه، حمل و نقل و اجرای برنامه ها است. با داکر، می توانید برنامه های خود را از زیرساخت خود جدا کنید و با زیرساخت خود مانند یک برنامه مدیریت شده رفتار کنید. Docker به شما کمک می‌کند کد را سریع‌تر ارسال کنید، سریع‌تر تست کنید، سریع‌تر استقرار کنید، و چرخه بین نوشتن کد و اجرای کد را کوتاه کنید.

Docker این کار را با ترکیب ویژگی‌های کانتینری‌سازی هسته با گردش کار و ابزارهایی انجام می‌دهد که به شما در مدیریت و استقرار برنامه‌های کاربردی خود کمک می‌کند.

کانتینرهای Docker را می توان مستقیماً در Kubernetes استفاده کرد که به آنها اجازه می دهد تا به راحتی در موتور Kubernetes اجرا شوند. پس از یادگیری ملزومات Docker، مهارت لازم برای شروع توسعه Kubernetes و برنامه های کاربردی کانتینری را خواهید داشت.

چیزی که یاد خواهید گرفت

در این آزمایشگاه با نحوه انجام کارهای زیر آشنا می شوید:

  • یک Dockerfile برای یک برنامه نمونه ایجاد کنید
  • یک تصویر بسازید
  • تصویر را به صورت یک ظرف محلی اجرا کنید
  • تغییر رفتار ظرف
  • تصویر را به Artifact Registry فشار دهید

پیش نیازها

این یک آزمایشگاه سطح مقدماتی است. هیچ تجربه قبلی با Docker و کانتینرها در نظر گرفته نشده است. آشنایی با Cloud Shell و خط فرمان پیشنهاد می شود، اما الزامی نیست.

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود و می توانید هر زمان که بخواهید آن را به روز کنید.
  • شناسه پروژه باید در تمام پروژه‌های Google Cloud منحصربه‌فرد باشد و تغییرناپذیر باشد (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (و معمولاً به عنوان PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک نمونه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه پروژه را امتحان کنید و ببینید در دسترس است. سپس پس از ایجاد پروژه "یخ زده" می شود.
  • یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها، باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، دستورالعمل‌های «پاک‌سازی» را که در انتهای Codelab یافت می‌شود دنبال کنید. کاربران جدید 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 روی Preview کلیک کنید

وقتی کارتان تمام شد

  • CTRL + c را در Cloud Shell فشار دهید تا برنامه در حال اجرا متوقف شود

3. Dockerfile

کانتینر کردن برنامه با یک Dockerfile

یکی از روش‌های بسته‌بندی برنامه در یک ظرف، استفاده از Dockerfile است. Dockerfile شبیه یک اسکریپت است که به دیمون دستور می دهد چگونه تصویر ظرف را جمع آوری کند. برای اطلاعات بیشتر به مستندات مرجع Dockerfile ) مراجعه کنید.

یک Dockerfile خالی در مخزن نمونه برنامه ایجاد کنید.

touch ${HOME}/sample-app/Dockerfile

Dockerfile را در ویرایشگر انتخابی خود باز کنید.

vi ${HOME}/sample-app/Dockerfile

یک تصویر شروع را انتخاب کنید

استفاده از روش Dockerfile برای ساخت کانتینر نیازمند دانش مستقیم در مورد برنامه کاربردی برای مونتاژ کانتینر است. اولین قدم برای ایجاد یک Dockerfile، انتخاب تصویری است که به عنوان مبنای تصویر شما استفاده می‌شود. این تصویر باید یک تصویر والد یا پایه باشد که توسط یک منبع قابل اعتماد، معمولاً شرکت شما، نگهداری و منتشر می‌شود.

دستورالعمل FROM یک مرحله ساخت جدید را مقداردهی اولیه می کند و تصویر پایه را برای دستورات متوالی بعدی تنظیم می کند. بنابراین دستور FROM معمولاً اولین دستورالعمل در یک Dockerfile است و فقط می‌تواند قبل از آن یک دستورالعمل اختیاری ARG برای پشتیبانی از متغیرها باشد.

نحو: FROM <image>[:<tag> | @<digest>] [AS <name>]

فرمت یک تصویر <image>:<tag> یا <image>@<digest> است. اگر یک تگ یا خلاصه مشخص نشده باشد، به طور پیش فرض روی برچسب :latest قرار می گیرد. قالب <image> بر اساس رجیستری مورد استفاده برای ذخیره تصویر متفاوت است. برای رجیستری مصنوع، فرمت <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 دنبال می شود تنظیم می کند. برای اطلاعات بیشتر به بخش WORKDIR از مستندات مرجع Dockerfile مراجعه کنید

نحو: WORKDIR <path>

برای این آزمایشگاه ما از دایرکتوری /app به عنوان WORKDIR خود استفاده می کنیم، خط زیر را به پایین Dockerfile خود اضافه کنید.

WORKDIR /app

فایل های برنامه را کپی کنید

دستورالعمل COPY دایرکتوری ها یا فایل ها را از محل <source> به مسیر <destination> سیستم فایل تصویر کپی می کند. منابع <source> متعددی را می توان مشخص کرد و همه آنها با زمینه ساخت مرتبط هستند. زمینه ساخت بیشتر در بخش ساخت مورد بحث قرار خواهد گرفت. برای اطلاعات بیشتر به بخش COPY از مستندات مرجع Dockerfile مراجعه کنید

نحو: COPY <source>... <destination>

برای این آزمایشگاه ما تمام فایل های موجود در مخزن را در سیستم فایل تصویر کپی می کنیم، خط زیر را به پایین Dockerfile خود اضافه می کنیم.

COPY . /app

برنامه را کامپایل کنید

دستور RUN دستورات را در یک لایه تصویر جدید در بالای تصویر فعلی اجرا می کند و نتایج را انجام می دهد. تصویر متعهد حاصل برای مراحل متوالی در Dockerfile استفاده خواهد شد. برای اطلاعات بیشتر به بخش RUN از مستندات مرجع Dockerfile مراجعه کنید

نحو: RUN <command>

برای این آزمایشگاه از Maven برای کامپایل برنامه به یک فایل JAR استفاده می کنیم، خط زیر را به پایین Dockerfile خود اضافه کنید.

RUN ./mvnw compile assembly:single

برنامه را شروع کنید

دستور CMD دستور پیش فرض را برای یک کانتینر در حال اجرا ارائه می دهد. فقط یک دستور CMD در Dockerfile می تواند وجود داشته باشد، اگر بیش از یک CMD مشخص شده باشد، تنها آخرین CMD اعمال می شود. عملکردهای پیشرفته تری با استفاده از دستورالعمل های CMD و ENTRYPOINT در دسترس است، اما در این آزمایشگاه پوشش داده نمی شود. برای اطلاعات بیشتر به بخش CMD' از مستندات مرجع Dockerfile مراجعه کنید

نحو: CMD ["executable","param1","param2"]

برای این آزمایشگاه ما فایل JAR را که کامپایل کرده ایم اجرا می کنیم، خط زیر را به پایین Dockerfile خود اضافه کنید.

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

فایل نهایی Docker

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 run مطابق انتظار عمل می کند. این دستور ظرف ما را در پیش زمینه خط فرمان ما برای آزمایش یا اشکال زدایی راه اندازی می کند. برای اطلاعات بیشتر به مستندات مرجع اجرای 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 روی Preview کلیک کنید
  • CTRL + c را در Cloud Shell فشار دهید تا کانتینرها متوقف شوند

تغییر رفتار ظرف

اجرای 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 روی Preview کلیک کنید
  • به برگه Cloud Shell بروید و آن گزارش اضافی را مشاهده کنید
  • CTRL + c را در Cloud Shell فشار دهید تا ظرف متوقف شود

پورت را تغییر دهید

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 را وارد کنید
  • روی Change and Preview کلیک کنید
  • CTRL + c را در Cloud Shell فشار دهید تا ظرف متوقف شود

6. فشار دهید

وقتی مطمئن شدیم که تصویر کانتینر به درستی اجرا می‌شود و می‌خواهیم این کانتینر را برای اجرا در محیط‌های دیگر و/یا سایر کاربران در دسترس قرار دهیم، باید تصویر را به یک مخزن مشترک فشار دهیم. این باید به عنوان بخشی از یک خط لوله ساخت خودکار اتفاق بیفتد، اما در محیط آزمایشی ما قبلاً یک مخزن پیکربندی شده است و می‌توانیم به صورت دستی تصویر خود را فشار دهیم.

commit Dockerfile را به مخزن نمونه برنامه فشار دهید

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

تصویر را برای ثبت آرتیفکت تگ کنید

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

اعتبارنامه خود را برای رجیستری مصنوع پیکربندی کنید

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 برای یک برنامه نمونه ایجاد کرد
  • یک تصویر ساخت
  • تصویر را به صورت یک ظرف به صورت محلی اجرا کنید
  • تغییر رفتار ظرف
  • تصویر را به آرتیفکت رجیستری فشار داد