برنامه نویسی

چگونه برنامه وب خود را کانتینری کنید – یک آموزش مبتدی برای Dockerfile

به قسمت 2 سریال خوش آمدید Docker for Dummies در این وبلاگ قصد داریم تصویری از یک برنامه وب کوچک ایجاد کنیم و در مورد کارهایی که هر مرحله انجام می دهد یاد بگیریم. بدون هیچ مقدمه ای بیایید شروع کنیم. برای این وبلاگ، من قصد دارم از یک برنامه مسابقه ساده vue-app استفاده کنم که به شما امکان می دهد نام کتاب را بر اساس خط اول حدس بزنید. اگر می‌خواهید تنظیمات را دنبال کنید، می‌توانید پیوند GitHub به برنامه وب را در اینجا پیدا کنید یا می‌توانید از برنامه خود استفاده کنید یا می‌توانید یک برنامه ساده ایجاد کنید. hello-world برنامه در گره یا فریمورک/زبان انتخابی شما.

بیایید تصویر را ایجاد کنیم

توجه: این آموزش از دستورات اوبونتو پیروی می کند اما باید برای سایر سیستم عامل ها نیز مشابه باشد

بیایید برنامه را کلون کنیم و به داخل آن برویم

git clone https://github.com/SwikritiT/Guessthebook-blog
cd Guessthebook-blog

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

touch Dockerfile
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dockerfile

Dockerfile یک اسکریپت است که شامل تمام مراحل لازم برای ساخت یک تصویر است. Dockerfile با چیزی به نام شروع می شود base image. آ base image یک محیط از پیش پیکربندی شده است که تصاویر ما بر روی آن ساخته می شوند. تصویر پایه می تواند یک سیستم عامل مانند لینوکس، آلپاین یا پشته برنامه باشد. انتخاب یک تصویر پایه مناسب برای اندازه کلی و بهره وری تصویر برنامه ما بسیار مهم است. در قسمت بعدی این مجموعه بیشتر در مورد نحوه انتخاب تصویر پایه مناسب صحبت خواهیم کرد، بنابراین در حال حاضر به خاطر داشته باشید که یک تصویر پایه سبک تر، یک تصویر برنامه سبک تر ایجاد می کند (این با محدودیت هایی همراه است که در مورد آن صحبت خواهیم کرد. جزئیات بیشتر در قسمت بعدی این مجموعه). بنابراین، برای این برنامه، ما می خواهیم استفاده کنیم node:alpine images به عنوان پایه، می توانید نسخه مورد نیاز خود از یک تصویر پایه را از یک رجیستری تصویر مانند Docker Hub انتخاب کنید.

توجه: اگر تصویر برنامه گره را نمی سازید، باید تصویر مناسب برای پشته خود را انتخاب کنید

# Start with a base image
FROM node:alpine
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

FROM: تصویر پایه مورد استفاده را مشخص می کند. هر Dockerfile با این دستورالعمل شروع می شود.

مرحله بعدی تنظیم WORKDIR به عنوان مثال دایرکتوری کار برای کانتینر ما که در آن دستورات اجرا می شوند و فایل ها به طور پیش فرض ذخیره می شوند. به طور معمول، برای برنامه های وب، Workdir روی تنظیم شده است /usr/src/app اما شما می توانید آن را بر اساس نیاز خود سفارشی کنید.

# Set the working directory
WORKDIR /usr/src/app
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید فایل های پیکربندی لازم را در کانتینر خود کپی کنیم، در مورد ما، package.json و lockfile. برای این کار استفاده خواهیم کرد COPY فرمان

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

COPY or ADD: فایل ها را از سیستم فایل محلی شما در ظرف کپی می کند.

گام بعدی این است که وابستگی ها را دقیقاً مانند آنچه در دستگاه میزبان خود انجام می دهیم و برای این کار نصب می کنیم RUN می توان از دستور استفاده کرد

# Install the application dependencies
RUN npm install
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

