Proyek membangun infrastruktur dengan buruh pelabuhan

Sudah ada bahan-bahan tentang Habr bagaimana mengonfigurasi docker- container untuk kompilasi proyek. Misalnya, Menggunakan Docker untuk membangun dan menjalankan proyek C ++ . Dalam artikel ini, seperti pada yang sebelumnya, masalah membangun proyek akan dipertimbangkan, tetapi di sini saya ingin membahas tutorial dan mempertimbangkan lebih dalam masalah penggunaan kontainer dalam tugas-tugas tersebut, serta membangun infrastruktur pembangunan dengan buruh pelabuhan .


Sedikit tentang buruh pelabuhan


Untuk kejelasan diskusi lebih lanjut, perlu memberikan deskripsi tentang beberapa komponen buruh pelabuhan .


Gambar


Gambar Docker adalah templat baca-saja dengan instruksi untuk membuat wadah. Untuk membangun gambar, Anda harus membuat Dockerfile , yang menjelaskan semua langkah perakitan. Setiap langkah tersebut menciptakan lapisan terpisah di dalam gambar . Setiap lapisan berikutnya ditumpangkan di atas semua yang sebelumnya dan hanya berisi perubahan yang perlu dilakukan ke lapisan sebelumnya.


Misalnya, untuk Dockerfile :


FROM ubuntu:18.04 ADD app.sh /app ENTRYPOINT /bin/bash /app/app.sh 

Gambar buruh pelabuhan akan memiliki struktur berikut:



Lapisan di dalam gambar di- cache dan dapat digunakan kembali jika tidak ada perubahan yang terdeteksi. Jika lapisan diubah (ditambahkan / dihapus) , maka semua yang berikutnya dibuat dari awal. Untuk membuat perubahan pada gambar kontainer (dan sesuai dengan lingkungan proses yang diluncurkan), cukup untuk memperbaiki Dockerfile dan mulai membangun gambar.


Wadah


Wadah buruh pelabuhan adalah contoh awal dari gambar . Itu dapat dibuat, dimulai, dihentikan, dihapus, dll. Secara default, wadah terisolasi satu sama lain dan dari sistem host. Saat mulai, wadah memulai perintah, yang dapat ditentukan dalam ENTRYPOINT atau CMD , dan berhenti ketika sudah selesai. Situasi yang dapat diterima adalah ketika CMD dan ENTRYPOINT hadir , saat mereka berinteraksi dijelaskan dalam dokumentasi .


Ketika Anda membuat setiap wadah, layer baru ditambahkan di atas semua yang sudah ada. Dapat ditulis dalam wadah saat ini, dan dihancurkan bersama dengan wadah. Semua operasi penulisan, pembuatan file baru selama pengoperasian wadah diterapkan ke lapisan ini, gambar selalu tetap tidak berubah. Dengan demikian, struktur lapisan wadah yang dibuat akan terlihat seperti:



Saat menggunakan docker run , sebuah wadah baru akan dibuat setiap kali, dengan layernya sendiri untuk ditulis. Dalam membangun tugas, ini berarti bahwa setiap kali dimulai, itu akan menciptakan lingkungan bersih baru yang tidak ada hubungannya dengan eksekusi sebelumnya. Daftar kontainer yang dibuat dapat dilihat dengan menjalankan perintah: docker container ls -a .


Kami mengumpulkan proyek dalam wadah


Untuk kejelasan, kami jelaskan secara singkat proses membangun aplikasi dalam wadah, proses ini dijelaskan secara lebih rinci dalam artikel 1 dan artikel 2 .


Secara skematis langkah-langkah yang mungkin untuk membangun aplikasi di buruh pelabuhan dapat direpresentasikan sebagai berikut:


