Docker می‌تواند یک رویکرد بهینه برای اجرای اپلیکیشن‌های تحت وب در مرحله پروداکشن باشد، ولی در عین حال ممکن است بخواهید که چند اپلکیشن را در یک هاست Docker اجرا نمایید. در چنین شرایطی است که نیاز به یک پروکسی بازگشتی پیدا می‌کنید. به این دلیل که تنها می‌خواهید پورت‌های 80 و 443 را در معرض دنیای بیرون قرار دهید. ابزار Traefik یک پروکسی بازگشتی مبتنی بر Docker است که شامل یک داشبورد مانیتورینگ می‌شود. Traefik v1 مدت‌هاست که به صورت گسترده مورد استفاده قرار می‌گیرد. امّا در این آموزش، نصب و تنظیم ابزار Traefik v2 را بررسی می‌کنیم که برخی تفاوت‌ها را خواهد داشت.

بزرگترین تفاوت بین دو ابزار Traefik v1 و v2  در لایه نمایشی و لایه دسترسی به داده‌هاست که در نسخه دوم حذف شده و در روترها، میان‌ابزارها و سرویس‌ها ترکیب و توزیع شده‌اند. قبلاً یک لایه دسترسی یا بک‌اِند اصلاح لازم برای درخواست‌ها و عملیات لازم برای مدیریت آنها را انجام می‌داد. امّا Traefik v2 با معرفی میان‌ابزارهایی که می‌توانند درخواست‌ها را قبل از ارسال به یک سرویس، اصلاح کنند، بسیاری از نگرانی‌ها را کاهش داده است. میان‌ابزارها یا Middleware ها موجب سهولت در امر اصلاح به جای استفاده از روترهای مختلف می‌شوند. یک روتر همچنین می‌تواند از میان‌ابزارهای مختلف بهره ببرد.

در این آموزش، ابزار Traefik v2 را به گونه‌ای تنظیم می‌کنیم که درخواست‌ها را به دو کانتینر مختلف اپلکیشن تحت‌وب هدایت کند. این کانتینرها شامل یک کانتینر WordPress و یک کانتینر Adminer هستند که با یک پایگاه داده MySQL در ارتباطند. شما Traefik را به گونه‌ای تنظیم می‌کنید که به هر چیزی از طریق پروتکل HTTPS با استفاده از Let’s Encrypt سرویس‌دهی کند.

پیش‌نیازها

برای تکمیل مراحل این آموزش به موارد زیر احتیاج خواهید داشت.

  • یک سرور اوبونتو 04 با کاربر غیرروت دارای مجوّز sudo و یک فایروال. برای این منظور، حتماً کارهای مربوط به تنظیمات اولیه سرور را انجام دهید.
  • نصب Docker در سرور
  • نصب Docker Compose
  • یک دامین و سه رکورد A،‌ db-admin.your_domain، your_domain و monitor.your_domain. هر کدام از اینها می‌بایست به آدرس IP سرور شما ارجاع داده شوند. در طول مراحل این آموزش، حتماً آدرس دامین خود را با عبارت your_domain در فایل‌های تنظیمات و مثال‌ها جایگزین کنید.

گام ۱) تنظیم و اجرای ابزار Traefik

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

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

sudo apt-get install apache2-utils

سپس کلمه عبور را با htpassw تولید کنید. به جای عبارت secure_password، پسورد موردنظرتان را برای مدیریت ابزار Traefik قرار دهید.

htpasswd -nb admin secure_password

خروجی این برنامه مشابه زیر خواهد بود.

admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

بعداً از این خروجی در فایل تنظیمات Traefik برای تأیید پایه HTTP، بررسی سلامت ابزار Traefik و داشبورد مانیتورینگ استفاده خواهید کرد. کل خط خروجی را کپی کنید تا بتوانید آن را در جای دیگر قرار دهید.

به منظور تنظیم سرور Traefik، دو فایل تنظیمات جدید با نام traefik.toml و traefik_dynamic.toml با فرمت TOML ایجاد می‌کنیم. TOML یک زبان تنظیمات مشابه فایل‌های INI است، با این تفاوت که استانداردهای بیشتری در آن رعایت می‌شود. این فایل‌ها امکانی را فراهم می‌کنند که سرور Traefik و هماهنگ‌سازی‌های مختلف را تنظیم کنیم. در این آموزش، از سه پروایدر در دسترس Traefik، یعنی api، docker و acme استفاده می‌کنیم. توجه داشته باشید که acme از گواهی‌های TLS در Let’s Encrypt پشتیبانی می‌کند.

فایل traefik.toml را با استفاده از nano یا هر ویرایشگر دلخواه دیگری ایجاد و باز کنید.

nano traefik.toml

ابتدا پورت‌هایی را که ابزار Traefik می‌بایست از آنها داده دریافت کند، مشخص کنید. این کار از طریق بخش entryPoints در فایل تنظیمات صورت می‌گیرد. در اینجا به دو پورت 80  و 443 احتیاج خواهید داشت. نام این پورت‌ها را به ترتیب web و websecure نامگذاری می‌کنیم.

تنظیمات زیر را اضافه کنید.

[entryPoints]

[entryPoints.web]

address = ":80"

[entryPoints.web.http.redirections.entryPoint]

to = "websecure"

scheme = "https"

[entryPoints.websecure]

address = ":443"

به خاطر داشته باشید که به صورت اتوماتیک، ترافیک را به TLS هدایت می‌کنید.

سپس نوبت به تنظیم Traefik api می‌رسد. Traefik api دسترسی شما را به API و همین‌طور رابط کاربری داشبورد فراهم می‌کند. تیتر [api] همه آن چیزی است به آن احتیاج دارید. چرا که پس از آن، داشبورد به صورت پیش‌فرض فعال می‌شود.

کد زیر را اضافه کنید.

...

[api]

dashboard = true

برای تکمیل امنیت درخواست‌های وب نیاز به برنامه Let’s Encrypt برای تولید گواهی‌های TLS نیاز داریم. ترافیک Traefik v2 به صورت خارجی از Let’s Encrypt پشتیبانی می‌کند و می‌توانید از طریق ساخت یک certificates resolver از نوع acme تنظیم مربوط به آن را انجام دهید.

بر این اساس، certificates resolver را با استفاده از عنوان lets-encrypt تنظیم می‌کنیم.

...

[certificatesResolvers.lets-encrypt.acme]

email = "[email protected]_domain"

storage = "acme.json"

[certificatesResolvers.lets-encrypt.acme.tlsChallenge]

این بخش با عنوان acme نامگذاری می‌شود. چرا که ACME پروتکل ارتباطی مورد استفاده Let’s Encrypt برای مدیریت گواهی‌هاست. سرویس Let’s Encrypt نیازمند ثبت‌نام با استفاده از یک آدرس ایمیل معتبر است. در نتیجه، Traefik می‌تواند گواهی‌های لازم را برای هاست شما تولید کند و کلید ایمیل را برای آدرس ایمیل تنظیم نماید. سپس مشخص می‌کنید که اطلاعات دریافتی از Let’s Encrypt در یک فایل JSON با نام acme.json ذخیره شود.

بخش acme.tlsChallenge مشخص‌کننده نحوه تأیید گواهی توسط Let’s Encrypt است. یک فایل به عنوان بخشی از ورودی پورت 443 ، برای این سرویس درنظر گرفته می‌شود.

نهایتاً، باید ابزار Traefik را برای کار در کنار Docker تنظیم کنید.

تنظیمات زیر را وارد کنید.

....

[providers.docker]

watch = true

network = "web"

پروایدر docker موجب می‌شود که Traefik بتواند به عنوان پروکسی در جلوی کانتینرها Docker عمل کند. این پروایدر را برای پایش کانتینرهای جدید در شبکه web که بعداً می‌سازیم، ایجاد می‌کنیم.