RUN: دستورات را در کانتینر اجرا می کند. این دستورات معمولاً برای نصب بسته های نرم افزاری استفاده می شوند.

حالا بقیه فایل ها را در پوشه کاری کانتینر خود کپی می کنیم

# Copy the current directory contents into the container at /usr/src/app
COPY . .
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دستور بالا هر فایل و پوشه ای را که در برنامه شما وجود دارد در پوشه کاری کانتینر کپی می کند. این شامل فایل ساخت، فایل‌های ایجاد شده توسط IDE یا سایر فایل‌ها/پوشه‌های متفرقه است که ممکن است برای ساخت تصویر ضروری نباشد. بنابراین، این یک تمرین خوب است که یا فقط فایل های ضروری را کپی کنید یا یک فایل ایجاد کنید .dockerignore فایل با لیستی از فایل‌ها و پوشه‌هایی که نمی‌خواهید در داخل ظرف کپی شوند. نحو از .dockerignore فایل مشابه فایل .gitignore. اینجا بیشتر بیاموزید

قدم بعدی ساخت اپلیکیشن ماست

# Build the application
RUN npm run build
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله بعدی این است که Expose درگاه هایی که یک برنامه کانتینری به اتصالات شبکه گوش می دهد

# Make port 3000 available to the world outside the container
EXPOSE 3000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

EXPOSE روشی برای مستندسازی است که برنامه در حال اجرا در داخل کانتینر از کدام پورت ها استفاده خواهد کرد. این پورت را به پورت های ماشین میزبان نگاشت نمی کند. این به سادگی نشان می دهد که کدام پورت ها قابل دسترسی هستند.

ما به مرحله نهایی رسیده ایم که در آن برنامه را اجرا می کنیم. دو دستور وجود دارد که می توانیم برای این کار از آنها استفاده کنیم CMD و ENTRYPOINT برای این قسمت استفاده خواهیم کرد CMD و در مورد آن صحبت خواهیم کرد ENTRYPOINT در قسمت های بعدی

از آنجایی که ما برنامه را در production env اجرا خواهیم کرد، از آن استفاده خواهیم کرد preview دستور برای این بعداً یک برنامه توسعه‌دهنده dockerized نیز ایجاد خواهیم کرد.