Mari kita menganalisis langkah-langkah yang ditunjukkan:


  1. Kami menggunakan Dockerfile , yang menggambarkan lingkungan, perintah untuk merakit dan menyalin hasil, dan berdasarkan itu kami membuat gambar wadah.
  2. Kami menggunakan gambar yang dihasilkan untuk membuat dan meluncurkan wadah dengan perintah docker run . Kami memasang folder sumber dan folder tempat hasil perakitan akan disalin ke wadah.
  3. Setelah wadah selesai, artefak rakitan akan ditempatkan di direktori yang terpasang.

Contoh diberikan dalam artikel .


Karena docker run digunakan di sini, untuk setiap peluncuran wadah yang terpisah akan dibuat dengan lapisannya sendiri untuk ditulis , sehingga file sementara dari rakitan sebelumnya tidak akan masuk ke yang sekarang. Ingatlah untuk membersihkan wadah yang berhenti.


Memasang direktori sumber membuat men-debug perakitan lebih mudah. Tapi itu membawa risiko - Anda dapat mengumpulkan rilis dari kode yang tidak lulus kontrol kualitas, atau tidak ditambahkan ke sistem kontrol versi sama sekali. Untuk menghindari ini, Anda dapat mengkloning git repositori di dalam wadah di setiap build, seperti, misalnya, dalam file :


 FROM ubuntu:bionic RUN apt-get update \ && apt-get install -y apt-utils RUN apt-get update \ && apt-get install -y make gcc g++ qt5-default git RUN mkdir -p /app/src WORKDIR /app/build #       ENTRYPOINT git -C /app/src clone https://github.com/sqglobe/SimpleQtProject.git \ && qmake /app/src/SimpleQtProject/SimpleQtProject.pro \ && make \ && cp SimpleQtProject /app/res/SimpleQtProject-ubuntu-bionic 

Di sini, kloning dilakukan dalam ENTRYPOINT , bukan dalam pernyataan RUN , karena caching. ENTRYPOINT selalu dieksekusi ketika wadah dimulai, dan hasil dari perintah RUN dapat diambil dari cache .


Bangun Infrastruktur


Untuk membangun proyek untuk berbagai sistem operasi atau distribusi Linux, konfigurasi server tertentu (mesin pembuat, server dengan sistem kontrol versi, dll.) Dapat digunakan. Dalam praktiknya, saya harus berurusan dengan infrastruktur berikut:



Di sini, pengguna mengakses server web di mana proyek ini dibangun pada mesin dengan Ubuntu dan Red Hat . Selanjutnya, pada setiap mesin, repositori git diklon dengan proyek ke direktori sementara dan perakitan dimulai. Pengguna dapat mengunduh file yang dihasilkan dari halaman yang sama dari mana ia memulai seluruh proses.


Perakitan semacam itu dapat diulang karena pengembang menggunakan lingkungan yang sama.


Dari minus - perlu untuk mempertahankan seluruh infrastruktur, mengelola beberapa server, menghilangkan bug dalam skrip dan aplikasi web , dll.


Sederhanakan dengan buruh pelabuhan


Mendukung infrastruktur yang ditunjukkan di atas memerlukan biaya tertentu, baik moneter maupun manusia. Jika tim Anda bekerja pada startup kecil, atau Anda adalah satu-satunya pengembang, Anda dapat menggunakan buruh pelabuhan untuk mengimplementasikan infrastruktur pembangunan Anda.


Pertimbangkan proyek Qt yang sepele yang dibangun menggunakan qmake - SimpleQtProject . Folder buruh pelabuhan dari proyek yang ditentukan berisi sejumlah file:



File-file ini menerapkan gagasan kloning kode sumber di dalam sebuah wadah.


Seluruh unit diluncurkan menggunakan Makefile . Ini sangat singkat dan berisi komentar yang cukup. Dasarnya adalah pembuatan gambar dan peluncuran wadah:


 %: %.docker docker build -t simple-qt-$(strip $(subst .docker,, $< )) --file $< . docker run --mount type=bind,source=$(RELEASE_DIR),target=/app/res simple-qt-$(strip $(subst .docker,, $< )) 

