How To Use Traefik as a Reverse Proxy for Docker Containers on

Traefik Revers Proxy Ubunutu Banner

آموزش نصب و پیکربندی پراکسی معکوس برای مخازن داکر Docker در Ubunutu 18.04

How To Use Traefik as a Reverse Proxy for Docker Containers on Ubuntu 18.04

معرفی

داکر Docker می تواند یک روش موثر برای تولید برنامه ها باشد ، اما آیا می توانید چندین برنامه را بر روی یک میزبان داکر اجرا کنید. از آنجایی که پورت های ۸۰ و ۴۴۳ به همه دنیا ارائه شده است ، برای این کار نیاز به تنظیم یک پراکسی معکوس دارید.برنامه Treafik یک ابزار پراکسی معکوس Reverse Proxy برای مخازن Docker است که دارای یک داشبورد مانیتورینگ مختص به خود است. در این آموزش از Treafik برای ارسال درخواست ها به دو سرویس دهنده وب ، که یکی شامل مخازن وردپرس و دیگری مخازن Adminer است و هرکدام به پایگاه داده MySQL متصل هستند ، استفاده می کنیم. همچنین پیکربندی Treafik به شکلی انجام می شود که تمام سرویس ها در بستر HTTPS با استفاده از  Let’s Encrypt ارائه می شوند.

پیش نیاز ها

در این آموزش به موارد زیر نیاز خواهید داشت :

مرحله اول – پیکربندی و اجرای Traefik

پروژه Traefik در Docker image رسمی وجود دارد ، بنابراین از مخازن داکر برای اجرای Traefik استفاده می کنیم.

اما قبل از دریافت و اجرای مخازن Traefik باید یک فایل پیکر بندی ایجاد کنیم و یک رمز عبور به صورت رمز شده برای دسترسی به داشبورد مانیتورینگ تنظیم کنیم.

برای تولید این رمز از ابزار htpasswd استفاده می کنیم. در ابتدا این ابزار را که در پکیج های apache2-utils موجود می باشد ، نصب می کنیم.

برای تولید رمز عبور با htpasswd مقدار secure_password را در دستور زیر با رمز دلخواه خود برای دسترسی به کاربر مدیر admin ، جایگزین کنید :

خروجی باید شبیه به این باشد :

از این خروجی باید در فایل پیکربندی Traefik برای تنظیم احراز هویت پایه HTTP جهت دسترسی برای بررسی وضعیت Traefik و داشبورد مانیتورینگ ، استفاده کنید. این خروجی را کپی کنید ، بعدا آن را جای گذاری می کنیم.

برای پیکربندی سرور Traefik ، باید یک فایل با نام traefik.toml که از فرمت TOML استفاده می کند ، ایجاد کنیم. TOML یک زبان پیکربندی مانند INI است ولی استاندارد شده. از این فایل برای پیکربندی سرور Traefik و یکپارچه سازی ها یا سرویس دهنده های مختلفی که از آنها استفاده می کنیم را پیکربندی کنیم. در این آموزش از سه سرویس دهنده فعال Traefik استفاده می کنیم : api , docker و acmp که از TLS با استفاده از Lets Encrypt پشتیبانی می کنند.

این فایل را با یک ویرایشگر متن باز کنید :

در ابتدا دو نام ورودی http و https را برای دسترسی پیش فرض همه backend ها اضافه می کنیم :

بعدا ورودی های http و https را پیکربندی می کنیم.

در ادامه سرویس دهنده api را تنظیم می کنیم که دسترسی رابط داشبورد را برای شما فراهم می کند. اینجا جایی است که باید مقدار خروجی دستور htpasswd را که کپی کرده بودید ، جای گذاری کنید :

داشبورد یک برنامه تحت وب جداگانه است که بوسیله مخازن Traefik اجرا می شود و ما در اینجا تنظیم کردیم که روی پورت ۸۰۸۰ اجرا شود.

در قسمت entrypoints.dashboard تنظیم می کنیم که چطور به سرویس دهنده api متصل شویم ، و در قسمت entrypoints.dashboard.auth.basic تنظیم کردیم که احراز هویت پایه HTTP برای داشبورد انجام شود. خروجی دستور htpasswd را در قسمت users باید جای گذاری کنید. در این قسمت بوسیله جدا کننده کاما می توانید چندین کاربر را برای ورود تعیین کنید.

اولین entryPoint را تنظیم کردیم ، ولی باید تنظیمات دیگری را برای ارتباط http و https استاندارد به سمت سرویس دهنده api را تعریف کنیم. در قسمت entryPoints آدرس های Traefik و مخازن لیست شده را تنظیم می کنیم. خطوط زیر را در انتهای قسمت entryPoints وارد کنید :

برای ورودی http پورت ۸۰ و برای ورودی https پورت ۴۴۳ با ترافیک SSL/TLS تعیین شده. ما تمام ترافیک بر روی پورت ۸۰ را به پورت ۴۴۳ جهت اجبار در امن کردن ارتباطات برای تمام درخواست ها انجام می دهیم.

در ادامه ، این قسمت را برای پشتیبانی Traefik از گواهینامه Let’s Encrypt اضافه کنید :

این قسمت با نام acme معرفی شده است ، این پروتکل با نام ACME است که برای ارتباط با Let’s Encrypt برای مدیریت گواهینامه SSL است. برای استفاده از سرویس Let’s Encrypt به یک آدرس ایمیل معتبر نیاز است ، بنابراین برای تولید گواهینامه برای Traefik یک آدرس ایمیل در مقدار email به جای your_email قرار دهید. سپس اطلاعات دریافتی از Let’s Encrypt را که در قالب فایل JSON با نام acme.json است را ذخیره می کنیم. مقدار entryPoint به پورت ۴۴۳ که برای ارتباطات https تعیین کردیم اشاره می کند.

مقدار onHostRule  درباره نحوه تولید گواهینامه ها می باشد. ما می خواهیم گواهینامه هایمان را به محض این که مخزن هایی  با نام های میزبان مشخصی ایجاد می شوند، ذخیره کنیم و این ها در تنظیمات onHostRule مشخص می شوند.

قسمت acme.httpChallenge مشخص می کند که Let’s Encrypt چطور می تواند گواهینامه ای را که می خواهد تولید کند را بررسی کند. ما در این قسمت تنظیم کردیم که از طریق ورودی http این کار را انجام دهد.

در انتها نیز سرویس دهنده Docker را با اضافه کردن خطوط زیر پیکربندی می کنیم :

سرویس دهنده Docker برنامه Traefik را به صورت یک پراکسی در مخازن خود فعال می کند. ما آن را به صورت سرویس دهنده watch برای مخازن جدید در شبکه web که به زودی آن را راه اندازی می کنیم ، فعال می کنیم و آن را به صورت زیردامنه ای از your_domain آماده سرویس دهی می کنیم.

تنظیماتی که تا اینجا در فایل traefik.toml انجام دادیم باید باید به صورت زیر باشد :

فایل را ذخیره کنید و از محیط ویرایشگر فایل خارج شوید. با تنظیماتی که انجام دادیم می توانید Treafik را اجرا کنید.

مرحله دوم – اجرای مخازن Trteafik

در مرحله بعدی یک شبکه پراکسی داکر برای به اشتراک گذاری بوسیله مخازن باید ایجاد کنیم. برای اجرای برنامه هایی که با Docker Compose اجرا می شوند نیاز به یک شبکه داکر داریم. به اینجا نام این شبکه را web می گذاریم :

مخازن شبکه وقتی اجرا می شوند به این شبکه اضافه می شوند. بعدا می توانیم مخازن بیشتری را به این شبکه پراکسی اضافه کنیم.

در ادامه یک فایل خالی را برای نگهداری اطلاعات Let’s Encrypt ایجاد می کنیم. برای استفاده Traefik از این فایل باید آن را در مخازن به اشتراک بگذاریم :

این فایل فقط مورد استفاده Traefik است پس دسترسی به این فایل را به صورت قفل می کنیم که فقط کاربر ریشه داخل مخزن به این فایل دسترسی نوشتن و خواندن داشته باشد :

وقتی فایلی در داخل داکر قرار می گیرد به صورت خودکار مالکیت فایل به کاربر root داخل مخزن تغییر می کند.

در نهایت با دستور زیر یک مخزن Traefik ایجاد می کنیم :

این دستور کمی طولانی است که آن را توضیح می دهیم.

از علامت d- برای اجرای مخزن به صورت دائم و در پشت زمینه استفاده کردیم سپس فایل docker.sock را مخزن به اشتراک می گذاریم تا پروسه Traefik بتواند تغییرات مخزن را شنود کند. همچنین فایل پیکربندی traefik.toml و فایل acme.jason را که ایجاد کردیم را در مخزن به اشتراک می گذاریم.

بعد، پورت های ۸۰ و ۴۴۳ را از میزبان Docker به پورت های مشابه در کانتینر Traefik معرفی می کنیم تا Trafik تمام ترافیک HTTP و HTTPS را به سرور دریافت کند.

سپس دو برچسب Docker را تنظیم می کنیم که Trafeik را برای هدایت ترافیک به مانیتور hostname.your_domain به پورت ۸۰۸۰ در مخزن Traefik هدایت می کند و داشبورد نظارت را نمایش می دهد.

شبکه مخزن را با نام web و نام مخزن را با نام traefik معرفی می کنیم.

در انتها از traefik:1.7.2-alpine برای منبع مخزن استفاده می کنیم ، به خاطر اینکه خیلی کوچک است.

یک منبع داکر ENTRYPIONT یک دستور است که همیشه وقتی که یک مخزن از یک منبع ایجاد می شود ، اجرا می شود. در اینجا دستور فایل باینری Trafik داخل مخزن است. می توانید آرگومان های اضافی را همراه این دستور ، زمانی که مخزن را اجرا می کنید ، ارسال کنید ، اما ما همه تنظمیات را در فایل traefik.toml تنظیم کردیم.

همزمان با اجرا شدن مخزن می توانید به داشبورد برای بررسی سلامتی مخزن هایتان دسترسی داشته باشید. با استفاده از داشبورد هر چیزی که Traefik در frontend و backend ثبت می کند را به صورت تصویری می توانید مشاهده کنید. از طریق مرورگر و با آدرس https://monitor.your_domain می توانید به داشبورد دسترسی داشته باشید. شما باید با استفاده از نام کاربری admin و رمز عبوری که در مرحله اول تعیین کردید وارد شوید.

بعد از اولین ورود رابط کاربری مشابه زیر را مشاهده می کنید :

Treafik revers proxy 1

در اینجا چیز زیادی برای دیدن وجود ندارد و این صفحه رو همین صورت رها کنید ، هنگام اضافه کردن مخزن به Traefik و کار کردن با آن می بینید که محتویات صفحه تغییر می کنند.

ما الان پراکسی Traefik را اجرا کردیم ، برای کار با داکر آن را تنظیم کردیم و آماده مانیتورینگ بقیه مخازن داکر هستیم.

مرحله سوم – ثبت مخازن با Traefik

با راه اندازی مخزن Traefik ، اکنون می توانید برنامه هایتان را روی آن اجرا کنید. در ادامه مخازن زیر را بر روی Traefik اجرا می کنیم :

  1. یک بلاگ با استفاده از مخزن نسخه رسمی وردپرس
  2. یک مدیریت پایگاه داده با استفاده از مخزن نسخه رسمی Adminer

هر دو این برنامه را با Docker Compose و با فایل docker-compose.yml مدیریت می کنیم. فایل docker-compose.yml را با ویرایشگر متن باز کنید :

برای مشخص کردن نسخه و شبکه ای که استفاده می کنیم ، خطوط زیر را اضافه کنید :

ما از نسخه ۳ برنامه Docker Compose استفاده می کنیم زیرا جدیدترین نسخه رسمی می باشد.

برای تشخیص برنامه ما توسط Traefik لازم است که برنامه ما جزو شبکه آن باشد و از آنجایی که ما شبکه به صورت دستی ایجاد کردیم ، آن را با نام web مشخص می کنیم و مقدار external را true تعین می کنیم. سپس یک شبکه دیگر ایجاد می کنیم برای اینکه مخازن ایجاد شده را به یک مخزن پایگاه داده متصل کنیم که ما از طریق Traefik به آن دسترسی نداریم. نام این شبکه را internal قرار می دهیم.

در ادامه سروریس هایمان services را به صورت یکی یکی تعریف می کنیم. با مخزن blog شروع می کنیم ، که برا روی منابع وردپرس رسمی قرار دارد. این تنظیمات را به فایل پیکربندی اضافه کنید :

مقدار environment به شما اجازه می دهد که متغیرهایی را که در سمت مخزن نیاز دارید را تنظیم کنید. با تنظیم یک مقدار برای WORDPRESS_DB_PASSWORD ، ما به Docker Compose می گوییم که زمان ایجاد مخزن این مقدار را از محیط پوسته کاری ما (shell) بگیرد و از همین طریق آن را ارسال کند. ما باید این متغیرهای محیطی را قبل از اجرای مخازن در پوسته کاری مان (shell) تعریف کنیم. با این کار دیگر نیازی نیست رمز عبور را در فایل تنظیمات ذخیره کنیم.

در قسمت labels مقادیر مورد استفاده در پیکربندی را برای Traefik مشخص می کنیم. Docker با این مقدار ها کاری ندارد ولی Traefik با خواندن این مقادیر می فهمد که چطور با مخزن ها برخورد کند. در ادامه توضیح عملکرد هر یک از این برچسب ها را شرح می دهیم :

  • Traefik.backend : نام سرویس backend را در Traefik مشخص می کند ( که به مخزن blog اشاره می کند )
  • Traefik.frontend.rule : به Treafik می گوید که درخواست های هاست را بررسی کند و اگر با الگوی blog.your_domain مطابقت داشت آن را به سمت مخزن blog هدایت کند.
  • Traefik.docker.network : شبکه ای که Traefik در آن به دنبال آدرس IP داخلی می گردد را مشخص می کنیم. از آنجایی که Traefik به تمام اطلاعات Docker دسترسی دارد ، اگر این شبکه را مشخص نکنیم به صورت پیش فرض از شبکه internal آدرس IP را می گیرد.
  • Traefik.port : شماره پورت ای که Traefik باید برای مسیریابی این مخزن استفاده کند را مشخص می کنیم.

با استفاده از این پیکربندی، تمام ترافیک ارسال شده به پورت ۸۰ میزبان Docker ما ، به مخزن blog منتقل می شود.

ما این مخزن را به دو شبکه متفاوت متصل کردیم که Traefik آن را از طریق شبکه web پیدا می کند و با مخزن پایگاه داده در شبکه internal ارتباط برقرار می می کند.

در آخر ، کلید depends_on به Docker Compose می گوید که این مخزن باید بعد از اجرای پیش نیاز ها راه اندازی شود. از آنجایی که وردپرس برای اجرا به پایگاه داده نیاز دارد ، ما باید مخزن mysql را قبل از مخزن blog اجرا کنیم.

در ادامه سرویس MySQL را با اضافه کردن خطوط زیر تنظیم می کنیم :

در این مخزن از نسخه MySQL 5.7 رسمی استفاده کردیم. در اینجا دقت کنید که یک بار دیگر از environment بدون مقدار استفاده کردیم. متغیر های MYSQL_ROOT_PASSWORD  و WORDPRESS_DB_PASSWORD نیاز به مقدار دارند و مقدار های آنها باید یکی باشد و باید مطمئن شوید که مخزن WordPress می تواند با مخزن MySQL ارتباط برقرار کند. ما نمی خواهیم که مخزن mysql را به Traefik یا به کل دنیا معرفی کنیم به هم خاطر ما آن را فقط به شبکه internal معرفی می کنیم. همچنین از آنجایی که Traefik به Docker socket دسترسی دارد ، پروسه آن به صورت پیش فرض مخزن mysql را در frontend معرفی می کند ، برای جلوگیری از این کار برچسب traefik.enable=false را مشخص می کنیم.

در انتها خطوط زیر را برای تنظیم مخزن Adminer اضافه کنید :

این مخزن بر روی منبع رسمی Adminer قرار دارد. تنظیمات قسمت های network و depends_on برای این مخزن دقیقا مشابه مخزن blog است.

با اینکه قبلا تنظیم کردیم تا همه ترافیک پورت ۸۰ میزبان Docker ما به مخزن blog ارسال شود، ترافیک ورودی این مخزن باید به صورت جداگانه تنظیم کنیم. خط traefik.frontend.rule=Host:db-admin.your_domain به Traefik می گوید که میزبان درخواست شده را بررسی کند و اگر مشابه الگوی db-admin.your_domain بود ، آن را به سمت مخزن adminer معرفی کند.

تنظیمات در این قسمت نیز به پایان رسید و فایل docker-compose.yml باید مشابه زیر باشد :

فایل را ذخیره کرده و خارج شوید.

سپس برای متغیر های WORDPRESS_DB_PASSWORD  و MYSQL_ROOT_PASSWORD قبل از اجرای مخزن ها مقداری را تعیین کنید :

رمز عبور مورد نظرتان را جایگزین کنید و دقت کنید که باید رمز عبور یکسان برای هردو تعیین کنید.

با مقدار هایی که تعیین کردید ، مخزن ها را با docker-compose راه اندازی می کنیم :

اکنون به داشبورد مدیریت Traefik نگاه می کنیم، می بینید که backend و frontend برای دو سرور معرفی شده وجود دارد :

Treafik revers proxy 2

شما به نام دامنه ای که در blog.your_domain تعیین کردید هدایت می شوید. سپس به یک ارتباط امن TLS هدایت شده و می توانید نصب وردپرس را کامل کنید :

Treafik revers proxy 3

اکنون از طریق مرورگر با آدرس db-admin.your_domain می توانید به Adminer دسترسی داشته باشید. مخزن mysql به دنیای بیرون ارائه نشده ولی مخزن adminer از طریق شبکه internal داکر که مخزن mysql را با یک نام میزبان به اشتراک گذاشته است ، دسترسی دارد.

در صفحه ورود Adminer از نام کاربری root که برای سرور mysql تنظیم کردیم و رمز عبوری که برای MYSQL_ROOT_PASSWORD قرار دادید ، استفاده کنید. پس از ورود ، رابط کاربری Adminer را مشاهده می کنید :

Treafik revers proxy 4

الان هر دو سایت کار می کنند و می توانید از داشبورد monitor.your_domain استفاده کنید و دیگر کاری با برنامه نداشته باشید.

پایان

در این آموزش Traefik را برای پراکسی درخواست ها به برنامه های دیگر در مخزن های Docker تنظیم کردیم.

تنظیمات انجام شده برای Traefik باعث می شود تا تنظیم سرویس های بیشتر راحتتر باشد و وقتی که مخزن جدید را به پراکسی traefik اضافه می کنید ، نیازی به راه اندازی مجدد سرویس trafik نیست ، زیرا traefik با مانیتور کردن فایل تنظیمات Docker socket تغییرات بلافاصله انجام می دهد.

برای کسب دانش و تجربه بیشتر درباره traefik مستندات رسمی traefik را مطالعه کنید.

Leave a Reply