1. بررسی اجمالی
Docker یک پلت فرم باز برای توسعه، حمل و نقل و اجرای برنامه ها است. با داکر، می توانید برنامه های خود را از زیرساخت خود جدا کنید و با زیرساخت خود مانند یک برنامه مدیریت شده رفتار کنید. Docker به شما کمک میکند کد را سریعتر ارسال کنید، سریعتر تست کنید، سریعتر استقرار کنید، و چرخه بین نوشتن کد و اجرای کد را کوتاه کنید.
Docker این کار را با ترکیب ویژگیهای کانتینریسازی هسته با گردش کار و ابزارهایی انجام میدهد که به شما در مدیریت و استقرار برنامههای کاربردی خود کمک میکند.
کانتینرهای Docker را می توان مستقیماً در Kubernetes استفاده کرد که به آنها اجازه می دهد تا به راحتی در موتور Kubernetes اجرا شوند. پس از یادگیری ملزومات Docker، مهارت لازم برای شروع توسعه Kubernetes و برنامه های کاربردی کانتینری را خواهید داشت.
چیزی که یاد خواهید گرفت
در این آزمایشگاه با نحوه انجام کارهای زیر آشنا می شوید:
- یک Dockerfile برای یک برنامه نمونه ایجاد کنید
- یک تصویر بسازید
- تصویر را به صورت یک ظرف محلی اجرا کنید
- تغییر رفتار ظرف
- تصویر را به Artifact Registry فشار دهید
پیش نیازها
این یک آزمایشگاه سطح مقدماتی است. هیچ تجربه قبلی با Docker و کانتینرها در نظر گرفته نشده است. آشنایی با Cloud Shell و خط فرمان پیشنهاد می شود، اما الزامی نیست.
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود و می توانید هر زمان که بخواهید آن را به روز کنید.
- شناسه پروژه باید در تمام پروژههای Google Cloud منحصربهفرد باشد و تغییرناپذیر باشد (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (و معمولاً به عنوان
PROJECT_ID
شناخته میشود)، بنابراین اگر آن را دوست ندارید، یک نمونه تصادفی دیگر ایجاد کنید، یا میتوانید شناسه پروژه را امتحان کنید و ببینید در دسترس است. سپس پس از ایجاد پروژه "یخ زده" می شود. - یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع 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 برای یک برنامه نمونه ایجاد کرد
- یک تصویر ساخت
- تصویر را به صورت یک ظرف به صورت محلی اجرا کنید
- تغییر رفتار ظرف
- تصویر را به آرتیفکت رجیستری فشار داد