چگونه برنامه وب خود را کانتینری کنید – یک آموزش مبتدی برای 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 ایجاد کنید. در مرحله بعد، می توانید یک مخزن جدید ایجاد کنید.
- از طریق docker CLI به داکر هاب خود وارد شوید
docker login
- تصویر محلی خود را برای مطابقت با تصویر مخزن تگ کنید
# docker tag local-image:tagname new-repo:tagname
docker tag guessthebook:v1 /guessthebook
- تصویر را فشار دهید
# 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
این برای این وبلاگ است. امیدوارم از این یکی لذت برده باشید و همچنین چیز جدیدی یاد گرفته باشید! شما را در قسمت بعدی این مجموعه می بینیم. اگر سؤال یا پیشنهادی دارید، لطفاً آنها را در زیر نظر دهید!