راه اندازی وب سرویس nginx با داکر

راه اندازی وب سرویس nginx با داکر

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

برای اجرای این برنامه به وب سروری نیاز داریم تا درخواست های ما را از طریق PHP پردازش کرده و پاسخ را برای ما ارسال کند. برای این کار من از بین گزینه های موجود nginx را انتخاب کردم. با کمی جست و جو در داکر هاب ایمیج رسمی nginx را در نسخه های مختلف پیدا می کنیم. برای کاری که می خواهیم انجام دهیم نسخه stable-alpine مناسب است. عبارت alpine در اسم نسخه به این معنی است که ایمیج nginx روی سیستم عامل سبک alpine نصب شده. سیستم عامل alpine برای کار با کانتینر ها انتخاب مناسبی است. از آن جایی که نیاز داریم nginx را برای استفاده خودمان پیکربندی کنیم یک dockerfile جدید می سازیم.

فایلی با اسم dockerfile و بدون پسوند می سازیم و آن را با برنامه ای مثل notepad ویرایش می کنیم.

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

FROM nginx:stable-alpine

سپس باید پوشه ای که سورس کد برنامه در آن قرار می گیرد را  بسازیم. برای این کار نیاز است دستور mkdir اجرا شود. با استفاده از عبارت RUN داخل dockerfile می توانیم هر دستوری را اجرا کنیم.

RUN mkdir -p /var/www/html/public

اکنون باید nginx را پیکربندی کنیم تا مسیر سایت، نام سرور و چند ویژگی دیگر در آن مشخص شود. برای این کار از عبارت ADD استفاده می کنیم تا فایل پیکربندی را از سیستم خودمان، درون کانتینر قرار دهیم.

ADD nginx/default.conf /etc/nginx/conf.d/default.conf

 بعد از عبارت ADD، یک مسیر نسبی در سیستم خود و بعد از آن یک مسیر مطلق در کانتینر را نوشتیم. اکنون باید فایل default.conf را بنویسیم. پیکربندی زیر پیش فرض مناسبی است که بیشتر برنامه ها استفاده می کنند.

server {
 listen 80;
 index index.php index.html;
 server_name _;
 root /var/www/html/public;
 location / {
  try_files $uri $uri/ /index.php?$query_string;
 }
}

اکنون می توانیم ایمیج nginx را بسازیم. در مسیری که dockerfile قرار دارد دستور زیر را اجرا می کنیم.

docker build --no-cache -t sokan-nginx .

از گزینه t- استفاده کردیم تا به ایمیج ساخته شده تگ بزنیم و مجبور نباشیم از طریق شناسه با آن کار کنیم. همچنین از گزینه no-cache-- هم استفاده کردیم تا اگر داکر، فایلی را cache کرده باشد آن را  پاک کند و تغییر های جدید اعمال شوند.

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

docker run --rm -p 80:80 sokan-nginx

با استفاده از  گزینه rm-- داکر بعد از اجرای دستور العمل های ایمیج و پایان یافتن کار آن، container را حذف می کند. البته ایمیج nginx هرگز به صورت خودکار متوقف نمی شود و تا زمانی که با زدن کلید های ctrl +c آن را متوقف نکنیم همیشه در حال کار کردن باقی می ماند.

همچنین از گزینه p- استفاده می کنیم تا مشخص کنیم کدام پورت از سیستم ما به پورت 80 از کانتینر وصل شود. (برای پیچیده نشدن، روی سیستم خودمان هم پورت 80 را انتخاب کردیم). هنگام مقدار دادن به گزینه p-، عدد اول مربوط به سیستم ما و عدد دوم مربوط به کانتینر است.

با رفتن به مروگر و درخواست آدرس localhost:80 می توانیم از اجرای درست nginx مطمئن شویم.

در حال حاضر nginx به ما خطا نشان می دهد. علت این موضوع این است که سورس کد وب سایت ما در مسیری که مشخص کردیم قرار ندارد. 

این مشکل را با چیزی به اسم volume حل می کنیم. volume ها در داکر، فایل ها و پوشه های سیستم ما را برای کانتینر قابل دسترس می کنند.

کانتینر فعلی را با زدن ctrl + c متوقف می کنیم و یک پوشه داخل پروژه با اسم src ایجاد می کنیم. داخل آن، فایل index.html را می سازیم و کد زیر را قرار می دهیم:

<!DOCTYPE html>
<html>
<body>

<h1>sokanacademy</h1>

<p>hello from nginx container</p>

</body>
</html>

به ترمینال برگشته و دوباره کانتینر nginx را اجرا می کنیم.

docker run --rm -p 80:80 -v E:\sokanacademydocker\src:/var/www/html/public sokan-nginx

این بار از گزینه v- هم استفاده کردیم. با استفاده از این گزینه می توان اسم volume یا مسیر کامل آن به همراه مسیر مورد نظر داخل کانتینر را مشخص کرد. بعد از نوشتن v- ابتدا مسیر سیستم خودمان را می دهیم و بعد : و مسیر مورد نظر داخل کانتینر را می نویسیم.

با رفتن به آدرس localhost:80 صفحه ای که ساختیم را مشاهده می کنیم و این یعنی داده های سیستم ما برای کانتینر قابل دسترس شده است.

مزیت استفاده از volume این است که فایل ها به صورت بی درنگ تغییر می کنند. اگر چند خط به فایل index.html مان اضافه کنیم میتوانیم همان لحظه در مرورگر این تغییر را مشاهده کنیم. این کار از سمت کانتینر هم امکان پذیر است. یعنی اگر توسط کانتینر محتویات فایلی تغییر کند، آن تغییر در سیستم ما هم بی درنگ اعمال می شود. 

اکنون کانتینر nginx ما آماده است. در قسمت های بعدی سایر کانتینر های مورد نیاز را آماده خواهیم کرد.

فایل‌های مربوط به این قسمت را می‌توانید از اینجا دانلود کنید.

دوره در حال تکمیل است ... rocket