Hamıya salam! Onun içində
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 (
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:
-
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. -
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
-
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
-
İ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
-
Gəlin bash-ı işə salaq. Nəhayət, adi qabığa qayıtdıq
-
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
-
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
Yuxarıdakı addımları təkrar-təkrar təkrarlamamaq üçün öz DinD konteynerimi yaratdım:
İş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:
-
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.
-
MySQL-i işə salın:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Biz verilənlər bazasına yerli olaraq qoşulduğumuz kimi qoşuluruq. Hər şeyin işlədiyinə əmin olaq.
-
İ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.
-
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