# Define the command to run the app
CMD ["npm","run","preview"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

CMD: دستوری را ارائه می دهد که هنگام شروع یک کانتینر از تصویر اجرا می شود. فقط یک دستور CMD می تواند در Dockerfile وجود داشته باشد.

حالا بیایید به کل نگاه کنیم Dockerfile

# Start with a base image
FROM node:alpine

# Set the working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install the application dependencies
RUN npm install

# Copy the current directory contents into the container at /usr/src/app
COPY . .

# Build the application
RUN npm run build

# Make port 3000 available to the world outside the container
EXPOSE 3000

# Define the command to run the app
CMD ["npm","run","preview"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در Docker، هر خط در Dockerfile شما یک لایه جدید در تصویر نهایی ایجاد می کند، مانند افزودن مواد به یک ساندویچ. این لایه ها روی هم قرار می گیرند و هر لایه نشان دهنده یک تغییر یا اضافه است، مانند کپی کردن فایل ها یا نصب نرم افزار. Docker این لایه‌ها را ذخیره می‌کند و اگر تصویر خود را دوباره بسازید و برخی از لایه‌ها تغییر نکرده باشند، Docker از آنها دوباره استفاده می‌کند و روند ساخت را سرعت می‌بخشد و افزونگی را کاهش می‌دهد. بنابراین در فایل docker بالا 8 لایه داریم.

تصویر را بسازید

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

$ docker build . -t guessthebook:v1

[+] Building 1.1s (11/11) FINISHED                               docker:default
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 191B                                       0.0s
 => [internal] load metadata for docker.io/library/node:20-alpine          0.9s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 129B                                          0.0s
 => [1/6] FROM docker.io/library/node:20-alpine@sha256:66c7d989b6dabba6b4  0.0s
 => [internal] load build context                                          0.0s
 => => transferring context: 1.41kB                                        0.0s
 => CACHED [2/6] WORKDIR /usr/src/app                                      0.0s
 => CACHED [3/6] COPY package*.json ./                                     0.0s
 => CACHED [4/6] RUN npm install                                           0.0s
 => CACHED [5/6] COPY . .                                                  0.0s
 => CACHED [6/6] RUN npm run build                                         0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:08f32d7f583b7e65a844accafff8fc19930849204c5ae  0.0s
 => => naming to docker.io/library/guessthebook:v1                         0.0s

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با اطلاعات مربوط به هر لایه ساخته شده، خروجی مشابهی را دریافت خواهید کرد. دستور docker build . -t guessthebook:v1 Dockerfile را در دایرکتوری فعلی می خواند، یک تصویر Docker مطابق دستورالعمل آن می سازد و این تصویر را به عنوان برچسب گذاری می کند. guessthebook با نسخه v1.

حال اگر دستور زیر را در ترمینال خود اجرا کنید، باید اطلاعات مربوطه را در مورد تصویری که ایجاد کرده ایم مشاهده کنید

docker images

REPOSITORY                                   TAG            IMAGE ID       CREATED         SIZE
guessthebook                                 v1             08f32d7f583b   5 minutes ago   275MB
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجرای یک داکر کانتینر

هنگامی که تصویر را ساختید، می توانید آن را با docker run دستور:

docker run -p 3000:3000 guessthebook:v1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این دستور یک کانتینر را اجرا می کند guessthebook:v1 تصویر، پورت نقشه برداری 3000 از کانتینر به بندر 3000 در دستگاه میزبان ما استفاده می کنیم -p برای نقشه برداری پورت

برای استفاده از گزینه می توانیم دستور بالا را بداهه کنیم -d برای اجرای آن در حالت جدا

 docker run  -d -p 3000:3000 guessthebook:v1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از اجرای کانتینر داکر می توانید مراجعه کنید http://localhost:3000 برای اطمینان از اینکه همه چیز خوب کار می کند اگر همه چیز درست است و درست کار می کند، باید با این صفحه خوشامدگویی کنید

اکنون می‌توانید استراحت کنید و مسابقه را انجام دهید تا ببینید چه تعداد درست شده‌اید.

ظرف را متوقف کنید

با دستور زیر می توانید کانتینر را متوقف کنید

docker stop id> # can run `docker ps` to get the name and id
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تصویر را در داکر هاب منتشر کنید

اگر بخواهیم یک قدم جلوتر برویم، می‌توانیم تصویر را در داکر هاب منتشر کنیم. برای این کار، اگر قبلاً این کار را نکرده اید، یک حساب کاربری در Docker Hub ایجاد کنید. در مرحله بعد، می توانید یک مخزن جدید ایجاد کنید.

داکر هاب ایجاد صفحه مخزن

  1. از طریق docker CLI به داکر هاب خود وارد شوید
docker login
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. تصویر محلی خود را برای مطابقت با تصویر مخزن تگ کنید
# docker tag local-image:tagname new-repo:tagname
docker tag guessthebook:v1 /guessthebook
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. تصویر را فشار دهید
# docker push new-repo:tagname
docker push /guessthebook
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، می‌توانید بروید و بررسی کنید که آیا هاب داکر شما تصویری را دارد که اخیراً فشار داده‌اید.

برای آزمایش تصویر، اکنون می توانید تصویر را با کشیدن مستقیم از آن اجرا کنید Docker Hub

# let's remove the locally tagged image first
docker rmi /guessthebook

# run the container
docker run -p 3000:3000 /guessthebook
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این برای این وبلاگ است. امیدوارم از این یکی لذت برده باشید و همچنین چیز جدیدی یاد گرفته باشید! شما را در قسمت بعدی این مجموعه می بینیم. اگر سؤال یا پیشنهادی دارید، لطفاً آنها را در زیر نظر دهید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا