Membuat Imej Docker dari Scratch

Creating Docker Image From Scratch



Kelebihan utama Docker berbanding teknologi kontainerisasi lain ialah Docker ditujukan kepada pembangun dan aplikasi upstack mereka. Walaupun teknologi pengkontenan yang betul seperti LXC , Zon dan Penjara disasarkan dari perspektif operasi, atau, secara sederhana, platform ini adalah pengganti mesin maya yang berjalan di awan. Di mana, Docker adalah pengganti pakej dan binari yang boleh dilaksanakan.

Secara longgar, Docker menjadi lebih seperti pengurus pakej sejagat yang berfungsi di semua platform Linux yang mungkin. Ia memerlukan bekas dan menggunakannya untuk menyelesaikan masalah yang sama sekali berbeza yang dihadapi oleh pembangun. Masalahnya ialah pembangun menggunakan sistem operasi desktop mereka (seperti Windows, macOS atau Linux dengan banyak paket berkaitan desktop) untuk menulis aplikasi. Aplikasi yang mereka tulis sering dijalankan pada sistem operasi yang sama sekali berbeza pada pelayan di mana-mana dengan sebilangan Linux yang sama sekali berbeza dengan komputer riba pemaju.







Dengan Docker, idea anda ialah aplikasi anda dibungkus sebagai gambar Docker. Tugas Docker adalah untuk mengambil gambar ini dan menjalankannya sebagai aplikasi kemas untuk anda. Dengan menggunakan kontena, aplikasi dan pergantungannya akan berjalan dalam persekitaran terpencil yang mungkin berbeza sama sekali dengan komputer riba pemaju dan juga pelayan pengeluaran. Selagi mereka berdua menyokong Docker, mereka berdua dapat menjalankan aplikasi yang sama dengan cara yang sama.



Anatomi Imej Docker

Seperti disebutkan sebelumnya, aplikasi Docker akan berjalan di lingkungan yang disepakati. Sekarang persoalannya ialah bagaimana kita mewujudkan persekitaran itu? Sebilangan besar gambar aplikasi akan mengimport gambar asas Docker dan membina aplikasinya di atasnya.



Aplikasi dibuat dari lapisan perisian. Imej wadah wordpress dibina menggunakan gambar wadah httpd yang seterusnya dibina di atas gambar Ubuntu. Imej di mana imej yang lebih baru dibina dikenali sebagai GAMBAR IBU BAPA dalam terminologi Docker. Di Dockerfile (kita akan mengetahui maksud Dockerfile, sedikit kemudian), gambar induk ini disebut di bahagian atas fail seperti yang ditunjukkan di bawah:





DARI Ubuntu: 18.04
## Selebihnya Dockerfile

Dockerfile ini ketika dijalankan mengubah aplikasi anda menjadi gambar Docker (binari macam) yang kemudian anda boleh tekan ke registri dari mana ia dapat ditarik untuk membuat kontena baru di tempat lain. Namun, mereka semua akan memiliki Ubuntu: 18.04 sebagai gambar asas mereka, dan berjalan seolah-olah ia adalah sistem Ubuntu yang mereka jalankan.

Anda mungkin menyedari ini semasa cuba menarik gambar pelabuhan baru.



Membuat Docker Image dari Scratch

Ini menunjukkan berapa banyak lapisan yang ditarik sebelum aplikasi sebenar (yang berukuran hanya beberapa Megabait) dibawa masuk.

Atas sebab ini, kami ingin membuat apa yang dikenali sebagai gambar asas. Yang tidak dibina di atas yang lain. Kata kunci calar digunakan untuk menunjukkan bahawa lapisan ini tidak dibina di atas yang lain. Seperti:

Dari awal
## Selebihnya dari Dcokerfile

Kami pertama kali akan membuat aplikasi hello-world yang sederhana dan kemudian mengetahui bagaimana Dockerfile yang lain akan menjadi. Sistem hos adalah Ubuntu: 18.04 LTS dan kami menggunakan Docker versi 17.12.1-ce untuk percubaan.

Membuat perduaan statik

Docker container adalah sekumpulan proses yang berjalan terpencil dari sistem operasi yang lain. Satu-satunya perkara yang berkaitan dengan proses adalah Kernel. Kernel bertanggungjawab untuk menjadwalkan proses ini pada CPU, melakukan pengurusan memori dan beberapa tugas penyimpanan asas yang lain.

Tetapi kebanyakan aplikasi peringkat tinggi bergantung pada banyak perpustakaan sistem (seperti glibc, musl, klibc, dll ) dan banyak kebergantungan runtime seperti Python atau Node.js atau Java Runtime. Binari aplikasi tidak mempunyai semua perpustakaan yang ada di dalamnya, tetapi apabila ia mula dilaksanakan, ia memanggil perpustakaan tersebut dari sistem operasi host.

