Docker-i Docker-də necə idarə etdim və ondan nə çıxdı

Hamıya salam! Onun içində əvvəlki məqalə, Docker-in Docker-də işləməsi və bu dərsdən istifadənin praktiki aspektləri haqqında danışmağa söz verdim. Sözünüzü tutmağın vaxtı gəldi. Təcrübəli tərtibatçı, yəqin ki, Docker daxilində Dockerə ehtiyacı olanların sadəcə olaraq Docker demon yuvasını hostdan konteynerə ötürməsinə etiraz edəcək və bu, 99% hallarda kifayət edəcəkdir. Ancaq mənə peçenye atmağa tələsməyin, çünki biz Docker-in həqiqətən Docker-də işləməsi haqqında danışacağıq. Bu həllin bir çox mümkün tətbiqi var və bu məqalə onlardan biri haqqındadır, ona görə də arxaya oturun və qollarınızı qarşınızda düzəldin.

Docker-i Docker-də necə idarə etdim və ondan nə çıxdı

Start

Hər şey yağışlı bir sentyabr axşamı, Digital Ocean-da 5 dollara icarəyə götürdüyüm maşını təmizləyərkən başladı, Docker bütün 24 giqabayt disk yerini şəkilləri və konteynerləri ilə doldurduğu üçün donmuşdu. İroni o idi ki, bütün bu şəkillər və konteynerlər keçici idi və hər dəfə kitabxananın və ya çərçivənin yeni versiyası çıxanda tətbiqimin işini yoxlamaq üçün lazım idi. Mən qabıq skriptləri yazmağa və zibilləri təmizləmək üçün cron cədvəli qurmağa çalışdım, lakin bu kömək etmədi: hər dəfə bu, istər-istəməz serverimin disk sahəsinin yeyilməsi və serverin asılması (ən yaxşı halda) ilə başa çatırdı. Bir anda Jenkins-i bir konteynerdə necə işlətmək və onun içinə ötürülən docker demon yuvası vasitəsilə tikinti boru kəmərlərini necə yarada və silə biləcəyi haqqında məqalə ilə rastlaşdım. Mən bu ideyanı bəyəndim, lakin mən daha da irəli getmək qərarına gəldim və birbaşa Docker-i Docker-də işlətməyə cəhd etdim. O zaman mənə Docker şəkillərini yükləmək və başqa bir konteynerin içərisində sınaqdan keçirmək üçün lazım olan bütün proqramlar üçün konteynerlər yaratmaq mənə tamamilə məntiqli bir həll kimi görünürdü (gəlin bunu səhnə konteyneri adlandıraq). İdeya, dayandırılan zaman bütün konteyneri və onun bütün məzmununu avtomatik silən -rm bayrağı ilə bir quruluş konteynerinə başlamaq idi. Docker-in özündən Docker şəkli ilə məşğul oldum (https://hub.docker.com/_/docker), lakin çox çətin olduğu ortaya çıxdı və mən heç vaxt lazım olduğu kimi işləməyi bacarmadım və bütün yolu özüm getmək istədim.

Təcrübə edin. Konuslar

Konteyneri lazım olan şəkildə işləməyə başladım və təcrübələrimi davam etdirdim, nəticədə saysız-hesabsız qönçələr yarandı. Özümə verdiyim işgəncənin nəticəsi aşağıdakı alqoritm oldu:

  1. Docker konteynerini interaktiv rejimdə işə salırıq.

    docker run --privileged -it docker:18.09.6

    Konteynerin versiyasına diqqət yetirin, sağa və ya sola addımlayın və DinD-niz balqabağa çevrilir. Əslində, yeni bir versiya çıxanda işlər tez-tez pozulur.
    Dərhal qabığa girməliyik.

  2. Hansı konteynerlərin işlədiyini öyrənməyə çalışırıq (Cavab: heç biri), lakin yenə də əmri yerinə yetirək:

    docker ps

    Bir az təəccüblənəcəksiniz, amma məlum oldu ki, Docker demonu belə işləmir:

    error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 
    192.168.65.1:53: no such host

  3. Gəlin bunu özümüz idarə edək:

    dockerd &

    Başqa bir xoşagəlməz sürpriz:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. İptables və bash paketlərini quraşdırın (hər şey bash-da işləmək sh-dən daha xoşdur):

    apk add --no-cache iptables bash

  5. Gəlin bash-ı işə salaq. Nəhayət, adi qabığa qayıtdıq

  6. Docker-i yenidən işə salmağa çalışaq:

    dockerd &

    Biz bununla bitən uzun vərəqləri görməliyik:

    INFO[2019-11-25T19:51:19.448080400Z] Daemon has completed initialization          
    INFO[2019-11-25T19:51:19.474439300Z] API listen on /var/run/docker.sock

  7. Enter düyməsini basın. Bash-a qayıtdıq.

Bundan sonra biz Docker konteynerimizdə digər konteynerləri işə salmağa cəhd edə bilərik, lakin biz Docker konteynerimizdə başqa bir Docker konteynerini işə salmaq istəsək və ya nəsə səhv olarsa və konteyner çökərsə? Hər şeyi yenidən başlayın.

Öz DinD konteyneri və yeni təcrübələr

Docker-i Docker-də necə idarə etdim və ondan nə çıxdı
Yuxarıdakı addımları təkrar-təkrar təkrarlamamaq üçün öz DinD konteynerimi yaratdım:

https://github.com/alekslitvinenk/dind

İşləyən DinD həlli mənə Docker-i Docker-də rekursiv şəkildə idarə etmək və daha macəralı təcrübələr etmək imkanı verdi.
İndi MySQL və Nodejs ilə işləmək üçün belə (uğurlu) bir təcrübəni təsvir edəcəyəm.
Ən səbirsiz adam burada necə olduğunu görə bilər

Beləliklə, başlayalım:

  1. DinD-ni interaktiv rejimdə işə salırıq. DinD-nin bu versiyasında biz uşaq konteynerlərimizin istifadə edə biləcəyi bütün portları əl ilə xəritələşdirməliyik (mən artıq bunun üzərində işləyirəm)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    Dərhal uşaq konteynerlərini işə salmağa başlaya biləcəyimiz bash-a daxil oluruq.

  2. MySQL-i işə salın:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. Biz verilənlər bazasına yerli olaraq qoşulduğumuz kimi qoşuluruq. Hər şeyin işlədiyinə əmin olaq.

  4. İkinci konteyneri işə salın:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    Xahiş edirik unutmayın ki, port xəritələşdirilməsi dəqiq olacaq 8080:8080, çünki biz artıq 80 nömrəli portu hostdan ana konteynerə 8080 portuna uyğunlaşdırmışıq.

  5. Brauzerdə localhost-a gedirik, serverin “Salam Dünya!” cavabını verdiyinə əmin olun.

Mənim vəziyyətimdə, yuvalanmış Docker konteynerləri ilə təcrübə olduqca müsbət oldu və mən layihəni inkişaf etdirməyə və onu səhnələşdirmə üçün istifadə etməyə davam edəcəyəm. Mənə elə gəlir ki, bu, Kubernetes və Jenkins X-dən daha yüngül həlldir. Amma bu, mənim subyektiv fikrimdir.

Düşünürəm ki, bugünkü məqalə üçün hamısı budur. Növbəti məqalədə mən Docker-in Docker-də rekursiv işlədilməsi və qovluqların iç-içə konteynerlərin dərinliyinə quraşdırılması ilə bağlı təcrübələri daha ətraflı təsvir edəcəyəm.

PS Bu layihəni faydalı hesab edirsinizsə, lütfən, GitHub-da ona bir ulduz verin, onu bağlayın və dostlarınıza deyin.

Edit1 Səhvlər düzəldildi, 2 videoya diqqət yetirildi

Mənbə: www.habr.com

Добавить комментарий