JavaRush /Java Blogu /Random-AZ /Docker ilə ilk tanışlıq
Viacheslav
Səviyyə

Docker ilə ilk tanışlıq

Qrupda dərc edilmişdir
Konteynerləşdirmə praktikada tez-tez istifadə olunan mexanizmdir. Məsələn, headhunter-də axtarış etdiyiniz zaman Docker-dən bəhs edən 477 vakansiya tapa bilərsiniz. Buna görə də, bunun nə olduğu ilə tanış olmaq pis fikir olmaz. Ümid edirəm ki, bu qısa baxış ilk təəssürat yaratmağa kömək edəcək. Yaxşı, o, bunu Udemy-də kurslar kimi əlavə materiallarla dəstəkləyəcək. Docker-ə ilk giriş - 1

Giriş

Bu qısa icmalda konteynerləşdirmə kimi bir mövzuya toxunmaq istərdim. Və konteynerləşdirmənin əslində nə olduğunu başa düşməklə başlamaq lazımdır. Vikipediyaya görə, " Konteynerləşdirmə " əməliyyat sistemi səviyyəsində virtuallaşdırmadır (yəni hardware DEYİL ) və burada əməliyyat sisteminin nüvəsi yalnız bir əvəzinə çoxlu təcrid olunmuş istifadəçi məkanı nümunələrini saxlayır. " İstifadəçi sahəsi " istifadəçi proqramları üçün ayrılmış əməliyyat sisteminin virtual yaddaş ünvan sahəsidir. İstifadəçi məkan nümunələri (ümumiyyətlə konteynerlər adlanır) istifadəçi baxımından bir əməliyyat sistemi nümunəsi ilə tamamilə eynidir. Kernel konteynerin tam izolyasiyasını təmin edir, buna görə də müxtəlif konteynerlərdən olan proqramlar bir-birinə təsir edə bilməz. Belə çıxır ki, konteynerləşdirmə proqram təminatının virtuallaşdırılmasıdır, yəni əməliyyat sistemi səviyyəsində virtuallaşdırmadır, bunun üçün əməliyyat sisteminin nüvəsi cavabdehdir. Bu yanaşmanın xarakterik xüsusiyyətlərindən biri ondan ibarətdir ki, bütün konteynerlər ana əməliyyat sistemi (yəni konteynerlərin yerləşdiyi sistem) ilə eyni olan ümumi nüvədən istifadə edir. Bu, virtual avadanlığı təqlid etmək və əməliyyat sisteminin tam hüquqlu nümunəsini işə salmaqdan qurtulmağa imkan verir. Bunun "yüngül" virtualizasiya olduğunu söyləyə bilərik. Kernel, proqramların prosessor vaxtı, yaddaş, xarici aparat və xarici giriş və çıxış cihazları kimi kompüter resurslarına koordinasiyalı çıxışı təmin edən ƏS-nin mərkəzi hissəsidir. Nüvə həmçinin adətən fayl sistemi və şəbəkə protokolu xidmətlərini təmin edir. Ümumiyyətlə, bu, bütün sistemin ürəyidir. Əlavə məlumat üçün " Konteynerlər haqqında ümumi məlumat " materialını nəzərdən keçirmək faydalı ola bilər . Və girişi tamamlamaq üçün daha bir neçə söz. İndi bir əməliyyat sisteminin nüvəsi olduğunu başa düşdük. O, istifadəçi məkanı nümunələri üçün izolyasiya təmin edir. Bu kontekstdə " qruplar " termininə rast gələ bilərsiniz. Bu, buna nail olmağa imkan verən Linux nüvə mexanizminin adıdır. Ona görə də deyə bilərik ki, konteynerləşmə yolu Linux sistemlərindən başlayıb. Bununla belə, Windows 10-dan başlayaraq konteynerləşdirmə dəstəyi də ortaya çıxdı. Virtuallaşdırma ilə işləmək üçün kompüterinizin BIOS-da virtuallaşdırma dəstəyini konfiqurasiya etməlisiniz. Bunu necə etmək kompüterdən asılıdır. Məsələn, bu belə görünə bilər:
Docker-ə ilk giriş - 2
Windows-da bunu müxtəlif yollarla yoxlaya bilərsiniz. Məsələn, Microsoft veb saytından xüsusi bir yardım proqramı yükləyə bilərsiniz: Hardware-Assisted Virtualization Detection Tool . Yaxşı, başqa bir vacib konsepsiyanı - Hipervizoru qeyd etməyə dəyər. Hypervisor virtual maşın monitoru, eyni kompüterdə bir neçə əməliyyat sisteminin paralel icrasını təmin edən proqramdır. Hipervisor əməliyyat sistemlərinin bir-birindən təcrid olunmasını təmin edir və resursları işləyən ƏS-lər arasında bölüşdürür. Belə hipervizorlardan biri Oracle VirtualBox-dur .
Docker-ə ilk giriş - 3

Doker

Beləliklə, virtuallaşdırmanın nə olduğu aydındır. Amma necə istifadə etmək olar? Və burada Docker köməyimizə gəlir. Docker, konteynerləşdirilmiş mühitlərdə tətbiqlərin yerləşdirilməsi və idarə edilməsini avtomatlaşdırmaq üçün proqramdır. Docker-in Docker Enginge kimi bir konsepsiya ilə təmsil olunduğundan başlamağa dəyər. Və rəsmi Docker veb-saytından və “ Docker-a Baxış ” bölməsindən başlamalısınız .
Docker-ə ilk giriş - 4
Sənədlərdə deyilir ki, docker aşağıdakılardan ibarətdir:
  • Docker serveri Docker Daemon prosesi (dockerd) adlanır.
  • CLI (docker) kimi də tanınan komanda xətti interfeysi.
  • Proqramların deamonla necə "danışa" biləcəyini və ona nə edəcəyini izah edən REST API.
Daha da irəli getməzdən əvvəl gəlin docker-i quraşdıraq, yəni docker demonunu quraşdıraq. Docker veb saytında " Windows üçün Docker " quraşdırmaq üçün təlimatlar var. Maraqlıdır ki, Docker-in öz sistem tələbləri var. Əgər siz də mənim kimi köhnə Windows-unuz varsa, məsələn Windows 7, onda Docker Toolbox-dan istifadə etməlisiniz.
Docker-ə ilk giriş - 5

Docker Toolbox

Docker-i sistem tələblərinə cavab verməyən köhnə maşınlara quraşdırmaq üçün. Veb sayt belə deyir, “Legacy Desktop Solution”. Gəlin " Docker Toolbox " səhifəsinə keçək və onu yükləyək. Bu setin çəkisi təxminən 211 meqabaytdır. Biz onu standart olaraq quraşdıracağıq, yəni bayraqları yenidən düzəltmədən hər şeylə təvazökarlıqla razılaşacağıq. Quraşdırıldıqdan sonra hər şeyin qaydasında olduğunu yoxlayacağıq. Gələcəkdə döyüş meydanımız komanda xətti olacaq. Windows əmr satırından istifadə etməməyi tövsiyə edirəm, çünki onunla açıq-aşkar problemlər ola bilər. Bash shell istifadə etmək daha yaxşıdır. Windows-da onu əldə etməyin ən çox tövsiyə olunan yolu git versiyasına nəzarət sistemini quraşdırmaqdır , o, yenə də faydalı olacaq. Çünki onunla "birləşdirilmiş" bizə lazım olan bash olacaq. Bu baxış üçün mən git bash istifadə edəcəyəm. Siz həmçinin CYGWIN ilə bash quraşdıra bilərsiniz . Gəlin bash və ya git bash-ı işə salaq. Docker Machine kimi tanınan Docker Machine-i quraşdırdığımıza əmin olaq: docker-machine -version ​​Bu Docker Maşın nədir? Docker Machine dokerləşdirilmiş hostları idarə etmək üçün bir yardım proqramıdır (bunlar Docker Engine quraşdırılmış hostlardır). Docket Toolbox-u quraşdırdıqdan dərhal sonra əmrindən istifadə edərək docker maşınlarına baxsaq docker-machine ls, boş bir siyahı görəcəyik:
Docker-ə ilk giriş - 6
Gəlin yeni bir maşın yaradaq. Bunun üçün biz yaratmaq əmrini yerinə yetirməliyik : docker-machine create -- driver virtualbox javarush: Docker maşınının yaradılması jurnalını görəcəyik:
Docker-ə ilk giriş - 7
Burada bizi maraqlandıran aşağıdakılardır. Boot2Docker nədir? Bu, Docker Mühərrikini işə salmaq üçün minimalist Linux paylanmasıdır (biz başa düşürük ki, Docker Linux virtuallaşdırma alətləri sayəsində işləyir və Windows-da lazımi mexanizm yalnız Windows 10-dan başlayaraq ortaya çıxdı). Bu paylama " Tiny Core Linux " paylanmasına əsaslanır . VirtualBox VM haqqında da qeyd olunub. Bunun səbəbi biz təyin etdik --driver virtualbox. VirtualBox-da Boot2Docker təsvirindən yeni virtual maşın yaradıldı. Yaratdıqdan sonra VirtualBox-u işə sala bilərik (çünki VirtualBox Docker Toolbox ilə quraşdırılmışdır) və docker maşını üçün yaradılmış virtual maşına baxa bilərik:
Docker-ə ilk giriş - 8
Yaradıldıqdan sonra docker maşınına qoşulmaq üçün konfiqurasiya edilməli olan mühit dəyişənlərini əldə etmək üçün “ docker-machine env ” əmrini yerinə yetirməyimiz istəniləcək :
Docker-ə ilk giriş - 9
Docker-machine istifadə edərək bu əmri yerinə yetirdikdən sonra biz uzaqdan dokerləşdirilmiş hosta (bu halda Virtual Box-da yerləşdirilən virtual) qoşuluruq və docker əmrlərini sanki uzaq hostda icra edirmiş kimi lokal olaraq icra edə bilərik. Yoxlamaq üçün " docker info " əmrini işlədə bilərik . Doker maşını ilə əlaqə qurulmazsa, xəta alacağıq. Hər şey qaydasındadırsa, docker maşınındakı docker haqqında məlumat. İndi Dockerin ümumiyyətlə necə işlədiyini və ondan necə istifadə edəcəyini başa düşməyin vaxtıdır.
Docker-ə ilk giriş - 10

Docker Konteynerləri

Beləliklə, dockerimiz var. Bu doker nədir? Docker sənədləri və “ Başlayın ” bölməsi bunu anlamağa kömək edəcək . Bu bölmənin giriş hissəsi Docker Konseptlərini təqdim edir . Orada bildirilir ki, Docker konteynerlərdə proqramların işlənib hazırlanması, sazlanması və işə salınması üçün platformadır. Buna görə Docker üçün əsas şey konteynerlərdir. Docker loqotipinə baxsanız belə, bu, kürəyində qablar saxlayan bir balinadır. Bəs konteyner nədir? Sonrakı " Şəkillər və Konteynerlər " bölməsində konteynerin Şəkilin işləyən nümunəsi olduğu deyilir. Şəkil isə proqram üçün lazım olan hər şeyi (kod, mühit, kitabxanalar, parametrlər və s.) ehtiva edən “paketdir”. İndi özümüz cəhd edək. Docker veb-saytında " Yeni başlayanlar üçün Docker " daxil olan " Docker nümunələri " adlı bölmə var . Buradakı misallar mənə daha maraqlı görünür. Beləliklə, birdən Alpine Linux ilə tanış olmaq istədik və bunu Docker konteynerlərindən istifadə edərək edə bilərik. Təsviri əldə etmək üçün onu "çəkməliyik" və ya "çəkməliyik". Beləliklə, biz docker pull əmrini yerinə yetiririk :docker pull apline
Docker-ə ilk giriş - 11
Gördüyümüz kimi hardansa yükləyirik. Varsayılan olaraq, Docker https://hub.docker.com şəbəkəsindəki repozitoriyasına baxır . Şəkli uğurla əldə etdikdən sonra docker images əmrini işlətməklə mövcud şəkillərin siyahısını yoxlaya bilərik :
Docker-ə ilk giriş - 12
İndi apline şəklimiz var. Konteyner təsvirin işləyən bir nümunəsi olduğundan, gəlin bu şəkli işə salaq. Komandadan istifadə edərək konteyneri işə salaq docker run alpine. Gördüyümüz kimi heç nə baş verməyib. Bütün aktiv konteynerləri göstərmək əmrini yerinə yetirsək docker ps, biz də heç nə almayacağıq. Ancaq icra etsək, docker ps -abütün konteynerləri görəcəyik:
Docker ilə ilk tanışlıq - 13
İş ondadır ki, biz Docker-i interaktiv rejimdə işə salmadıq. Buna görə də əmri yerinə yetirib dayandı. Əmr terminalı açmaq idi. Gəlin eyni şeyi edək, lakin interaktiv şəkildə ( -it bayrağı ilə ):
Docker-ə ilk giriş - 14
Gördüyünüz kimi, bir səhvin öhdəsindən gələrək və ipucu istifadə edərək, konteynerə gəldik və orada işləyə bilərik! İşini dayandırmadan konteynerdən çıxmaq üçün düyməni basa bilərsiniz Ctrl + p + q. İndi işləsək docker ps, bir aktiv konteyner görəcəyik. Artıq işləyən konteynerə daxil olmaq üçün docker exec əmrini işlədin :
Docker ilə ilk tanışlıq - 15
Bütün bunların necə baş verdiyini əla təsvir etmək üçün Docker nümunəsinin təsvirini oxumağı tövsiyə edirəm: “ 1.0 İlk konteynerinizi işə salmaq ”. Onu bəyənirəm, çünki orada hər şey çox əlçatan və başa düşülən şəkildə yazılıb. Qısaca təkrar desək, biz docker-machine istifadə edərək Docker Daemon ilə işləyən virtual maşına qoşulmuşuq. REST API üzərindən CLI istifadə edərək, biz alp təsvirini işə salmağı xahiş edirik. Docker onu tapır və buna görə də endirmir. Docker yeni konteyner yaradır və bu konteynerdə qeyd etdiyimiz əmri yerinə yetirir. Və bütün bunlar, əlbəttə ki, yaxşıdır. Bəs bütün bunlar bizə niyə lazımdır? Və burada biz dockerin təsviri necə yaratdığını anlamalıyıq. Və onları doker faylı əsasında yaradır.
Docker-ə ilk giriş - 16

