Docker port mapping və Container Link nədir, phpMyadmin və MySql containerləri bir birinə bağlamaq. Docker volume mapping nədir?
Salam
Bu məqalədə containerlər haqqında biraz geniş mövzuda danışacağıq. Container nədir , nə üçün istifadə olunur, necə qurulur kimi məqalələr kifayət qədər internetdə mövcuddur. Bu məqalədə isə biz docker containerlərdə port mapping, volume mapping haqqında danışacağıq və sonda phpMyadmin və MySql containerləri qurub onları bir birinə linkləyəcəyik.
İlk əvvəl port mapping haqqında danışaq.
Port mapping nədir?
Port mapping , bizim docker host üzərində olan containerimizə kənardan bağlanacağımız portdur. Daha ətraflı deyək. Şəkildən göründüyü kimi bizim bir docker hostumuz var və üzərində 2 ədəd container çalışır. Bu containerlər default olaraq öz portları ilə işləyir. Lakin biz kənardan qoşulmaq üçün istədiyimiz şəkildə çöl portumuzu customize edə bilərik. Məsələn deyəlim ki apache –ın default portu 80-dir lakin biz kənardan ona 8080 portuna map edirik. Və artıq bizim apache serverimiz 8080 portu ilə çalışacaq.
2ci containerimizdə isə MySQL server default olaraq 3306 portu ilə çalışmasına baxmayaraq biz onu 6603 portuna map edərək bu port ilə onu çalışdıracağıq. Nümunələrdə bu daha yaxşı anlaışılacaq.
Öncə apache üçün container-i docker hub üzərindən çəkək.
# Docker pull httpd – əmrini verərək containeri öz hostumuza çəkirik.
#docker images – bu komanda ilə çəkdiyimiz image-i yoxlayırıq
Gördüyünüz kimi çəkdiyimiz image artıq hostumuzun üzərindədir.
İndi isə çəkdiyimiz image ilə yeni bir container yaradaq və port mapping edərək qoşulmaq istədiyimiz portu qeyd edək
Bu komanda ilə əmr veririk ki webserver adında bir container yarat , -p ilə port mapping edirik və bildiririk ki 9999 portunu 80 portuna map elə, -d ilə isə detach modda çalışdırmasıni bildiririk.
-d ilə verdiyimiz əmrlər zamanı containerin içində gedən prosedurları,logları görə bilmirik. Yəni container backgrounda işləyir. Lakin biz –d (detach) flag-I əlavə etməzsək container foreground modda işləyəcək və terminalı tutacaq.
Gördüyünüz kimi container-miz detach modda qalxdı.
#docker ps – əmri ilə aktiv containerimizə baxa bilərik.
Gördüyünüz kimi 9999 portu 80 portuna map olmuş vəziyyətdədir. İndi isə kompyuterimizin browser-i üzərində web serverimizin çalışıb çalışmadığına baxaq.
Göründüyü kimi containerimiz 9999 portu ilə işləyir. Port mapping proseduru bəzi hallarda default port ilə eyni map edilir. Məsələn httpd servisi 80 portu ilə işləyirsə -p 80:80 tipli mapping edirik.
# docker run –name webserver -p 80:80 -d httpd
Bu şəkildə mapping edən zaman browserimizdə port nömrəsi yazmamıza gərək qalmır. Çünki standart olaraq brouzerlərimiz 443 (https) və 80 (http) portu ilə işləyir.
Əgər bu şəkildə xəta almış olsanız aşağıdakıları yoxlayın. 80 ci port httpd vəya nginx və yaxud hər hansı servis tərəfindən məşğul olmuş ola bilər.
Port mapping haqqında bildik indi isə container link və volume mapping haqqında danışacağıq və yekunda ikisini birlikdə tətbiq edəcəyik
Container Link nədir?
Container link 2 container-i bir birinə bağlayaraq onların ortaq işləməsini təmin edən bir prosesdir.
Məsələn mövzumuzdan da bəlli olduğu kimi , deyəlim ki bir baza containerimiz mövcuddur (MySQL) və onu idarə etmək üçün phpmyadmin və yaxud da digər bir alətimiz (tool) var. Biz idarəetmə alətimiz vasitəsi ilə (PhpMyadmin) mövcud bazamıza qoşulmaq və onu idarə etməmiz üçün bu 2 containeri bir-birinə link etməmiz lazım olacaq. Yəni bu 2 containeri bir birinə bağlamalı olacağıq.
İndi isə praktik olaraq 2 containeri docker host üzərində necə linkləmək olar ona baxaq.
İlk öncə Mysql və PhpMyadmin containerlərini tək tək yaratmağı öyrənək ondan sonra isə hər ikisini stop edib ikisini bir birinə Link edərək yaradaq. Nümunələrdə daha aydın başa düşüləcək.
1 ci addımda yuxarıdakı qaydada bir mysql bazanı docker hub üzərindən çəkirik
# docker pull mysql
Docker images deyərək yoxlayaq
# docker images
Budur artıq image burdadır bayaqkı httpd image –miz də buradadır.
İndi isə bu image vasitəsi ilə aşağıdakı əmri verərək bir mysql container yaradaq və bazaya giriş üçün root password təyin edək.
# docker run –name yenibaza -p 3306:3306 -e MYSQL_ROOT_PASSWORD=elbey123 -d mysql
Budur, 1 komanda ilə yenibaza adlı MySQL containerimiz yaratdıq və istifadə edə bilərik.
Burda əlavə etdiyimiz –e flag isə mysql root password əlavə etməmiz üçün istifadə olundu. Yəni artıq bazamız üçün şifrə təyinini buradan edirik. Sonra qoşulmaq üçün bu şifrədən istifadə edəcəyik.
-d detach mode (containerin arxa fonda çalışması üçün)
-e Root password girişi üçün flag
–name container üçün ad təyini
-p port mapping
Bazaya qoşulmağı test edək. Mysql bazamıza qoşulmaq üçün az öncə qeyd etdiyimiz root parolu buraya yazırıq.
Username: root
Password: elbey123
Budur bazaya qosula bilirik.
İndi isə phpMyadmin container yaradaq və az öncə yaratdığımız mysql containerimizə linkləyək.
#docker pull phpmyadmin
Bir daha docker images deyərək yeni yüklənən image –mizi yoxlayaq
#docker images
Bu image-miz ilə yeni container yaradaq və mysql containerimiz-ə bağlayaq.
# docker run –name phpmy -p 8080:80 –link mysql:db -d phpmyadmin
Burada bildiririk ki phpmy adlı container yarat, 8080portu ilə işləsin və mysql adlı containerimizə link olunsun. Yəni bu container yaranarkən mysql adlı başqa bir containerə bağlı çalış.
Burdakı name ilə image arasındakı fərqi səhv salmayaq. –name flag-i ilə istənilən adı containerimizə verə bilərik.
mysql:db qismi odur ki mysql containerinin içində db aliası-na qoşul. Bu containerlərdən asılı olaraq dəyişiklik göstərə bilər.
Docker hub üzərindən də buna baxa bilərsiniz.
https://hub.docker.com/_/phpmyadmin
Artıq hər şey hazırdır və test edə bilərik. Browser üzərindən phpmyadmin-ə qoşulaq və bazamıza bağlanmağa calışaq
Root və password az öncə mysql containerimiz üzərində qeyd etdiyimiz şifrədir.
Username: root
Password: elbey123
Yazıb daxil oluruq
Və budur artıq containerimiz mysql baza containerimizə qoşulu halda işlədi.
Lakin əgər biz bu containerimiz üçün volume mapping etməzsək etdiyimiz dəyişikliklərin hamısı container stop olduğu anda tamamən itəcək. Bəs nədir volume mapping buna baxaq.
Volume mapping nədir?
Biz bir komanda run edərək saniyələr içində bir neçə container işə sala bilərik. Lakin containerlər docker host üzərində stateless olaraq işləyir. Yəni containeri bir dəfə sildikdə o heç bir məlumatı öz içərisində saxlamır və tamamən üzərindəki dataları itirir. Bu isə dövrümüz üçün heç də gərək duyulan hal deyil.
Bunun üçün volume mapping istifadə edilir. Volume mapping nədir? Docker-də qaldırılan konteynerlər qurulan volume-lar ilə əlaqələndirilir və məlumatlarını saxlayır. Beləliklə, container silinsə belə, volume-lar qalmaqda davam edir. Bunun sayəsində yeni yaradılan containerləri də həmin volume-larla əlqələndirib mövcud məlumatları saxlaya bilirik.
Volume mapping necə edilir?
Deyəlim ki bir mysql container yaradırıq və içinə bazaları əlavə edirik. Əgər biz volume mapping etməzsək, container dayandığı vəya silindiyi anda bütün bazalarımız itəcək. Lakin biz volume mapping etdiyimiz zaman containerlərimiz silinsə vəya dayansa belə, əlaqələndirdiyimiz volume-larda məlumat saxlanılacaq və yeni container yaradıb həmin volume-a bağlayıb işimizi davam edəcəyik.
Bunu aşağıdakı nümunələrdə izah edək. Deyəlim ki volume mapping etməmişik və mövcud phpMyadmin containerimiz üzərində baza yaradaq.
Sonra icində bir table yaradaq
Ardınca da table-ləri dolduraq test məqsədli
Gördüyünüz kimi bazamız və tabel-larımız artıq yarandı
Az öncə dediyim kimi containerlər docker host üzərində stateless olaraq işləyir. Yəni hal hazırda biz bu containerlərimizi silsək , yaratdığımız table və bazaları itirəcəyik. Və bir daha geri döndərməyimiz mümkün olmayacaq. Test üçün yoxlayaq.
Containerlərimizi silib yenidən yaradaq və yoxlayaq ki, mövcud bazalarımız qalıbmı
Az öncə verdiyimiz komandalar ilə yenidən eyni containerləri qururuq.
Yenidən mysql bazaya qoşulaq və baxaq ki bayaq qurduğumuz bazalar qalıbmı.
Gördüyümüz kimi heç bir məlumat saxlanılmayıb. Belə məqamlarda bizə Docker volume-dan istifadə etmək lazım olur.
İndi bir containerə necə volume əlavə etmək olar ona baxaq.
Volume yaratmaq üçün bir directory təyin edirik. Sonra isə container yaradan zaman bu directory həmin container-ə map edəcəyik.
# mkdir /my/custom –p – əmri verib yeni bir directory əlavə edirik.
Containerləri silək indi isə volume mapping edərək nümunələrə baxaq.
Sadəcə bir sətir əlavə edirik
-v /my/custom/:/var/lib/mysql
Yaratdığımız volume directory mysql-in default folderinə map edirik. Bu qədər.
İndi isə quraq praktik baxaq. Containerlərimizi start edək.
# docker run –name yenibaza -p 3306:3306 -v /my/custom/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=elbey123 -d mysql
# docker run –name phpmy -p 8080:80 –link yenibaza:db -d phpmyadmin
Indi isə artıq containerlərimizin silinməsindən qorxmaya bilərik. Volume mapping ilə silinən istənilən containerimizi yenidən eyni volume-a map edərək məlumat itkisi olmadan istifadə edə bilərik.
Aşağıda yenidən bazalar yaradaraq test edək. Bu dəfə yaratdığımız bazalar containerlərimizi silib yenidən yaratdıqda itməyəcək. Çünki –v ilə icra etdiyimiz volume-da saxlanılacaq.
Test_son adlı baza qurduq.
Yoxlamaq üçün containerləri silib yenidən yeni bir container əlavə edək başqa bir adla.
Bütün containerlərimizi sildik. İndi isə yenidən eyni əmr ilə işə salaq containerlərimizi. Artıq bayaqkı containerlərimizi sildiyimiz üçün bu yeni bir container olacaq.
# docker run –name mysql -p 3306:3306 -v /my/custom/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=elbey123 -d mysql
# docker run –name phpmy -p 8080:80 –link mysql:db -d phpmyadmin
Yenidən PhpMyadmin panelə daxil olaq və məlumat itkisinin olub olmadığını yoxlayaq.
Və budur heç bir məlumat itkisi olmamışdır. Test_son adlı bazamız yerindədədir. Bu şəkildə volume mapping edərək containerlərimizi işə sala bilərik.
Qısa məzmun.
- Öncə mysql adlı image docker hub üzərindən çəkdik.
# docker pull mysql
- Sonra phpmyadmin adlı image docker hub üzərindən çəkdik
# docker pull phpmyadmin
- Yüklədiyimiz image ilə volume mapping, port mapping birlikdə edərək mysql baza qurduq.
# docker run –name mysql -p 3306:3306 -v /my/custom/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=elbey123 -d mysql
- PhpMyadmin containerimizi 3cü bənddə qurduğumuz mysql bazaya link etdik.
# docker run –name phpmy -p 8080:80 –link mysql:db -d phpmyadmin