در آخرین تنظیمات از file provider استفاده می‌کنیم. در Traefik v2 تنظیمات استاتیک و دینامیک نمی‌توانند با یکدیگر ترکیب یا هماهنگ شوند. برای مدیریت این موضوع، از traefik.toml برای تعریف تنظیمات استاتیک استفاده می‌کنیم و سپس تنظیمات دینامیک در یک فایل دیگر با نام traefik_dynamic.toml قرار می‌دهیم. در اینجا از file provider برای هدایت Traefik به خواندن تنظیمات دینامیک از یک فایل دیگر استفاده می‌کنیم.

file provider زیر را اضافه کنید.

[providers.file]

filename = "traefik_dynamic.toml"

فایل traefik.toml تکمیل‌شده به صورت زیر خواهد بود.

[entryPoints]

[entryPoints.web]

address = ":80"

[entryPoints.web.http.redirections.entryPoint]

to = "websecure"

scheme = "https"

[entryPoints.websecure]

address = ":443"

[api]

dashboard = true

[certificatesResolvers.lets-encrypt.acme]

email = "[email protected]_domain"

storage = "acme.json"

[certificatesResolvers.lets-encrypt.acme.tlsChallenge]

[providers.docker]

watch = true

network = "web"

[providers.file]

filename = "traefik_dynamic.toml"

فایل را ذخیره کرده و ببندید.

حالا نوبت ساخت فایل traefik_dynamic.toml است.

مقادیر تنظیمات دینامیکی که می‌بایست آنها را در فایل‌های خودشان نگهداری کنید، میان‌ابزارها و روترها هستند. برای اینکه یک کلمه عبور به داشبورد اختصاص دهید، نیاز به سفارشی‌سازی روتر API و تنظیم یک میان‌ابزار برای مدیریت تأیید پایه HTTP خواهید داشت. از تنظیم میان‌ابزار شروع می‌کنیم.

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

یک فایل جدید با نام traefik_dynamic.toml ایجاد کرده و آن را باز می‌کنیم.

nano traefik_dynamic.toml

کد زیر را اضافه کنید. اینجاست که باید خروجی فرمان htpasswd را جایگذاری نمایید.

[http.middlewares.simpleAuth.basicAuth]

users = [

"admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/"

]

برای تنظیم روتر نسبت به api دوباره باید از عنوان پروتکل استفاده کنید. ولی این بار به جای http.middlewares، عبارت http.routers را به همراه نام روتر به کار می‌بریم. در اینجا، api دارای روتر مخصوص به خودش است و می‌توانید برای تنظیم آن از بخش [http.routers.api] استفاده کنید.

تنظیمات زیر را وارد نمایید.

...

[http.routers.api]

rule = "Host(`monitor.your_domain`)"

entrypoints = ["websecure"]

middlewares = ["simpleAuth"]

service = "[email protected]"

[http.routers.api.tls]

certResolver = "lets-encrypt"

نقطه ورودی web پورت شماره 80 را مدیریت می‌کند و این در حالی است که نقطه ورودی websecure از پورت شماره 443 برای TLS/SSL استفاده می‌کند. تمام ترافیک پورت 80  به صورت اتوماتیک نقطه ورودی websecure هدایت می‌شود تا ارتباط کلیه درخواست‌ها الزاماً امن باشد.

اگر سه خط آخر را با دقت بررسی کنید، مشاهده می‌کنید که یک سرویس تنظیم شده، tls فعال شده و certResolver برابر “lets-encrypt” تنظیم شده است. سرویس‌ها آخرین گام برای مشخص‌کردن اقدام نهایی در مورد یک درخواست هستند. [email protected] یک سرویس داخلی است که در پشت API شما قرار می‌گیرد. همانند روترها و میان‌ابزارها، سرویس‌ها را نیز می‌توان در این فایل تنظیم کرد. امّا در عین حال، انجام این کار برای رسیدن به هدف موردنظرتان، الزامی نیست.

فایل تکمیل‌شده traefik_dynamic.toml به صورت زیر خواهد بود.

[http.middlewares.simpleAuth.basicAuth]

users = [

"admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/"

]

[http.routers.api]

rule = "Host(`monitor.your_domain`)"

entrypoints = ["websecure"]

middlewares = ["simpleAuth"]

service = "[email protected]"

[http.routers.api.tls]

certResolver = "lets-encrypt"

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

پس از انجام این تنظیمات، می‌توانید ابزار Traefik را راه‌اندازی نمایید.

گام ۲)  اجرای کانتینر Traefik

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

یک شبکه Docker با نام web ایجاد می‌کنیم.

docker network create web

وقتی کانتینر Traefik اجرا شد، آن را به این شبکه اضافه خواهیم کرد. بعداً این امکان برایتان وجود خواهد داشت که کانتینرهای دیگر را به این شبکه اضافه کرده و برای پروکسی Traefik استفاده کنید.

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

touch acme.json

Traefikتنها زمانی می‌تواند از این فایل استفاده کند که کاربر روت درون کانتینر دسترسی خواندن و نوشتن به آن را داشته باشد. برای این منظور، مجوّزها در acme.json را به گونه‌ای تنظیم می‌کنیم که فقط مالک فایل بتواند آن را بخواند یا ویرایش کند.

chmod 600 acme.json

وقتی فایل به  Dockerانتقال داده شد، مالک به صورت اتوماتیک درون کانتینر به کاربر روت تغییر داده می‌شود.

نهایتاً کانتینر Traefik را با فرمان زیر ایجاد می‌کنیم.

docker run -d \

-v /var/run/docker.sock:/var/run/docker.sock \

-v $PWD/traefik.toml:/traefik.toml \

-v $PWD/traefik_dynamic.toml:/traefik_dynamic.toml \

-v $PWD/acme.json:/acme.json \

-p 80:80 \

-p 443:443 \

--network web \

--name traefik \

traefik:v2.2

این فرمان نسبتاً طولانی را به صورت جزء به جزء بررسی می‌کنیم.

از گزینه -d برای اجرای کانتینر در پس‌زمینه استفاده می‌کنیم. بعداً docker.sock درون کانتینر به اشتراک گذاشته می‌شود تا ابزار Traefik بتواند متوجه تغییرات کانتینرها باشد. همچنین فایل‌های traefik.toml و traefik_dynamic.toml و همین‌طور، acme.json درون کانتینر به اشتراک گذاشته می‌شوند.

در مرحله بعدی، پورت‌های 80 و 443 هاست Docker به همان پورت‌ها در کانتینر Traefik هدایت می‌شوند. در نتیجه، ابزار Traefik تمام ترافیک HTTP و HTTPS به سرور را دریافت خواهد کرد.

همچنین شبکه کانتینر را به صورت web و نام کانتینر را برابر traefik تنظیم می‌کنیم.

نهایتاً از ایمیج traefik:v2.2 برای این کانتینر استفاده می‌کنیم. با کاربرد این ایمیج، از تطابق نسخه این آموزش با نسخه خودتان مطمئن می‌شوید.

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

پس از اجرای کانتینر، به داشبوردی دسترسی پیدا می‌کنید که می‌توانید وضعیت کانتینرها را در آن مشاهده نمایید. همچنین می‌توان از این داشبورد برای شبیه‌سازی روترها، سرویس‌ها و میان‌ابزارهای ثبت‌شده Traefik استفاده کرد. با وارد کردن آدرس https://monitor.your_domain/dashboard/ در مرورگر می‌توانید به این داشبورد دسترسی پیدا کنید.

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

وقتی وارد شدید، رابط کاربری ابزار Traefik را مشاهده خواهید کرد.

رابط کاربری ابزار Traefik

رابط کاربری ابزار Traefik

در اینجا مشاهده می‌کنید که هم‌اکنون نیز برخی روترها و سرویس‌ها ثبت شده‌اند. ولی درنظر داشته باشید که اینها همان‌هایی هستند که با تنظیمات Traefik و روتر نوشته‌شده برای API همراه بوده‌اند.

اکنون پروکسی Traefik در حال اجراست و آن را برای کار با Docker و پایش کانتینرهای دیگر تنظیم کرده‌اید. در گام بعدی، یک سری کانتینر به منظور پروکسی برای ابزار Traefik اجرا می‌کنیم.

گام ۳) ثبت کانتینرها با Traefik

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

۱) یک وبلاگ با استفاده از نسخه رسمی ایمیج WordPress