Docker faylı

Dockerfile arayışında deyildiyi kimi , dockerfile təsvirin əldə edilməsi üçün bütün əmrləri ehtiva edən mətn faylıdır. Əslində, aldığımız bütün təsvirlər (hətta yuxarıdakı nümunədən Alp) doker faylından yaradılmışdır. Gəlin öz şəklimizi Java proqramı ilə quraq. Və əvvəlcə bu Java proqramına ehtiyacımız var. Bu qısa icmalda daha çox oxuya biləcəyiniz Gradle qurma sistemindən istifadə etməyi təklif edirəm: “ Gradle-a Qısa Giriş ”. " Gradle Build init plugin " layihəsinin yaradılmasında bizə kömək edəcək . Gradle istifadə edərək yeni Java proqramı yaradaq: gradle init --type java-application Bu əmr şablon Java layihəsi yaradır. Bu müstəqil proqramdır, lakin biz veb tətbiqi yaratmaq istəyirik. Tətbiq və AppTest siniflərini silək (onlar Gradle Build Init Plugin tərəfindən avtomatik olaraq yaradılıb). Tez bir veb tətbiqi yaratmaq üçün biz Gradle-ın təlimatından istifadə edəcəyik: “ Java Veb Tətbiqlərinin qurulması ”. Təlimata uyğun olaraq, edək: Burada diqqətli olmaq lazımdır. Həmişə olduğu kimi, nümunələrdə səhvlər ola bilər. Bax budur:
Docker-ə ilk giriş - 17
İndi onu sınamaq üçün "Gretty plagini əlavə edin və proqramı işə salın " bölməsində göstərildiyi kimi build.gradle-a grtty plagini əlavə edək :
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
HelloServletMaraqlıdır ki, Gretty yuxarıda təsvir edilən səhvi görmür . Bu, tətbiqin müxtəlif mühitlərdə fərqli davrana biləcəyini sübut edir. Gretty, adi bir müstəqil serverin səhv atacağı yerdə işləyə bilər. Yalnız tətbiqin düzgün işlədiyini yoxlamaq qalır. edək:gradle appRun
Docker ilə ilk tanışlıq - 18
Hər şey qaydasındadırsa, gradle wargenişlənmə müharibəsi (veb arxivi) ilə arxiv toplamaq üçün əmrdən istifadə edin. Varsayılan olaraq, gradle onu \build\libs. İndi biz docker faylımızı yazmağa hazırıq. " Dockerfile arayışı "ndan istifadə edərək Dockerfile yaradacağıq. Java layihəmizin kökündə (quraşdırma skripti ilə eyni yerdə) "Dockerfile" adlı fayl yaradaq. Onu redaktə etmək üçün açaq. Bu faylın " Dockerfile arayışı: Format " bölməsində təsvir olunan öz formatı var . İstənilən doker faylı "əsas şəkli" göstərən FROM ifadəsi ilə başlayır. Deyə bilərik ki, bu, imicimizi yaratdığımız ana obrazdır. Valideyn şəklini seçmək bizim üçün çox asandır. Veb tətbiqi üçün veb server lazımdır. Məsələn, Tomcat veb serverindən istifadə edə bilərik. Docker hub adlanan rəsmi Docker repozitoriyasına gedirik . Bizə lazım olan şəklin orada olub olmadığını görmək üçün ora baxırıq:
Docker ilə ilk tanışlıq - 19
Tomcat şəklinin adlandırıldığını da başa düşməyə dəyər. Amma adından başqa etiketi də var. Teq versiya kimidir. Müxtəlif versiyaların Tomcat şəkilləri Tomcat-ın hansı versiyasının istifadə olunduğu, jre-nin hansı versiyası və əsas təsviri ilə fərqlənir. Məsələn, docker pull tomcat:9-jre8-alpine tomcat-ın 9-cu versiyası, jre versiyası 8 və əsas kimi alp şəklini istifadə edən bir şəkil əldə edə bilərik. Bu, şəklimizin ölçüsünü azaltmaq üçün vacib ola bilər:
Docker-ə ilk giriş - 20
Gördüyümüz kimi, fərq böyükdür. Şəkilimizi tomcata alpine əsaslansaq, 600 ilə deyil, yalnız 100 meqabaytdan başlayacağıq. Buna uyğun olaraq, əvvəllər yaradılmış doker faylına aşağıdakı məzmunu əlavə edəcəyik:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
İndi isə təsviri qurmaq əmrini yerinə yetirək: docker build -t jrdocker ..
Docker ilə ilk tanışlıq - 21
-t- bu bir etiketdir, yəni yığılmış təsvirə nə ad vermək lazımdır. Sondakı nöqtə o deməkdir ki, biz cari kataloqu (doker faylının yerləşdiyi və əmri yerinə yetirdiyimiz kataloq) -a əlavə edirik Build context. Build context- bu, dockerfile yaratarkən mövcud olan faylların kontekstidir. Gördüyünüz kimi, bunun sayəsində biz yığılmış müharibə faylını şəklimizə, veb server kataloquna köçürə bildik. İndi şəklimizi işə salaq:docker run -d --rm -p 8888:8080 jrdocker
Docker ilə ilk tanışlıq - 22
Serverin işə salınıb-başlamadığını anlamaq üçün konteynerdən jurnala baxa bilərsiniz. Günlük konteyneri ID və ya adı ilə göstərərək docker logs əmrindən istifadə etməklə əldə edilə bilər. Misal üçün:
Docker ilə ilk tanışlıq - 23
Unutmayın ki, biz həmişə adla işləyən konteynerə komanda ilə gedə bilərik: winpty docker exec -it NameКонтейнера sh İndi yalnız qoşulmaq qalır. Əvvəllər biz EXPOSE təyin etmişdik , yəni konteynerin içindən 8080 portuna giriş icazəsi vermişdik. Konteynerin özünü işə saldıqda biz -p ( incoming ports ) teqini təyin etdik və bununla da konteynerdə (Tomcat veb serveri) 8080 portunu əlaqələndirdik. orada bağlantılar gözləyir) docker demonu olan maşındakı 8888 portu ilə. Xatırladığımız kimi, biz docker demonunu birbaşa deyil, docker-machine vasitəsilə işə saldıq. Buna görə də, bir daha docker-machine ls əmrindən istifadə edərək docker maşınlarımız haqqında məlumat tələb edəcəyik və konteynerdəki serverlə əlaqə saxlayacağıq:
Docker-ə ilk giriş - 24
Beləliklə, siz və mən veb tətbiqimizi Docker konteynerində işə saldıq! ) Aşağıdakıları da qeyd etmək istərdim. Giriş problemi olduqda, Docker maşınının ilk növbədə Virtual BOx virtual maşını olduğunu xatırlamalısınız. Virtual maşının şəbəkə parametrləri ilə bağlı problemlər ola bilər. İşləyən VMBox konfiqurasiyası belə görünə bilər:
Docker ilə ilk tanışlıq - 25
Docker ilə ilk tanışlıq - 26

