در قسمت قبلی با مفاهیم اولیهی داکر آشنا شدیم و در این قسمت بیشتر به مباحث عملی آن خواهیم پرداخت. ضمن اینکه طریقهی نصب داکر نیز بسیار سادهاست و برای مطالعهی بیشتر به
سایت مرجع آن مراجعه بفرمایید (برای ویندوز، مک و لینوکس قسمتهای مجزایی تعبیه شده و نصب آن آموزش داده شدهاست).
در قسمت قبلی با Volume آشنا شدیم؛ اکنون قصد داریم آن را اجرایی نموده و برنامهی خود را بر روی آن اجرا نماییم. عملا با استفاده از Volume، قابلیت این را خواهید داشت که از Container ایجاد شده، با استفاده از volume، اشارهگری را به source code خود بر روی ماشین محلی داشته باشید و کد خود را بر روی آن اجرا نمایید.
مزایای استفاده از Volume
Volumeها بر روی Containerهای ویندوزی و لینوکسی اجرا میشوند.
قابلیت اشتراک گذاری volume بین containerهای مختلف وجود دارد.
Volumeها persisted هستند و حتی بعد از حذف container پایدار باقی میمانند و قابلیت استفادهی مجدد را خواهند داشت.
ما طبق شکل فوق، میتوانیم درون یک container، یک volume داشته باشیم و وقتی چیزی را درون آن مینویسیم، عملا داریم در قسمت خاصی به نام Docker Host عمل write کردن را انجام میدهیم که باعث میشود داکر متوجه آن شود. وقتی اسمی را به یک Volume انتساب میدهیم همانند /var/www، در واقع یک اسم مستعار (alias) میباشد که اشاره میکند به این Docker host موجود.
میخواهیم در این قسمت یک اپلیکیشن Nodejsِی را با استفاده از Volume بر روی Docker Container اجرا نماییم.
ابتدا دستور زیر را وارد کرده تا آخرین نسخهی تصویر Nodejs را بر روی سیستم خود دریافت نمایید:
بعد از دریافت آن از طریق دستور زیر، لیست Imageهای cache شده بر روی سیستم خود را میتوانید ببینید:
حال باید چنین چیزی را بر روی ترمینال خود مشاهده کنید:
در ادامه نیاز داریم یک دایرکتوری را ایجاد کرده و فایل index.js را درون آن بسازیم:
mkdir testapp
cd testapp
touch index.js
npm init
npm i express --save
یک دایرکتوری را ساختیم و همچنین express را نیز نصب نمودیم.
اکنون package.json را باز کرده و این قسمت را جایگزین کنید؛ تا با استفاده از npm start، برنامه اجرا شود:
"scripts": {
"start": "node index"
}
index.js را باز کرده و کدهای زیر را وارد کنید:
const express = require('express')
const app = express()
const PORT = 3000;
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen(PORT, function () {
console.log(`listening on port ${PORT}!`)
})
همه چیز خیلی ساده در نظر گرفته شده است. از فریمورک express استفاده کردیم و یک سرور را بر روی پورت 3000 اجرا کرده و همچنین بر روی آدرس "/" یک سطر کد Hello World اجرا میشود.
خوب، فرض کنید قصد داریم با استفاده از volume، کد فوق را بر روی container اجرا کنیم.
برای اجرا شدن این کدها بر روی Volume، دستور زیر را درون ترمینال خود وارد کنید:
docker run -d -p 3030:3000 -v $(pwd):/var/www -w "/var/www" node npm start
شرح دستور فوق:
دستور ساخت container با استفاده از ارگومان run
d- برای اجرا شدن container در حالت detached، باعث میشود اجرا شدن آن در حالت بکگراند بوده و بتوانید بر روی ترمینال مربوطه، دستورات دیگری را وارد نمایید.
p- پورت داخلی و خارجی را مشخص میکند. در اینجا پورت داخلی، 3000 و خارجی، 3030 میباشد.
آرگومان v- برای ساخت volume و (pwd)$ دایرکتوری جاری را بر روی سیستم شما، نشان خواهد داد. بعد از آن /var/www یک دایرکتوری فرضی است (هر آدرس دلخواهی را میتوانیم داشته باشیم) که قرار است بوسیلهیdocker ساخته شود و از آن اشارهگری به دایرکتوری جاری بر روی ماشین محلی زده شود.
w- همان WorkingDirectory میباشد. بدلیل اینکه میخواهیم بر روی container به دایرکتوری که کدهای ما وجود دارد، وارد شود.
بعد از آن اسم image ای را که قرار است از آن استفاده شود، آورده تا container ایجاد شود.
و بعد از npm start برنامه را اجرا خواهد کرد.
پس از اجرا کردن دستور فوق، container ایجاد میشود و قابلیت اجرایی دارد (با استفاده از ip و port خارجی بر روی browser میتوانیم برنامه را مشاهده کنیم).
حال با استفاده از دستور زیر لیست containerهای اجرایی را مشاهده خواهیم کرد:
میبینید که container، اجرا شده و پورت آن مشخص شدهاست. تصویر و کلید هش شدهی منحصر به فرد آن را نیز مشاهده میفرمایید.
حتی میتوانید به راحتی درون container را با استفاده از دستور زیر مشاهده کنید:
docker exec -it 6003 bash
6003 ابتدای کلید container ایجاد شدهاست و با استفاده از bash وارد محیط command line در container ایجاد شده خواهیم شد و دسترسی کاملی خواهیم داشت.
بطور مثال برای دیدن کدهای index.js بر روی container ایجاد شده، بعد از دستور فوق، command زیر را وارد نمایید:
جالب است بدانید از آنجائیکه container از طریق volume به دایرکتوری محلی شما لینک شدهاست، به محض اینکه بر روی سیستم خود کدی را تغییر داده و دوباره دستور فوق را اجرا کنید، تغییرات را مشاهده خواهید کرد.
برای متوقف کردن container از دستور زیر باید استفاده کرد:
نکته: 6003 آی دی container است و برای اجرای مجدد آن docker start 6003
بعد از متوقف کردن container و اجرای دستور docker ps متوجه خواهید شد که دیگر Container در لیست containerهای باز نیست.
با استفاده از دستور زیر به لیست تمامی Containerها چه در حال اجرا و چه متوقف شده، دسترسی خواهیم داشت:
برای حذف container نیز از دستور زیر استفاده میکنیم:
rm برای حذف container و همچنین v- برای حذف volume میباشد.