İnkişaf zamanı Docker-dən necə tam istifadə etmək olar

Johnson Wang-ın Unsplash'dakı şəkli

TL: DR

Hissə 1

  • Sənədləri idarə etmək və bütün inkişaf mühitinizi bölüşmək üçün Docker istifadə edin
  • CI testlərinizi aparmaq üçün Docker istifadə edin
  • Tikinti prosesini asanlaşdırmaq üçün Docker qatlarını istifadə edin.
  • Mənbə kodundan istehsala yerləşdirilə bilən bir komponent yaratmaq üçün Docker-in çox mərhələli quruluşlarından istifadə edin.

Hissə 2 (https://medium.com/tsftech/how-to-fully-utilise-docker-compose-during-development-4b723caed798)

  • İstehsal sisteminizi yerləşdirmək / təqlid etmək üçün Docker-Compose istifadə edin.
  • İnkişaf / CI tətbiqinizi idarə etmək üçün ayrı bir Docker Compose sənədindən istifadə edin.
  • İstehsal komponentlərinizi test etmək üçün Docker-Compose istifadə edin

Düyünü bilmirsinizsə ...

Blog Docker və Docker-Compose haqqındadır. Bütün funksiyalar bir çox texniki inkişaf yığınlarına ümumiyyətlə tətbiq edilə bilər. Eyni nümunəni Javascript, Python, Java və Scala layihələri üçün istifadə etdim.

Nümunələrdə sadə bir Node tətbiqindən istifadə edirəm. Düyünlə tanış deyilsinizsə, bilmək üçün lazım olan budur.

  • Node bir icra mühitidir və npm adlı paket meneceri ilə gəlir
  • Package.json üçüncü tərəfdən asılılıqları müəyyənləşdirir və skriptlər yaradır
  • Üçüncü tərəf bağımlılıkları, layihənin node_modules adlı bir alt qovluğuna yüklənir (Maven-dən fərqli olaraq, bir çox proyekt üçün ortaq bir istifadəçi kataloqu üçün istifadə edilə bilən bir yapılandırılabilir qovluq istifadə edir).
  • Ümumiyyətlə bu əmrlər inkişaf iş axınında istifadə olunur
  • npm quraşdırma - Üçüncü tərəfdən asılılıqları node_modules qovluğuna yükləyir
  • npm start - proqramı mənbə kodundan idarə edin
  • npm testi - vahid test paketi
  • npm qurmaq - optimallaşdırın və istehsal üçün paketləyin

Problemlər / motivasiya

Əvvəllər, inkişaf etdiricilər bir çox dil, kompilyator, verilənlər bazası və analizatorlarını yerli kompüterlərinə yükləməli və qurmalı idilər. Ayrıca, bir və ya daha çox CI server üçün oxşar, lakin tez-tez fərqli bir alət dəsti quraşdırdılar. Zamanla komanda tədricən dəyişir və layihə inkişaf edir. Fərdi olduqları üçün CI serverləri və fərdi inkişaf maşınları bir-birlərindən bir qədər fərqlidir. Sonra build ləğv edir və ya səsi ilə bir səhv baş verir

Yaxşı maşınımda işlədi

Çalışqan bir komanda olmusunuzsa, yeni başlayanları necə işə salacağınızı izah edən bir wiki səhifəniz var. Ancaq yeni gələn gəldikdə, yenidən ayağa qalxaraq günlərlə (və ya həftələr - şişirdməmişəm) sərf etdilər. Xoşbəxtlikdən bir həll yolu bilən bir layihə menecerimiz var idi.

Wiki-yə qoyun və növbəti yeni gələn yaxşı olacaq

Sonra yeni bir xüsusiyyət üzərində işləyəndə kimsə bir asılılığı dəyişdirir. Onların quruluşları elə işləyir ki, onu irəli aparsınlar. CI sisteminizi yaxşı qurmusunuzsa, problemi tanıyacaqsınız, ancaq geliştirici tapşırığı bitmiş kimi qeyd edib həftəsonu üçün ayrılana qədər deyil. Ancaq bəlkə də CI quruluşu keçəcəkdir. Davamlı bir qovluqdan köhnə bir asılılığı olmayan və quruluşlarının işləmədiyini və ilk bir neçə saatı öz kodlarını və quraşdırmalarını nəzərdən keçirməyə başladıqları yeni gələn, bu yalnız kod üçün olduğu təqdirdə təbiidir baş iş geliştiricisi və CI sistemi.

Qaranlıq əsrlərdə yaxşı bir geliştirici təzyiq tətbiq etmədən əvvəl vahid testlərini yerində aparacaqdı. 5 dəqiqə çəkmələrinin heç bir əhəmiyyəti yox idi, çünki gedib dəm qazana bildilər. Uzun test paketi CI sistemində icra edildi. Bir səhv baş verərsə, geliştirici həmişə CI paketi mühitindən fərqli olaraq qurulduğundan onu yerli olaraq çalışdıra bilməz. Bəlkə də böyük bir proyekt olduğu üçün və arxa plan inkişaf etdiricisi olaraq yığma yığınının yalnız yarısına sahibsiniz. Problemi həll etməyin yeganə yolu CI qeydlərini nəzərdən keçirmək, kömək edə biləcək bir dəyişiklik etmək və gözləyərək yenidən cəhd etmək idi.

İnkişaf mühitinizi dockerize edin

İlk və ən asan addım inkişaf mühitiniz üçün Dockerfile yaratmaqdır. Dockerfile sadəcə quraşdırma təlimatlarını dəqiq versiya nömrələri və addımlarla sənədləşdirir. Geliştirici qurulması artıq Docker, Docker-Build my-dev-env və Docker-Run my-dev-image yükləmək qədər asandır. Docker faylı, inkişaf mühitinin daima ehtiyac duyduğu kodla sinxron olması üçün mənbə nəzarətinə əlavə olunur.

Çox sadə bir Javascript inkişaf mühiti yaratmaq üçün aşağıdakıları ./Dockerfile qeyd edin

Düyündən: 10.11.0-jessie WORKDIR / home / app

Diqqət yetirin ki, əsas şəkillər və asılılıqlar üçün hər zaman tam uyğun bir versiya istifadə etməlisiniz. Dəyişikliyin şüurlu bir seçim olmasını istəyirsən.

Artıq asanlıqla daxil olub qaça, test edə və kodunuzu paketləyə bilərsiniz və s.

Docker build -t my_dev_env. docker run -v.: / home / app my_dev_env npm start

Ən yaxşı nümunə deyil, yalnız Node-un yerli quraşdırılmasını saxladıq, ancaq inkişaf komandamız üçün ən azı tutarlı və sənədləşdirilmiş bir versiyamız var. Real həyatda BÜTÜN layihələr daha mürəkkəbdir və hər bir əlavə asılılıq ilə dəyəri ödənilir.

Qurma addımlarınızı bağlayın

Yuxarıdakı nümunədə bəzi problemlər var:

  • İş sahəsinin yenidən qeyd edilməsi ana kompüteri çirkləndirəcək və tikinti əsərləri bir quruluşdan və ya layihədən digərinə keçə bilər.
  • Qurma iş axını hələ də bir vikidə və ya yaddaşımızda sənədləşdirilmiş xarici bir prosesdir, lakin indi hər bir əmr daha narahatdır

Dockerfile üçün bir neçə yeniləmə edək

Düyündən: 10.11.0-jessie WORKDIR / home / app
# Zaman zaman dəyişən asılılıqları müvəqqəti olaraq saxlamaq üçün bir qat yaradın COPY ./package.json ./package-lock.json ./ RUN npm install
# Tez-tez dəyişən mənbə kodu olan bir təbəqə yaradın COPY ./public ./public COPY ./src ./src
# Testləri çalıştırın və istehsal üçün toplayın RUN npm run test RUN npm run build
# İstehsal əsəri CMD-i çalıştırmak üçün standart əmri seçin ["node", "build / www / index.js"]

İlk yeni addım, bağımlılığı təyin edən pack.json faylını kopyalamaq və konteyner görüntüsünə quraşdırmaq üçün npm install istifadə etməkdir. Qeyd:

  • Üst qovluq və ya node_modules qovluğu deyil, yalnız pack.json faylı əlavə olunur. Buna görə də, asılılıqlar yalnız konteynerin içərisində olan bir qovşaq_moduli qovluğunda saxlanılır. Ana kompüterdəki mənbə qovluğunu çirkləndirmirlər və sonrakı quruluşlara və ya digər layihələrə ötürülə bilməzlər.
  • Yükləmə qurma mərhələsində bir dəfə həyata keçirilir, buna görə konteyner sürətlə işləyə bilər, çünki asılılıqlar onsuz da mövcuddur.

Üçüncü tərəfdən asılılıqları qurduqdan sonra mənbə kodunu və digər əsərləri kopyalayın. Sürətli qurma vaxtı üçün bu addımları ayırmaq vacibdir. Docker, quruluşun hər mərhələsinin girişlərini səliqəyə salır və heç bir şey dəyişmədiyi təqdirdə önbelleğe alınmış bir qatı yenidən istifadə edir və ya bir şey dəyişsə bütün qatı yenidən yaradır. Unutmayın, üçüncü tərəfdən asılılıqlar bir addımda konteyner şəklinə yüklənir. Beləliklə, bir asılılıq dəyişirsə, bütün təbəqə etibarsız olur və bütün asılılıqlar yenidən yüklənir. Çoxu yalnız mənbə kodunu dəyişdirir. Bu vəziyyətdə, Docker, pack.json faylının qarışmasının dəyişməz olduğunu və əvvəlcədən yüklənmiş asılılıqlarla səviyyə yenidən istifadə ediləcəyini görəcək və bu da yığımı əhəmiyyətli dərəcədə sürətləndirəcəkdir.

Növbəti addım tikinti mərhələsində testlərin aparılmasıdır. Bunun iki üstünlüyü var:

  • Yaradılan hər bir konteyner şəklinin testlərdən keçməsini təmin edir
  • Sınaq əmri ilə həm inkişaf, həm də CI sistemlərində etibarlı şəkildə yerinə yetirilə bilməsi üçün test icra addımlarını bir yerdə müəyyənləşdirir və sənədləşdirir.
Docker-Build-T şəklim.

Nəhayət, istehsal üçün qablaşdırırıq və konteynerin standart olaraq necə çalışacağını təyin edirik. Artıq "İstehsal" versiyasını problemsiz şəkildə idarə edə bilərik

doker mənim şəklimə başlayır

Hələ də kodu aktiv şəkildə sındırarkən, hostda kod dəyişikliyini axtaran və layihə paketi.json sənədində müəyyənləşdirildiyi kimi sürətli və dinamik şəkildə kompilyasiya / işləmə / testlər və s. İnkişaf versiyasını işləyirik.

docker run -v ./src:/home/app/src --entrypoint = "npm run watch" şəklim

Əla. Motivasiya bölməsində əhatə etdiyimiz bütün məsələləri əhatə edir. Bununla yanaşı, İstehsal konteynerində istehsal görüntüsündə tələb olunmayan bir sıra inkişaf asılılığı da mövcuddur. Bu, adətən insanları, xüsusən gecə isti və rahat hiss edən təhlükəsizlik şüurlu səhv yollarla ovuşdurur.

Çox mərhələli quruluşlar.

Çox mərhələli quruluşlar, yığımı kapsülləşdirmək üçün səliqəli bir konteyner yaratmağımızı və sonra əsərləri istehsal üçün optimallaşdırılmış yeni bir konteynerə kopyalamağımızı təmin edən bir Docker xüsusiyyətidir.

Birinci FROM satırını AS dev ilə etiketləyin və ikinci bir FROM ilə yeni bir bölmə əlavə edin

Düyündən: 10.11.0-jessie AS dev WORKDIR / home / App
# Zaman zaman dəyişən asılılıqları müvəqqəti olaraq saxlamaq üçün bir təbəqə yaradın COPY ./package.json ./package-lock.json ./ RUN npm install
# Tez-tez dəyişən mənbə kodu olan bir təbəqə yaradın COPY ./public ./public COPY ./src ./src
# Testləri çalıştırın və istehsal üçün toplayın RUN npm run test RUN npm run build
# Dev konteyner CMD üçün standart komanda ["npm", "run", "watch"]
# İstehsal üçün optimize edilmiş konteyner şəkli yaradın: 10.11.0-jessie RUN npm install -g serve COPY - from = dev / home / app / build CMD yaratmaq ["surcharge", "-s", "build"]

Bunun bir istehsal mühitinin yaxşı bir nümunəsi olduğunu iddia etmirəm, amma illüstrasiya məqsədi ilə. Sonrakı mərhələ üçün hər hansı bir əsas görüntü seçə bilərik. Burada yaxşı bir seçim Nginx olardı. Xatırladaq ki, COPY əmri, host əvəzinə adı verilən birinci səviyyə nüsxələməsinə səbəb olmaq üçün --from = dev bayrağını istifadə edir.

Ayrıca, geliştirici konteynerinin əmrini standart monitor rejiminə dəyişdirin. Bu, ən ümumi icra əmrlərini asanlaşdırır.

Təsdiqləyən və sənədləşdirən bir Dockerfile yazdıq:

  • tam bir inkişaf mühiti və bir əmrlə qurulacaq addımlar
Docker-Build-T şəklim.
  • istehsal rejimində bir əmrlə icra edilə bilən
doker mənim şəklimə başlayır
  • inkişaf rejimində iki əmrlə yaradıla və yerinə yetirilə bilər
docker build - target = dev -t my-dev-image. docker run -v ./src:/home/app/src my-dev-image
  • Hər yeni komanda üzvü və ya CI sistemi tərəfindən yalnız bir neçə dəqiqəyə etibarlı şəkildə həyata keçirilə bilər.
  • Bu, gələcək əsərləri və digər layihələri qorumaq üçün bütün əsərləri təcrid edir.
  • Bu, testlərin bütün istehsal görüntüləri üçün aparıldığına zəmanət verir

Hissə 2

İndiyə qədər yalnız Docker-ə baxdıq və node.js qurma prosesinin çox sadə bir nümunəsini istifadə etdik.

Hissə 2-də (qısaca) bu Twee nümunəsini mürəkkəb çoxkomponentli layihələrə necə genişləndirmək üçün Docker-Compose istifadə edə biləcəyinizi təsvir edəcəyəm.

: X

Əvvəlcə thestartupfactory.tech saytında yayımlandı.