Kerana kita berusaha membuat gambar dari awal, kita tidak akan mendapat kebaikan ini. Oleh itu, aplikasi kita mesti berupa fail statik atau boleh dilaksanakan secara mandiri.

Mari mulakan dengan membuat folder bernama MyDockerImage dan membuat fail hello.cc di dalamnya.

$mkdirMyDockerImage
$CDMyDockerImage
$sentuhanhello.cc

Buka hello.cc menggunakan editor teks kegemaran anda dan tambahkan baris berikut di dalamnya.

#sertakan
menggunakan namespace std;
intutama(){
kos<< 'Helo! Mesej ini datang dari bekas n';
kembali 0;

}

Ini adalah program C ++ sederhana yang mencetak Hello! Mesej ini …

Atas sebab yang telah dibincangkan sebelumnya, kami akan menyusunnya menggunakan bendera statik. Penyusun yang digunakan adalah g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Untuk menyusun program, dalam direktori yang sama jalankan perintah berikut:

$ g++ -wahai-statikhello.DC

Ini membuat hello file boleh laku yang boleh dilaksanakan dalam direktori yang sama. Itu fail statik kami. Uji apakah berjalan seperti yang dimaksudkan dengan menyebut nama file di terminal.

$./hello

Sekarang kita bersedia untuk mengemas kini program mudah ini.

Dockerfile

Dockerfile terdiri dari sekumpulan peraturan yang mengambil fail aplikasi anda (seperti binari, fail sumber, dll) bersama dengan pelbagai parameter konfigurasi seperti susun atur sistem fail, port yang terdedah, dll dan mengubahnya menjadi fail gambar Docker. Anda kemudian boleh berkongsi fail gambar dengan sesiapa sahaja yang ingin menjalankan aplikasi tersebut.

Kami tidak akan menggali setiap pilihan yang ada untuk Dockerfile, sebaliknya kami akan menulis Dockerfile yang sangat minimalis. Di direktori yang sama, tempat hello executable anda berada, buat fail kosong bernama Dockerfile.

$sentuhanDockerfile

Buka dengan editor teks kegemaran anda, dan tulis baris berikut:

Dari awal
TAMBAH hello/
CMD['/ salam']

calar bukan gambar ibu bapa. Ia menunjukkan Docker bahawa gambar itu tidak dibina di atas gambar lain. Ia dibina dari awal. Perintah ADD akan mengambil binari statik bernama hello dari direktori semasa dan menambahkannya ke direktori root fail gambar. Apabila kita akhirnya menjalankan wadah berdasarkan gambar ini, hello executable akan dilihat di dalam direktori root itu sendiri di /hello.

Terakhir, garis CMD mempunyai rentetan / salam rentetan ini akan dilaksanakan sebagai perintah shell setiap kali wadah dibuat dari gambar ini, sehingga fail binari yang kami tambahkan ke bekas kami dan mencetak mesej yang kami tulis di aplikasi kami.

Mari membina imej dengan menggunakan membina dok arahan yang akan melalui kandungan Dockerfile dan menghasilkan gambar. Jalankan perintah berikut dalam direktori yang sama dengan Dockerfile dan binary yang boleh dilaksanakan.

$membina dok- taghello.

The –Tag hello bendera menetapkan nama gambar menjadi hello dan titik ( . ) pada akhir memberitahu membina dok untuk melihat direktori semasa untuk Dockerfile dan kandungan yang berkaitan.

Menjalankan bekas Docker

Untuk memeriksa sama ada gambar yang baru kita buat muncul dalam senarai gambar, jalankan:

$gambar dok

Perhatikan betapa kecilnya gambar hello jika dibandingkan dengan gambar lain. Walau apa pun, ia siap dijalankan sebagai wadah,

$dok lari hello

Itu sahaja! Anda membuat bekas minimalis pertama anda dari awal.

Pilihan lain

Walaupun membuat gambar dari awal selalu menjadi pilihan, orang sering cenderung membuat gambar dari distro Linux ringan lain. Contohnya gambar seperti alpine dan busybox adalah persekitaran yang sangat ringan dengan perpustakaan yang lebih kecil seperti musl dan bukannya glibc.

Menggunakannya sebagai gambar ibu bapa anda dengan menggunakan DARI alpine: terkini akan menghasilkan gambar yang lebih kecil juga. Oleh kerana gambar asasnya hanya berukuran 2-5 MB. Beritahu kami jika ada topik berkaitan Docker yang mungkin anda ingin kita bahas seterusnya. Anda boleh menghubungi kami melalui Twitter , Facebook atau melanggan kami melalui e-mel.