qatlar

Biz artıq anladıq ki, şəkillər doker fayllarından yaradılır və doker faylları bir sıra əmrlərdir. Biz həmçinin anladıq ki, doker faylının valideyni var. Və şəkillərin ölçüsü fərqlidir. Maraqlıdır ki, docker history əmrindən istifadə edərək, təsvirin necə qurulduğunun tarixini görə bilərsiniz . Misal üçün:
Docker ilə ilk tanışlıq - 27
Mahiyyət etibarı ilə hər bir obrazın obrazlar toplusu olduğunu başa düşmək üçün bunu demək vacibdir. Hər bir şəkil dəyişikliyi (doker faylındakı hər yeni əmr) öz ID-si olan yeni təbəqə yaradır. Siz " Docker: Şəkillər və Layers " sənədində təbəqələr haqqında daha çox oxuya bilərsiniz . Habré haqqında məqaləni oxumağı da çox tövsiyə edirəm: “ Şəkillərdəki Docker şəkilləri və konteynerləri .”

Nəticə

Ümid edirəm ki, bu qısa icmal sizi konteynerləşdirmə ilə maraqlandırmaq üçün kifayət etdi. Aşağıda faydalı ola biləcək əlavə materiallara keçidlər verilmişdir: #Viaçeslav
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION