برنامه‌های کاربردی ابر بومی: ایجاد یک ایمیل سرور با داکر

برنامه‌های کاربردی ابر بومی: ایجاد یک ایمیل سرور با داکر

در این مطلب ایجاد یک محیط ایمیل سرور با داکر[1] را به شما آموزش می‌دهیم که سنگ بنای سایر مقالات موجود در زمینه پیاده‌سازی‌های ابر بومی است.

 

مقدمه‌ای بر ایجاد یک ایمیل سرور با داکر

زمانی که قصد اجرای کدها روی سرورهای مختلف را دارید، می‌توانید کد و کلیه الزامات مورد نیاز برای اجرای آن را در یک واحد نرم‌افزاری بنام کانتینر (container) قرار دهید. بنابراین امکان اجرای کد، مستقل از نوع پیکربندی سیستم وجود دارد. مدیریت کانتینرها بر عهده ابزار متن باز کوبرنیتز است.

هدف اصلی این مطلب گردآوری گام‌هایی است که کاربر باید برای نصب نرم‌افزار ایمیل سرور داکری، بر روی یک کلاستر کوبرنتیز طی کند. می‌توانید این مقاله را به عنوان مرجع در نظر بگیرید و هر زمان نیاز به یادآوری نکته‌ای درباره نصب نرم‌افزار ایمیل سرور با داکر و کوبرنتیز داشتید از آن استفاده کنید.

در این مطلب مراحل تبدیل RPM[2] یا Redhat Package Manager به یک ایمیل داکر، انتشار روی یک داکر هاب[3]، ایجاد و تنظیم کلاستر در پلتفرم ابر گوگل و نصب ایمیج خودمان را به شما توضیح می‌دهیم.

 

برنامه کاربردی نمونه: ایمیل سرور Axigen

در این مطلب از ایمیل سرور داکر Axigen به عنوان برنامه کاربردی نمونه استفاده می‌کنیم چون با اینکه مخصوص فناوری ایمیل سرور است اما بسیاری از الزامات برنامه‌های کاربردی مدرن را برآورده می‌کند. تعدادی از این الزامات شامل موارد زیر هستند:

  • یک بخش فرانت -‌اند که درخواست‌های کاربر در آن دریافت می‌شود؛
  • یک بخش بک -‌اند که وضعیت را ذخیره می‌کند.
  • یک بخش ایستا که یک رابط کاربری زیبا به کاربران نمایش داده و آنها را به فرانت -‌اند متصل می‌کند.

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

توجه: Axigen یک ایمیج داکر کاملاً کاربردی و آماده استفاده در داکر ‌هاب ایجاد می‌کند. می‌توانید همه اطلاعات مربوط به پیاده سازی و اجرای Axigen در داکر را پیدا کرده و خودتان آن را امتحان کنید.

 

چرا از ایمیل سرور ابر بومی استفاده کنیم؟

در ادامه مزایای تبدیل ایمیل سرور به یک نرم‌افزار ابر بومی مخزنی را مورد بررسی قرار می‌دهیم:

 

  1. کاهش وابستگی به سیستم‌عامل مبنا (که مخزن را اجرا می‌کند)

  • می‌توان مخزن را به راحتی و بدون بسته‌بندی مجدد (repackaging) جابجا کرد؛
  • نیاز به کنترل سیستم‌عامل پایه را از نظر نظارت، ارتقای نرم‌افزارها و غیره از بین می‌برد (برخلاف مدل Rehost که در آن مشتری همچنان باید ایمیج سیستم‌عامل تأمین شده توسط ارائه‌دهنده ابر را مدیریت کند)؛
  • استقلال از ارائه‌دهنده (نیازی به نصب مجدد برنامه‌های کاربردی و مهاجرت داده‌ها در هنگام تغییر ارائه دهنده وجود ندارد).

 

  1. ساده‌سازی چشمگیر افزایش مقیاس

  • در محیط مجازی، افزایش مقیاس عمودی (اضافه کردن ظرفیت دیسک، حافظه و پردازنده) کار راحتی است اما مقیاس پذیری افقی[4] محدودتر است؛
  • رویکرد مخزن محور باعث می‌شود که توسعه دهنده/ پکیج کننده برنامه کاربردی دیدگاه «ابر بومی» پیدا کند در نتیجه مسائل رایانشی را از مسائل مربوط به ذخیره اطلاعات و خود مدل تفکیک می‌کند؛
  • به دلیل کاهش چشمگیر سربار مدل مخزنی نسبت به ماشین مجازی، تعداد نمونه‌ها از ده‌ها به هزاران عدد قابل افزایش است در نتیجه بار مدیریت سطح بالای همروندی توسط نرم‌افزار کاهش پیدا می‌کند.

 

مدل سرور ابر بومی بیشتر مناسب چه افرادی است؟

مدل سرور ابر بومی بیشتر مناسب چه افرادی است؟

با توجه به تعداد زیاد پلتفرم‌های موجود (مثل AWS، آژور، آی‌بی‌ام کلود و غیره) که ماشین‌های ابری را در اختیار شما قرار می‌دهند و می‌توانید محصولات را به راحتیِ مدل درون سازمانی روی آنها نصب و مدیریت کنید، استفاده از این امکانات منطقی‌ترین گزینه است.

اما از آنجایی که پیاده سازی مدل ابر بومی نیاز به تحقیق و آموزش زیادی دارد و مزایای آن بیشتر در آینده مشخص می‌شوند، بهتر است کاربرانی که مزایای این مدل برای آنها بیشتر است، از آن استفاده کنند مثل:

  • توسعه دهندگان نرم‌افزار که می‌توانند مزایای مدل ابر بومی را در اختیار مشتریانشان قرار دهند؛
  • شرکت‌های متوسط تا بزرگی که منابع مورد نیاز برای سرمایه گذاری اولیه را در اختیار دارند؛
  • ارائه دهندگان سرویس که برای آنها کاهش هزینه‌های نگهداری و مقیاس پذیری مهم‌ترین فاکتورهای تجاری هستند.

 

رویکرد ابر بومی – تغییر پلتفرم

تا اینجا درباره روش تغییر میزبان یا مجازی سازی یک ماشین فیزیکی و انتقال آن به بستر ابر – یا انتقال ماشین‌های مجازی درون سازمانی، به یک سرویس ابر – صحبت کردیم. در ادامه شیوه «ابر بومی کردن» با روش تغییر پلتفرم را مورد بررسی قرار می‌دهیم.

 

ایجاد یک محیط ایمیل سرور با داکر

ساده‌ترین روش برای رسیدن به یک ایمیج داکری بر اساس یک نرم‌افزار پکیج شده به روش سنتی (RPM, DEB) به شرح زیر است.

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

می‌توانید از سایر ارائه‌دهندگان نرم‌افزار مخزن استفاده کنید اما داکر در این زمینه پیشگام است و درصد بسیاری از سهم بازار را در اختیار دارد.

به عنوان پکیج استاندارد برای شروع این کار، از توزیع RPM استفاده شده اما این کار را با ابزاری که خودمان بیشتر از آن استفاده می‌کنیم انجام دادیم (یعنی دبیان/اوبونتو).

ایجاد ایمیج داکر کاملاً مشابه نصب یک پکیج روی یک سیستم‌عامل واقعی است. فرض شده که مخاطب با کلیات استفاده از خط فرمان آشنا بوده و داکر را نصب کرده است. همانطور که گفته شد هدف ما ارائه مثالی از به دست آوردن یک مخزن (container) از یک ایمیج CentOS است.

توجه: به تفاوت بین ایمیج و نمونه دقت داشته باشید (از اصطلاح «نمونه» برای این استفاده می‌کنیم تا آن را از خود مفهوم مخزن تفکیک کنیم).

نمونه (یا مخزن) معادل با یک ماشین است؛ هر نمونه یک آی‌پی دارد، می‌تواند فرمان‌ها را روی یک پوسته درون خودش اجرا کند و غیره. ایمیج، معادل پکیج است؛ همیشه می‌توانید از یک ایمیج برای ایجاد یک نمونه (یا مخزن) استفاده کنید.

 

  1. ایجاد یک نمونه داکر CentOS

ایجاد این نمونه داکر از ایمیج CentOS را شروع می‌کنیم:

ion@IN-MBP ~ % docker run -it centos:latest
[root@7294b716163d /]#

می‌توانیم از یک ترمینال دیگر، نمونه ایجاد شده را مشاهده کنیم:

ion@IN-MBP ~ % docker ps
CONTAINER ID  IMAGE          COMMAND      CREATED         STATUS         PORTS    NAMES
7294b716163d  centos:latest  “/bin/bash”  20 seconds ago  Up 20 seconds           zen_austin

همانطور که هر نمونه سیستم‌عامل معمولی را به روزرسانی می‌کنیم، حالا سیستم‌عامل را به روزرسانی می‌کنیم:

[root@7294b716163d /]# dnf -y update
Failed to set locale, defaulting to C.UTF-8
CentOS-8 – AppStream                                                                                                                                                                                            4.6 MB/s | 7.0 MB     00:01
CentOS-8 – Base                                                                                                                                                                                                 2.0 MB/s | 2.2 MB     00:01
CentOS-8 – Extras                                                                                                                                                                                               9.7 kB/s | 5.9 kB     00:00
Dependencies resolved.
================================================================================================================================================================================================================================================
Package                                                        Architecture                                   Version                                                                  Repository                                         Size
================================================================================================================================================================================================================================================
Upgrading:
audit-libs                                                     x86_64                                         3.0-0.13.20190507gitf58ec40.el8                                          BaseOS                                            116 k
binutils                                                       x86_64                                         2.30-58.el8_1.2                                                          BaseOS                                            5.7 M
centos-gpg-keys                                                noarch                                         8.1-1.1911.0.9.el8                                                       BaseOS                                             12 k
centos-release                                                 x86_64                                         8.1-1.1911.0.9.el8                                                       BaseOS                                             21 k
centos-repos                                                   x86_64                                         8.1-1.1911.0.9.el8                                                       BaseOS                                             13 k
coreutils-single                                               x86_64                                         8.30-6.el8_1.1                                                           BaseOS                                            630 k
glibc                                                          x86_64                                         2.28-72.el8_1.1                                                          BaseOS                                            3.7 M
glibc-common                                                   x86_64                                         2.28-72.el8_1.1                                                          BaseOS                                            836 k
glibc-minimal-langpack                                         x86_64                                         2.28-72.el8_1.1                                                          BaseOS                                             48 k
kexec-tools                                                    x86_64                                         2.0.19-12.el8_1.2                                                        BaseOS                                            482 k
libarchive                                                     x86_64                                         3.3.2-8.el8_1                                                            BaseOS                                            359 k
openldap                                                       x86_64                                         2.4.46-11.el8_1                                                          BaseOS                                            352 k
openssl-libs                                                   x86_64                                         1:1.1.1c-2.el8_1.1                                                       BaseOS                                            1.5 M
python3-rpm                                                    x86_64                                         4.14.2-26.el8_1                                                          BaseOS                                            156 k
rpm                                                            x86_64                                         4.14.2-26.el8_1                                                          BaseOS                                            539 k
rpm-build-libs                                                 x86_64                                         4.14.2-26.el8_1                                                          BaseOS                                            153 k
rpm-libs                                                       x86_64                                         4.14.2-26.el8_1                                                          BaseOS                                            336 k
sqlite-libs                                                    x86_64                                         3.26.0-4.el8_1                                                           BaseOS                                            579 k
systemd                                                        x86_64                                         239-18.el8_1.5                                                           BaseOS                                            3.5 M
systemd-libs                                                   x86_64                                         239-18.el8_1.5                                                           BaseOS                                            562 k
systemd-pam                                                    x86_64                                         239-18.el8_1.5                                                           BaseOS                                            232 k
systemd-udev                                                   x86_64                                         239-18.el8_1.5                                                           BaseOS                                            1.3 M
Installing dependencies:
xkeyboard-config                                               noarch                                         2.24-3.el8                                                               AppStream                                         828 k
kbd-legacy                                                     noarch                                         2.0.4-8.el8                                                              BaseOS                                            481 k
kbd-misc                                                       noarch                                         2.0.4-8.el8                                                              BaseOS                                            1.4 M
openssl                                                        x86_64                                         1:1.1.1c-2.el8_1.1                                                       BaseOS                                            686 k
Installing weak dependencies:
libxkbcommon                                                   x86_64                                         0.8.2-1.el8                                                              AppStream                                         116 k
diffutils                                                      x86_64                                         3.6-5.el8                                                                BaseOS                                            359 k
glibc-langpack-en                                              x86_64                                         2.28-72.el8_1.1                                                          BaseOS                                            818 k
kbd                                                            x86_64                                         2.0.4-8.el8                                                              BaseOS                                            392 k
openssl-pkcs11                                                 x86_64                                         0.4.8-2.el8                                                              BaseOS                                             64 k

Transaction Summary
================================================================================================================================================================================================================================================
Install   9 Packages
Upgrade  22 Packages
[………………………………]
Upgraded:
audit-libs-3.0-0.13.20190507gitf58ec40.el8.x86_64      binutils-2.30-58.el8_1.2.x86_64         centos-gpg-keys-8.1-1.1911.0.9.el8.noarch      centos-release-8.1-1.1911.0.9.el8.x86_64           centos-repos-8.1-1.1911.0.9.el8.x86_64
coreutils-single-8.30-6.el8_1.1.x86_64                 glibc-2.28-72.el8_1.1.x86_64            glibc-common-2.28-72.el8_1.1.x86_64            glibc-minimal-langpack-2.28-72.el8_1.1.x86_64      kexec-tools-2.0.19-12.el8_1.2.x86_64
libarchive-3.3.2-8.el8_1.x86_64                        openldap-2.4.46-11.el8_1.x86_64         openssl-libs-1:1.1.1c-2.el8_1.1.x86_64         python3-rpm-4.14.2-26.el8_1.x86_64                 rpm-4.14.2-26.el8_1.x86_64
rpm-build-libs-4.14.2-26.el8_1.x86_64                  rpm-libs-4.14.2-26.el8_1.x86_64         sqlite-libs-3.26.0-4.el8_1.x86_64              systemd-239-18.el8_1.5.x86_64                      systemd-libs-239-18.el8_1.5.x86_64
systemd-pam-239-18.el8_1.5.x86_64                      systemd-udev-239-18.el8_1.5.x86_64

Installed:
libxkbcommon-0.8.2-1.el8.x86_64  diffutils-3.6-5.el8.x86_64         glibc-langpack-en-2.28-72.el8_1.1.x86_64  kbd-2.0.4-8.el8.x86_64  openssl-pkcs11-0.4.8-2.el8.x86_64  xkeyboard-config-2.24-3.el8.noarch  kbd-legacy-2.0.4-8.el8.noarch
kbd-misc-2.0.4-8.el8.noarch      openssl-1:1.1.1c-2.el8_1.1.x86_64

Complete!

حالا سیستم‌عامل به روز شد.

 

  1. نصب Axigen در نمونه مخزن

اول RPM را دریافت می‌کنیم:

ion@IN-MBP ~ % docker exec -it 7294b716163d bash
[root@7294b716163d app]# curl -O https://www.axigen.com/usr/files/axigen-10.3.1/axigen-10.3.1.x86_64.rpm.run
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100  386M  100  386M    0     0   9.7M      0  0:00:39  0:00:39 –:–:–  9.8M

سپس آن را نصب می‌کنیم:

root@7294b716163d /]# ./axigen-10.3.1.x86_64.rpm.run
Please accept the terms of the license before continuing
Press ENTER to display the license
(after reading it press ‘q’ to exit viewer)
q

Do you accept the terms of the license? (yes/no): y

======================================
RPM Package for x86_64 Installer for AXIGEN Mail Server 10.3.1-1
======================================

Detecting OS flavor… CentOS 8.1

Installer started

Axigen embedded archive extracted successfully
Please select one of the options displayed below:
==== Main options
1. Install axigen-10.3.1-1
9. Exit installer
0. Exit installer without deleting temporary directory
===== Documentation for axigen-10.3.1-1
4. Show the RELEASE NOTES
5. Show the README file
6. Show other licenses included in the package
7. Show manual install instructions
8. Show manual uninstall instructions
Your choice: 1
Verifying…                          ################################# [100%]
Preparing…                          ################################# [100%]
Updating / installing…
1:axigen-10.3.1-1                  ################################# [100%]

Thank you for installing AXIGEN Mail Server.
In order to configure AXIGEN for the first time, please connect
to WebAdmin by using one of the URLs below:
https://172.17.0.2:9443/
https://[2a02:2f0b:a20c:a500:0:242:ac11:2]:9443/
Starting AXIGEN Mail Server…Axigen[336]: INFO: Starting Axigen Mail Server version 10.3.1.5 (Linux/x64)
Axigen[336]: SUCCESS: supervise ready… (respawns per minute: 3)
Axigen[336]: INFO: supervise: spawning a new process to execute Axigen Mail Server version 10.3.1.5 (Linux/x64)
[ OK ]
Installer finished.

حالا Axigen را در مخزن نصب کردیم و حتی اجرای آن شروع شده است (نصب کننده، آن را به صورت خودکار اجرا می‌کند)»

[root@7294b716163d /]# ps ax | grep axigen
336 ?        Ss     0:00 /opt/axigen/bin/axigen –max-respawns 3 -W /var/opt/axigen
337 ?        SNl    0:01 /opt/axigen/bin/axigen –max-respawns 3 -W /var/opt/axigen
351 ?        Sl     0:00 axigen-tnef
375 pts/0    S+     0:00 grep –color=auto axigen

امتحان می‌کنیم که وقتی پوسته را ترک کنیم، چه می‌شود:

[root@7294b716163d /]# exit
exit
ion@IN-MBP ~ %

آیا نمونه ما همچنان در حال اجرا است؟

ion@IN-MBP ~ % docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ion@IN-MBP ~ %

خیر، به دلیل اینکه ایمیج CentOS bash را به عنوان پردازش اصلی مخزن اجرا می‌کند؛ زمانی که از bash خارج شویم، اجرای مخزن هم متوقف می‌شود.

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

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

این یکی از تفاوت‌های مهم بین مخزن و یک میزبان لینوکس سنتی است – هیچ دیمنی (daemon) وجود ندارد – به عبارت دیگر، نیازی به انشعاب در پس زمینه وجود ندارد (به این دلیل که معمولاً برای نرم‌افزارهایی که به سبک SystemV – و همچنین Systemd – شروع می‌شوند، اسکریپت‌های init هم کار می‌کند).

می‌توانیم هنگام ایجاد ایمیج Axigen از این نکته استفاده کنیم. باز هم کار را با مخزن شروع می‌کنیم:

ion@IN-MBP ~ % docker start 7294b716163d
7294b716163d

و بررسی می‌کنیم که آیا در حال اجرا است:

ion@IN-MBP ~ % docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7294b716163d        centos:latest       “/bin/bash”         13 minutes ago      Up 41 seconds                           zen_austin

به آن متصل شده و بررسی می‌کنیم که آیا Axigen همچنان در حال اجرا است:

ion@IN-MBP ~ % docker attach 7294b716163d
[root@7294b716163d /]# ps ax
PID TTY      STAT   TIME COMMAND
1 pts/0    Ss     0:00 /bin/bash
14 pts/0    R+     0:00 ps ax

 

اینطور نیست و نباید از این موضوع تعجب کرد: پردازش Axigen (و همه پردازش‌های فرعی منشعب شده از آن و ریسمان‌های شروع شده توسط آن) به همراه bash اصلی (پدربزرگ همه) متوقف می‌شوند.

در هر صورت، همچنان Axigen نصب شده است:

[root@7294b716163d /]# ls -la /var/opt/axigen/
total 288
drwxr-xr-x 16 axigen axigen   4096 May 25 15:07 .
drwxr-xr-x  1 root   root     4096 May 25 15:07 ..
-rw-r—–  1 axigen axigen   2969 May 25 15:07 axigen_cert.pem
-rw-r—–  1 axigen axigen    245 May 25 15:07 axigen_dh.pem
drwxr-xr-x  2 axigen axigen   4096 May 25 15:07 aximigrator
-rw——-  1 axigen axigen 215556 Feb  7 12:57 cacert_default.pem
drwxr-x–x  2 axigen axigen   4096 May 25 15:07 cyren
drwx–x—  2 axigen axigen   4096 May 25 15:07 filters
drwx–x—  3 axigen axigen   4096 May 25 15:07 kas
drwx–x—  4 axigen axigen   4096 May 25 15:07 kav
drwx——  2 axigen axigen   4096 May 25 15:07 letsencrypt
drwxr-x—  2 axigen axigen   4096 May 25 15:07 log
-rw——-  1 axigen axigen    121 Feb  7 12:57 mobile_ua.cfg
drwxr-x— 67 axigen axigen   4096 May 25 15:07 queue
drwxr-x—  2 axigen axigen   4096 May 25 15:07 reporting
drwxr-x—  2 axigen axigen   4096 May 25 15:07 run
drwxr-x—  2 axigen axigen   4096 May 25 15:07 serverData
drwx–x—  5 axigen axigen   4096 May 25 15:07 templates
drwx–x—  8 axigen axigen   4096 May 25 15:07 webadmin
drwx–x—  3 axigen axigen   4096 May 25 15:07 webmail
[root@7294b716163d /]# ls -la /opt/axigen/bin/
total 135028
drwxr-x–x 2 root root     4096 May 25 15:07 .
drwxr-x–x 5 root root     4096 May 25 15:07 ..
-rwxr-xr-x 1 root root 81771736 Feb  7 12:57 axigen
-rwxr-xr-x 1 root root 12824731 Feb  7 12:57 axigen-migrator
-rwxr-xr-x 1 root root 11838532 Feb  7 12:57 axigen-tnef
-rwxr-xr-x 1 root root  1049336 Feb  7 12:57 cyren.bin
-rwxr-xr-x 1 root root   205632 Feb  7 12:58 kasserver
-rwxr-xr-x 1 root root   180992 Feb  7 12:58 kavserver
-rwxr-xr-x 1 root root   663136 Feb  7 12:57 mqview
-rwxr-xr-x 1 root root 29704280 Feb  7 12:57 sendmail

حالا Axigen نصب شده اما هدف ما، ایمیج بود نه مخزن.

 

  1. ایجاد ایمیج از یک مخزن

با خروج از پوسته، مخزن را متوقف می‌کنیم:

[root@7294b716163d /]# exit
ion@IN-MBP ~ % docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ion@IN-MBP ~ %

و بعد از جادوی داکر استفاده می‌کنیم!

 

ion@IN-MBP ~ % docker commit 7294b716163d my_new_and_shiny_axigen_image
sha256:e7ca09e1933bff546d7acbd7090543e2a4f886ee3aa60b7cbf04eefd70fcbe3b

ما از روی مخزن فعلی یک ایمیج جدید (my_new_and_shiny_axigen_image) ایجاد کردیم و حالا می‌توانیم از آن برای ایجاد یک مخزن دیگر استفاده کنیم که به روزرسانی‌های سیستم عامل به آن اعمال شده و Axigen در آن نصب شده است:

ion@IN-MBP ~ % docker run -it my_new_and_shiny_axigen_image
[root@479421167f8d /]# dnf update
Last metadata expiration check: 1:01:28 ago on Mon 25 May 2020 03:03:43 PM UTC.
Dependencies resolved.
Nothing to do.
Complete!
[root@479421167f8d /]# rpm -qa | grep axigen
axigen-10.3.1-1.x86_64

هنوز باید مخزن را پیکربندی کنیم تا باینری Axigen هنگام نمونه سازی شروع به کار کند. ایمیج ایجاد شده، نقطه ورود ایمیج CentOS را که bash است، به ارث برده و می‌توانیم آن را شروع کنیم:

[root@479421167f8d /]# /etc/init.d/axigen start
Starting AXIGEN Mail Server…Axigen[29]: INFO: Starting Axigen Mail Server version 10.3.1.5 (Linux/x64)
Axigen[29]: SUCCESS: supervise ready… (respawns per minute: 3)
Axigen[29]: INFO: supervise: spawning a new process to execute Axigen Mail Server version 10.3.1.5 (Linux/x64)
[ OK ]
[root@479421167f8d /]#
[root@479421167f8d /]# ps ax | grep axigen
29 ?        Ss     0:00 /opt/axigen/bin/axigen –max-respawns 3 -W /var/opt/axigen
30 ?        Sl     0:00 /opt/axigen/bin/axigen –max-respawns 3 -W /var/opt/axigen
42 ?        Sl     0:00 axigen-tnef
66 pts/0    S+     0:00 grep –color=auto axigen

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

 

  1. تنظیم نقطه ورود در مخزن

برای انجام این کار، باید دوباره به مرحله ایجاد ایمیج برگردیم:

ion@IN-MBP ~ % docker commit -c ‘CMD [“/opt/axigen/bin/axigen”, “–foreground”]’ 7294b716163d my_2nd_new_and_shiny_axigen_image
sha256:ef7ce0fd9a47acb4703e262c4eb64c3564a54866b125413c17a63c1f832d1443
ion@IN-MBP ~ %

در پیکربندی ایمیج، نام فرمان و آرگومان‌هایی که هنگام شروع مخزن اجرا می‌شوند را اضافه می‌کنیم:

/opt/axigen/bin/axigen –foreground

دقت داشته باشید که نباید پردازش اصلی مخزن در پس زمینه منشعب شود؛ این پردازش باید به اجرا ادامه دهد در غیر اینصورت مخزن متوقف می‌شود. به همین دلیل باید از آرگومان –foreground استفاده کنیم.

مثل Axigen، بیشتر سرورهای لینوکس یک آرگومان مخصوص دارند که به آنها دستور می‌دهد به جای انشعاب در پس زمینه، در پیش زمینه اجرا شوند.

 

  1. اجرای ایمیج ساخته شده

ایمیج به روزرسانی شده را بررسی می‌کنیم:

ion@IN-MBP ~ % docker run -dt my_2nd_new_and_shiny_axigen_image
fd1b608174c402787152f5934294f370dfdb4d9b0f0b25e4edf4725dbe4c5700
ion@IN-MBP ~ %

ما پارامتر -it برای docker run را به -dt تغییر دادیم؛ بدون پرداختن به جزئیات بیشتر، کافیست در جریان باشید که این پارامتر به داکر دستور می‌دهد که از پردازش جدا شود. Axigen پردازش اصلی است در نتیجه استفاده از حالت تعاملی در اینجا به اندازه زمان استفاده از پوسته bash منطقی نیست.
با داکر می‌توانیم یک پردازش دیگر (نه پردازش اصلی بلکه پردازش ثانویه) را با استفاده از exec اجرا کنیم. ما یک bash را در حالت تعاملی اجرا می‌کنیم تا بتوانیم آنچه در مخزن رخ می‌دهد را بررسی کنیم.

ion@IN-MBP ~ % docker exec -it fd1b608174c4 bash
[root@fd1b608174c4 /]# ps ax
PID TTY      STAT   TIME COMMAND
1 pts/0    Ss+    0:00 /opt/axigen/bin/axigen –foreground
7 pts/0    SNl+   0:00 /opt/axigen/bin/axigen –foreground
19 pts/0    Sl+    0:00 axigen-tnef
39 pts/1    Ss     0:00 bash
54 pts/1    R+     0:00 ps ax

حالا Axigen در حال اجرا است اما آیا رابط کاربری وب ادمین (پورت 9000) هم در حال اجرا است؟

[root@fd1b608174c4 /]# telnet localhost 9000
Trying ::1…
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
GET / HTTP/1.1
Host: localhost

HTTP/1.1 303 Moved Temporarily
Server: Axigen-Webadmin
Location: /install
Connection: Close

همینطور است و ما به جریان تنظیم اولیه (/install) هدایت می‌شویم.

آیا پورت وب ادمین 9000 از خارج از مخزن هم در دسترس است؟

ion@IN-MBP ~ % telnet localhost 9000
Trying ::1…
Connection failed: Connection refused
Trying 127.0.0.1…
telnet: Unable to connect to remote host: Connection refused

باید هنگام نصب به مخزن اعلام کنیم که پورت 9000 را به میزبان نگاشت کند تا امکان دسترسی به آن از بیرون فراهم شود.

ion@IN-MBP ~ % docker run -dt -p 9000:9000 my_2nd_new_and_shiny_axigen_image
1dcc95e912bafc97ba63484abfeb7e2d1983d524b8834a5ccc62928796259818
ion@IN-MBP ~ %

به پارامتر -p 9000:9000 توجه کنید. این پارامتر به داکر اعلام می‌کند که پورت 9000 مخزن را در میزبان هم با همین شماره در دسترس قرار دهد و حالا…

ion@IN-MBP ~ % telnet localhost 9000
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
GET / HTTP/1.1
Host: localhost

HTTP/1.1 303 Moved Temporarily
Server: Axigen-Webadmin
Location: /install
Connection: Close

جمع‌بندی

RPM / DEB

این آزمایش کوچک چه درس‌هایی به ما داد؟

  1. تبدیل یک پکیج RPM / DEB موجود به یک ایمیج مخزن کار راحتی است:
  • مخزن را با سیستم‌عامل دلخواهتان که پکیج نرم‌افزاری هدف را برای آن دارید، تنظیم کنید؛
  • از طریق مخزن، نرم‌افزار را نصب کنید (و در صورت تمایل، پیکربندی‌های دلخواه را انجام دهید)؛
  • مخزن را متوقف کرده و آن را به یک ایمیج تبدیل کنید و حتماً نقاط ورود مناسب را برای آن تنظیم کنید (CMD)؛
  • مخازن دلخواه را با استفاده از ایمیج جدید ایجاد کنید؛
  • ایمیج را منتشر کنید و در صورت نیاز در اختیار دیگران هم قرار دهید.
  1. ایمیج ایجاد شده برای مقاصد تولیدی آماده نیست و برای آماده کردن آن باید این کارها را انجام دهید:
  • محل ذخیره پایدار را پیاده‌سازی کنید (ما از یک سرویس ایمیل استفاده می‌کنیم که پیام‌ها را ذخیره می‌کند در نتیجه بعضی از اطلاعات باید پایدار باشند)؛
  • تعاریف لازم برای ارتباطات شبکه را ایجاد کنید:
    • در حالت پیش فرض داکر از طریق NAT به پردازش‌ها امکان می‌دهد که با بیرون در تماس باشند (ارتباط را شروع کنند)؛
    • اما باید بتوانیم ارتباطات ورودی (دسترسی‌های کلاینت، مسیریابی ایمیل‌ها) را روی پورت‌های خاصی دریافت کنیم؛
  • گزینه‌های لازم برای تنظیم اولیه Axigen هنگام شروع به کار را مشخص کنید (ممکن است بخواهیم آن را با استفاده از یک مجوز خاص نصب کنیم).

حالا که ایمیج اصلی آماده شد، باید به مشکلاتی که قبلاً ذکر شد بپردازیم و ایجاد ایمیج را اتوماسیون کنیم (وقتی یک نسخه جدید از ایمیج CentOS یا یک پکیج Axigen جدید موجود باشد، چه می‌شود؟).

این موضوعات فراتر از حوزه این مقاله هستند اما نکات زیر می‌توانند مفید باشند:

  • به جای نمونه‌سازی پایه و سپس نصب دستی نرم‌افزار Axigen، از Dockerfile برای ساختن ایمیج استفاده کنید؛
  • در Dockerfile، دستورالعمل‌های CMD، ENV، EXPOSE و VOLUME لازم را تعریف کرده و نگاشت کنید.
  • برای به اشتراک گذاشتن ایمیج با دیگران از طریق یک رجیستری داکر (مخزن ایمیج) خصوصی یا عمومی از دستورالعمل‌های push / pull داکر استفاده کنید.

حالا که یک نسخه مخزنی از پکیج Axigen خودمان ایجاد کردیم، یک پکیج جدید از نرم‌افزار داریم که امکان نصب آن در محیط ابر وجود دارد.

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

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

اگر قصد نصب یک ایمیل سرور Axigen کلاسترسازی شده روی پلتفرم‌های کوبرنتیز را دارید، می‌توانید از Axigen Helm ما استفاده کنید که مثل ایمیل داکر Axigen برای استفاده‌های واقعی طراحی و آماده شده است.

 

 

[1] در مقیاس‌پذیری افقی می‌توانید منابع را افزایش یا کاهش دهید.

[2] مدیران و کاربران سیستم با استفاده از ابزار RPM می‌توانند بسته‌های نرم‌افزاری را در لینوکس و یونیکس نصب و مدیریت کنند.

[3] کاربران داکر می‌توانند ایمیج‌های کانتینر را در داکر هاب ایجاد و مدیریت کنند.

[4] داکر کانتینر ایمیج (Docker Container Image) یک بسته نرم‌افزاری قابل اجرا است و کلیه مواردی که برای اجرای یک برنامه لازم است را در بر می‌گیرد.

 

 

منبع: axigen

نوشته های مرتبط
یک پاسخ بنویسید

نشانی ایمیل شما منتشر نخواهد شد.فیلد های مورد نیاز علامت گذاری شده اند *