۲) یک سرور مدیریت پایگاه داده با استفاده از ایمیج رسمی Adminer

هر دوی این اپلیکیشن‌ها با Docker Compose و به‌وسیله یک فایل docker-compose.yml مدیریت خواهند شد.

فایل docker-compose.yml را در ویرایشگر بسازید و باز کنید.

nano docker-compose.yml

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

version: "3"

networks:

web:

external: true

internal:

external: false

در اینجا از نسخه Docker Compose version 3 استفاده می‌کنیم. چرا که این جدیدترین نسخه عمده Compose محسوب می‌شود.

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

سپس نوبت به تعریف یک به یک سرویس‌ها می‌رسد. ابتدا با کانتینر blog شروع می‌کنیم که مبتنی بر ایمیج رسمی WordPress است. تنظیمات زیر را به انتهای فایل اضافه کنید.

...

services:

blog:

image: wordpress:4.9.8-apache

environment:

WORDPRESS_DB_PASSWORD:

labels:

- traefik.http.routers.blog.rule=Host(`blog.your_domain`)

- traefik.http.routers.blog.tls=true

- traefik.http.routers.blog.tls.certresolver=lets-encrypt

- traefik.port=80

networks:

- internal

- web

depends_on:

- mysql

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

قسمت labels جایی است که شما مقادیر تنظیمات را برای ابزار Traefik مشخص می‌کنید. برچسب‌های Docker به تنهایی کار خاصی انجام نمی‌دهند، ولی Traefik آنها را خوانده و نحوه رفتار با کانتینرها را بر اساس آن تنظیم می کند. کاربرد هر کدام از این برچسب‌ها را در زیر مرور می‌کنیم.

  • http.routers.adminer.rule=Host(`blog.your_domain`) یک روتر جدید برای کانتینر ایجاد می‌کند. سپس قاعده روتر مطابق با درخواست کانتینر مشخص می‌شود.
  • routers.custom_name.tls=true مشخص می‌کند که این روتر باید از TLS استفاده نماید.
  • routers.custom_name.tls.certResolver=lets-encrypt مشخص می‌کند که certificates resolver که قبلاً با نام lets-encrypt ایجاد کرده بودیم، می‌بایست برای دریافت گواهی مورد استفاده قرار گیرد.
  • port پورت آزاد مورد استفاده ابزار Traefik را برای هدایت ترافیک به این کانتینر مشخص می‌کند.

به وسیله این تنظیمات، تمام ترافیک ارسالی به هاست Docker در پورت 80 یا 443 با دامین blog.your_domain به کانتینر blog هدایت می‌شوند.

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

نهایتاً کلید depends_on برای Docker Compose مشخص می‌کند که این کانتینر باید بعد از اجرای متعلقاتش، شروع به کار کند. به دلیل اینکه WordPress برای اجرا نیاز به یک پایگاه داده دارد، قبل از کانتینر blog می‌بایست حتماً کانتینر mysql را اجرا نمایید.

سپس نوبت به تنظیم سرویس MySQL می‌رسد.

services:

...

mysql:

image: mysql:5.7

environment:

MYSQL_ROOT_PASSWORD:

networks:

- internal

labels:

- traefik.enable=false

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

در نهایت، کانتینر Adminer را تعریف می‌کنیم.

services:

...

adminer:

image: adminer:4.6.3-standalone

labels:

- traefik.http.routers.adminer.rule=Host(`db-admin.your_domain`)

- traefik.http.routers.adminer.tls=true

- traefik.http.routers.adminer.tls.certresolver=lets-encrypt

- traefik.port=8080

networks:

- internal

- web

depends_on:

- mysql

این کانتینر بر اساس ایمیج رسمی  Adminer است. شبکه و تنظیمات depends_on برای این کانتینر دقیقاً همان چیزی است که برای کانتینر blog به کار برده بودیم.

خط traefik.http.routers.adminer.rule=Host(`db-admin.your_domain`) به ابزار Traefik می‌گوید که هاست مورد درخواست را آزمایش کند. اگر این هاست با الگوی db-admin.your_domain مطابقت داشته باشد، ترافیک به کانتینر adminer از طریق پورت 8080 هدایت می‌شود.