Pada tahap perakitan ini, gambar wadah dibuat dengan nama yang terdiri dari awalan simple-qt- dan nama sistem (untuk centos 7 akan menjadi simple-qt-centos7 ). Sebagai Dockerfile , file yang sesuai dengan izin .docker digunakan . Selanjutnya, wadah diluncurkan berdasarkan gambar yang dibuat, dan sebuah folder dipasang di atasnya untuk menyalin artefak perakitan.


Setelah menjalankan make di direktori buruh pelabuhan , folder buruh pelabuhan / rilis akan berisi hasil build untuk beberapa platform.


Dengan demikian, infrastruktur kami untuk membangun SimpleQtProject akan terlihat seperti ini:



Keuntungan dari konfigurasi ini:


  1. Lokalitas . Pengembang mengumpulkan proyek untuk beberapa platform pada mesin lokalnya, ini menghilangkan kebutuhan untuk memuat armada server, mengkonfigurasi penyalinan artefak antar server melalui jaringan, mengirim dan memproses perintah jaringan.
  2. Isolasi lingkungan . Wadah menyediakan lingkungan yang sepenuhnya terisolasi untuk membangun aplikasi spesifik. Dimungkinkan untuk membangun proyek dengan lingkungan yang tidak kompatibel pada mesin yang sama (misalnya, mereka yang membutuhkan versi berbeda dari perpustakaan yang sama).
  3. Versi Dengan menempatkan Dockerfile di repositori git, Anda dapat melacak perubahan di lingkungan build dengan merilis rilis baru, memutar kembali ke versi sebelumnya dari lingkungan build, dll.
  4. Mobilitas . Jika perlu, infrastruktur ini digunakan tanpa masalah di komputer lain. Teknologi untuk membuat gambar wadah memungkinkan Anda untuk membuat perubahan pada gambar itu sendiri dengan sangat mudah - perbarui Dockerfile dan mulai membangun gambar.
  5. Mendokumentasikan diri sendiri . Pada dasarnya, Dockerfile berisi langkah-langkah untuk menggunakan lingkungan perakitan. Karena itu, jika perlu, gunakan lingkungan seperti itu, tetapi sudah ada dalam sistem reguler, Anda dapat menggunakan perintah dari sana.
  6. Ringan . Wadah mulai pada saat perakitan dimulai dan berhenti secara otomatis setelah selesai. Itu tidak membuang waktu dan RAM CPU.

Namun, ada minus yang signifikan - perakitan proyek akan membutuhkan perakitan gambar wadah. Saat pertama kali memulainya, ini bisa memakan waktu lama. Tetapi dengan yang berulang, terutama jika Dockerfile belum berubah, gambar dirakit menggunakan cache berkali-kali lebih cepat.


Perlu juga diingat untuk membersihkan wadah yang berhenti.


Kesimpulan


Sebagai kesimpulan, saya ingin mencatat bahwa buruh pelabuhan bukan satu-satunya teknologi kontainerisasi. Tetapi ada beberapa fitur yang membedakannya dengan baik untuk tugas perakitan dari LXC yang sama:


  1. Anda dapat membuat wadah menggunakan teks Dockerfile . Ini adalah file dengan sintaksis sederhana, Anda dapat menambahkannya ke repositori proyek (seperti yang selalu saya lakukan) dan menyimpannya terus-menerus.
  2. Setiap kali, dengan meluncurkan wadah buruh pelabuhan dengan perintah docker run kami mendapatkan lingkungan yang bersih , seolah-olah kami melakukan segalanya untuk pertama kalinya. File sementara antar majelis tidak disimpan.
  3. Wadah tidak meluncurkan keseluruhan sistem operasi, tetapi hanya proses perakitan yang diperlukan.

Source: https://habr.com/ru/post/id457870/


All Articles