فایل تکمیل‌شده docker-compose.yml به صورت زیر خواهد بود.

version: "3"

networks:

web:

external: true

internal:

external: false

services:

blog:

image: wordpress:4.9.8-apache

environment:

WORDPRESS_DB_PASSWORD:

labels:

- traefik.http.routers.blog.rule=Host(`blog.your_domain`)

- traefik.http.routers.blog.tls=true

- traefik.http.routers.blog.tls.certresolver=lets-encrypt

- traefik.port=80

networks:

- internal

- web

depends_on:

- mysql

mysql:

image: mysql:5.7

environment:

MYSQL_ROOT_PASSWORD:

networks:

- internal

labels:

- traefik.enable=false

adminer:

image: adminer:4.6.3-standalone

labels:

labels:

- traefik.http.routers.adminer.rule=Host(`db-admin.your_domain`)

- traefik.http.routers.adminer.tls=true

- traefik.http.routers.adminer.tls.certresolver=lets-encrypt

- traefik.port=8080

networks:

- internal

- web

depends_on:

- mysql

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

سپس نوبت تنظیم مقادیر در shell برای متغیرهای  WORDPRESS_DB_PASSWORD و MYSQL_ROOT_PASSWORD می‌رسد.

export WORDPRESS_DB_PASSWORD=secure_database_password

export MYSQL_ROOT_PASSWORD=secure_database_password

عبارت secure_database_password را با کلمه عبور دلخواه خودتان جایگزین کنید. به خاطر داشته باشید که برای هر دو پارامتر WORDPRESS_DB_PASSWORD و MYSQL_ROOT_PASSWORD یک پسورد یکسان انتخاب نمایید.

پس از تنظیم متغیرها، با استفاده از docker-compose کانتینرها را اجرا کنید.

docker-compose up -d

حالا داشبورد مدیریت ابزار Traefik را مشاهده کنید.

داشبورد مدیریت ابزار Traefik

داشبورد مدیریت ابزار Traefik

اگر به سراغ بخش Routers بروید، روترهایی برای adminer و blog به صورت TLS خواهید دید.

بررسی بخش Routers

بررسی بخش Routers

به سراغ blog.your_domain رفته و عبارت your_domain را با دامین خودتان جایگزین نمایید. در نتیجه، به یک ارتباط TLS هدایت می‌شوید و می‌توانید نصب WordPress را به پایان برسانید.

تکمیل نصب WordPress

تکمیل نصب WordPress

حالا با وارد کردن db-admin.your_domain در مرورگر به Adminer وارد شوید. در اینجا نیز باید به جای عبارت your_domain از دامین خودتان استفاده کنید. کانتینر mysql در معرض دسترسی دنیای بیرون قرار نخواهد داشت. این در حالی است که کانتینر adminer این دسترسی را از طریق شبکه داخلی Docker و اشتراک‌گذاری کانتینر mysql به عنوان هاست دارد.

در صفحه ورودی Adminer، برای نام کاربری root و برای سرور mysql را وارد کنید. همچنین کلمه عبوری را که برای MYSQL_ROOT_PASSWORD تنظیم کرده بودید، در اینجا تایپ کنید. مقدار Database را خالی بگذارید  و سپس Login را بزنید.

پس از ورود، صفحه رابط کاربری Adminer را مشاهده خواهید کرد.

صفحه رابط کاربری Adminer

صفحه رابط کاربری Adminer

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

جمع‌بندی

در این آموزش، به تنظیم ابزار Traefik v2 به عنوان پروکسی بازگشتی برای اپلیکیشن‌های دیگر در کانتینرهای Docker پرداختیم. تنظیمات Traefik در سطح کانتینر اپلیکیشن، فرآیند تنظیم سرویس‌های بیشتر را تسهیل می‌کند. همچنین هنگامی که اپلیکیشنی جدید به ترافیک پروکسی اضافه می‌کنید، نیازی به راه‌اندازی دوباره کانتینر traefik وجود ندارد. چرا که Traefik به سرعت تغییرات از طریق فایل سوکت Docker تشخیص می‌دهد.