JavaRush /Blog Java /Random-MS /Perkenalan pertama dengan Docker

Perkenalan pertama dengan Docker

Diterbitkan dalam kumpulan
Kontena adalah mekanisme yang sering digunakan dalam amalan. Sebagai contoh, apabila anda mencari di headhunter, anda akan menemui 477 kekosongan pada hari ini yang menyebut Docker. Oleh itu, bukanlah idea yang buruk untuk membiasakan diri dengan apa itu. Saya harap ulasan ringkas ini akan membantu membentuk idea pertama. Nah, dia akan menyokongnya dengan bahan tambahan, seperti kursus tentang Udemy. Pengenalan pertama kepada Docker - 1

pengenalan

Dalam ulasan ringkas ini saya ingin menyentuh topik seperti kontena. Dan anda perlu bermula dengan memahami apa sebenarnya kontena. Menurut Wikipedia, " Pebendungan " ialah virtualisasi peringkat sistem pengendalian (iaitu BUKAN perkakasan) di mana kernel sistem pengendalian mengekalkan berbilang contoh ruang pengguna terpencil dan bukannya hanya satu. " Ruang pengguna " ialah ruang alamat memori maya sistem pengendalian yang dikhaskan untuk program pengguna. Contoh ruang pengguna (biasanya dipanggil bekas) adalah sama sepenuhnya dengan contoh sistem pengendalian tunggal dari sudut pandangan pengguna. Kernel memastikan pengasingan bekas lengkap, jadi program dari bekas yang berbeza tidak boleh menjejaskan satu sama lain. Ternyata kontena adalah virtualisasi perisian, iaitu, virtualisasi di peringkat sistem pengendalian, yang mana kernel sistem pengendalian bertanggungjawab. Salah satu ciri ciri pendekatan ini ialah semua bekas menggunakan kernel biasa, sama seperti sistem pengendalian hos (iaitu, bekas di mana bekas itu terletak). Ini membolehkan anda menyingkirkan overhed meniru perkakasan maya dan melancarkan contoh lengkap sistem pengendalian. Kita boleh mengatakan bahawa ini adalah virtualisasi "ringan". Kernel ialah bahagian tengah OS yang menyediakan aplikasi dengan akses yang diselaraskan kepada sumber komputer, seperti masa pemproses, memori, perkakasan luaran dan peranti input dan output luaran. Kernel juga biasanya menyediakan sistem fail dan perkhidmatan protokol rangkaian. Secara umum, ini adalah nadi kepada keseluruhan sistem. Untuk mendapatkan maklumat tambahan, mungkin berguna untuk menyemak bahan " Maklumat am tentang bekas ". Dan beberapa perkataan lagi untuk melengkapkan pengenalan. Kami kini mempunyai pemahaman bahawa sistem pengendalian mempunyai kernel. Ia menyediakan pengasingan untuk contoh ruang pengguna. Dalam konteks ini, anda mungkin menjumpai istilah " cgroups ". Ini adalah nama mekanisme kernel Linux yang membolehkan anda mencapainya. Oleh itu, kita boleh mengatakan bahawa laluan kontena bermula dengan sistem Linux. Walau bagaimanapun, bermula dengan Windows 10, sokongan untuk kontena juga muncul. Untuk bekerja dengan virtualisasi, anda perlu mengkonfigurasi sokongan virtualisasi dalam BIOS komputer anda. Bagaimana untuk melakukan ini bergantung pada komputer. Sebagai contoh, ia mungkin kelihatan seperti ini:
Pengenalan pertama kepada Docker - 2
Pada Windows anda boleh menyemak ini dengan cara yang berbeza. Sebagai contoh, anda boleh memuat turun utiliti khas dari tapak web Microsoft: Alat Pengesanan Maya Berbantukan Perkakasan . Nah, patut disebut satu lagi konsep penting - Hypervisor. Hypervisor ialah pemantau mesin maya, program untuk memastikan pelaksanaan selari beberapa sistem pengendalian pada komputer yang sama. Hipervisor memastikan bahawa sistem pengendalian diasingkan antara satu sama lain dan berkongsi sumber antara OS yang sedang berjalan. Salah satu hypervisor tersebut ialah Oracle VirtualBox .
Pengenalan pertama kepada Docker - 3

Docker

Jadi, apa itu virtualisasi adalah jelas. Tetapi bagaimana untuk menggunakannya? Dan di sini Docker datang untuk membantu kami. Docker ialah perisian untuk mengautomasikan penggunaan dan pengurusan aplikasi dalam persekitaran kontena. Perlu dimulakan dengan fakta bahawa Docker diwakili oleh konsep seperti Docker Enginge. Dan anda harus bermula dengan laman web rasmi Docker dan bahagian " Tinjauan Keseluruhan Docker ".
Pengenalan pertama kepada Docker - 4
Dokumentasi mengatakan bahawa docker terdiri daripada:
  • Pelayan Docker dipanggil proses Docker Daemon (dockerd).
  • Antara muka baris arahan, juga dikenali sebagai CLI (docker).
  • API REST yang menerangkan cara program boleh "bercakap" dengan deamon dan memberitahunya apa yang perlu dilakukan.
Sebelum kita menyelam lebih jauh, mari kita pasang docker, iaitu pasang daemon docker. Tapak web Docker mempunyai arahan untuk memasang " Docker untuk Windows ". Menariknya, Docker mempunyai keperluan sistemnya sendiri. Dan jika anda, seperti saya, mempunyai Windows lama, contohnya Windows 7, maka anda perlu menggunakan Docker Toolbox.
Pengenalan pertama kepada Docker - 5

Kotak Alat Docker

Untuk memasang Docker pada mesin lama yang tidak memenuhi keperluan sistem. Tapak web berkata demikian, "Penyelesaian Desktop Warisan". Mari pergi ke halaman " Docker Toolbox " dan muat turunnya. Set ini mempunyai berat kira-kira 211 megabait. Kami akan memasangnya sebagai lalai, iaitu, kami hanya akan bersetuju dengan segala-galanya tanpa menyusun semula bendera. Selepas pemasangan, kami akan menyemak sama ada semuanya baik-baik saja. Pada masa hadapan, medan perang kita akan menjadi barisan arahan. Saya mengesyorkan agar tidak menggunakan baris arahan Windows, kerana mungkin terdapat masalah yang tidak jelas dengannya. Lebih baik menggunakan bash shell. Pada Windows, cara yang paling disyorkan untuk mendapatkannya ialah memasang sistem kawalan versi git , ia masih berguna. Kerana "dibundel" dengannya akan menjadi bash yang kita perlukan. Untuk semakan ini saya akan menggunakan git bash. Anda juga boleh memasang bash dengan CYGWIN . Mari kita lancarkan bash atau git bash. Mari pastikan bahawa kami telah memasang Mesin Docker, juga dikenali sebagai Mesin Docker: docker-machine -version Apakah Mesin Docker ini? Docker Machine ialah utiliti untuk menguruskan hos dockerized (ini adalah hos yang mana Docker Engine dipasang). Jika kami sejurus selepas memasang mesin docker lihat Kotak Alat Docket menggunakan arahan docker-machine ls, kami akan melihat senarai kosong:
Pengenalan pertama kepada Docker - 6
Mari buat mesin baru. Untuk melakukan ini, kita perlu menjalankan arahan create : docker-machine create -- driver virtualbox javarush: Kita akan melihat log penciptaan mesin docker:
Pengenalan pertama kepada Docker - 7
Apa yang menarik minat kami di sini adalah seperti berikut. Apakah itu Boot2Docker? Ini adalah pengedaran Linux minimalis untuk menjalankan Enjin Docker (kami faham bahawa Docker berfungsi terima kasih kepada alat virtualisasi Linux, dan dalam Windows mekanisme yang diperlukan hanya muncul bermula dengan Windows 10). Pengedaran ini adalah berdasarkan pengedaran " Tiny Core Linux ". Juga disebut tentang VirtualBox VM. Ini kerana kami telah menetapkan --driver virtualbox. Mesin maya baharu telah dicipta dalam VirtualBox daripada imej Boot2Docker. Selepas penciptaan, kami boleh melancarkan VirtualBox (memandangkan VirtualBox dipasang dengan Docker Toolbox) dan melihat mesin maya yang dicipta untuk mesin docker:
Pengenalan pertama kepada Docker - 8
Selepas penciptaan, kami akan digesa untuk menjalankan arahan " docker-machine env " untuk mendapatkan pembolehubah persekitaran yang perlu dikonfigurasikan untuk menyambung ke mesin docker:
Pengenalan pertama kepada Docker - 9
Selepas melaksanakan arahan ini menggunakan mesin docker, kami menyambung kepada hos docker jauh (dalam kes ini, hos maya dihoskan pada Virtual Box) dan boleh melaksanakan arahan docker secara setempat seolah-olah kami melaksanakannya pada hos jauh. Untuk menyemak, kita boleh menjalankan arahan " maklumat pelabuhan ". Jika sambungan ke mesin docker tidak diwujudkan, kami akan menerima ralat. Dan jika semuanya baik-baik saja, maklumat tentang docker pada mesin docker. Sekarang adalah masa untuk memahami cara Docker secara amnya berfungsi dan cara menggunakannya.
Pengenalan pertama kepada Docker - 10

Bekas Docker

Jadi kita mempunyai buruh pelabuhan. Apa pula yang berlabuh ini? Dokumentasi Docker dan bahagian " Bermula " akan membantu kami memahami perkara ini . Bahagian pengenalan bahagian ini memperkenalkan Konsep Docker . Ia menyatakan bahawa Docker ialah platform untuk membangunkan, menyahpepijat dan menjalankan aplikasi dalam bekas. Oleh itu, perkara utama untuk Docker ialah bekas. Walaupun anda melihat logo docker, ia adalah ikan paus yang memegang bekas di belakangnya. Tetapi apa itu bekas? Seterusnya dalam bahagian " Imej dan Bekas " ia mengatakan bahawa bekas ialah contoh berjalan bagi Imej. Dan Imej ialah "pakej" yang mengandungi semua yang diperlukan untuk aplikasi (kod, persekitaran, perpustakaan, tetapan, dll.). Sekarang mari kita cuba sendiri. Tapak web Docker mempunyai bahagian yang dipanggil " Sampel Docker " yang merangkumi " Docker untuk Pemula ". Contoh-contoh dari sini kelihatan lebih menarik bagi saya. Jadi, kami tiba-tiba ingin berkenalan dengan Alpine Linux dan kami boleh melakukannya menggunakan bekas Docker. Untuk mendapatkan imej, kita mesti "tarik" atau "tarik" keluar. Oleh itu, kami melaksanakan arahan tarik docker :docker pull apline
Pengenalan pertama kepada Docker - 11
Seperti yang kita lihat, kami memuat turun dari suatu tempat. Secara lalai, Docker melihat repositorinya pada rangkaian https://hub.docker.com . Selepas berjaya mendapatkan semula imej, kami boleh menyemak senarai imej yang tersedia dengan menjalankan arahan imej docker :
Pengenalan pertama kepada Docker - 12
Sekarang kita mempunyai imej apline. Memandangkan bekas adalah contoh imej yang sedang berjalan, mari lancarkan imej ini. Mari lancarkan bekas menggunakan arahan docker run alpine. Seperti yang kita lihat, tiada apa yang berlaku. Jika kami melaksanakan arahan docker psuntuk memaparkan semua bekas aktif, kami juga tidak akan mendapat apa-apa. Tetapi jika kita melaksanakan, docker ps -akita akan melihat semua bekas:
Perkenalan pertama dengan Docker - 13
Masalahnya ialah kami tidak melancarkan Docker dalam mod interaktif. Oleh itu, dia melaksanakan perintah itu dan berhenti. Perintahnya adalah untuk membuka terminal. Mari kita lakukan perkara yang sama, tetapi dalam mod interaktif (dengan bendera -it ):
Pengenalan pertama kepada Docker - 14
Seperti yang anda lihat, setelah mengatasi satu kesilapan dan menggunakan petunjuk, kami sampai ke bekas dan boleh bekerja di dalamnya! Untuk keluar dari bekas tanpa menghentikan operasinya, anda boleh menekan Ctrl + p + q. Jika kita jalankan sekarang docker ps, kita akan melihat satu bekas aktif. Untuk memasukkan bekas yang sudah berjalan, jalankan perintah docker exec :
Perkenalan pertama dengan Docker - 15
Saya mengesyorkan membaca huraian sampel Docker untuk mendapatkan penerangan yang sangat baik tentang bagaimana ini semua berlaku: " 1.0 Menjalankan bekas pertama anda ". Saya suka kerana semuanya ditulis di sana dengan cara yang sangat mudah diakses dan difahami. Untuk menyusun semula secara ringkas, kami disambungkan menggunakan mesin docker kepada mesin maya yang menjalankan Docker Daemon. Menggunakan CLI melalui REST API, kami meminta untuk melancarkan imej alpine. Docker menemuinya dan oleh itu tidak memuat turunnya. Docker mencipta bekas baharu dan menjalankan perintah yang kami tentukan dalam bekas ini. Dan semua ini, sudah tentu, adalah baik. Tetapi mengapa kita memerlukan semua ini? Dan di sini kita perlu memikirkan bagaimana docker mencipta imej. Dan dia menciptanya berdasarkan fail docker.
Perkenalan pertama dengan Docker - 16

Dockerfile

Seperti yang dinyatakan dalam rujukan Dockerfile , dockerfile ialah fail teks yang mengandungi semua arahan untuk mendapatkan imej. Malah, semua imej yang kami terima (walaupun Alpine, daripada contoh di atas) dicipta daripada fail docker. Mari bina imej kami dengan aplikasi Java. Dan pertama sekali kita memerlukan aplikasi Java ini. Saya cadangkan menggunakan sistem binaan Gradle, yang boleh anda baca lebih lanjut dalam ulasan ringkas ini: " Pengenalan Ringkas kepada Gradle ". Akan membantu kami dalam mencipta projek " Gradle Build init plugin ". Mari buat aplikasi Java baharu menggunakan Gradle: gradle init --type java-application Perintah ini mencipta projek Java templat. Ini adalah aplikasi kendiri, tetapi kami ingin mencipta aplikasi web. Mari kita keluarkan kelas App dan AppTest (ia dijana secara automatik oleh Gradle Build Init Plugin). Untuk mencipta aplikasi web dengan cepat, kami akan menggunakan tutorial daripada Gradle: " Membina Aplikasi Web Java ". Mengikut tutorial, mari kita lakukan: Anda perlu berhati-hati di sini. Seperti biasa, mungkin terdapat ralat dalam contoh. Ini dia:
Pengenalan pertama kepada Docker - 17
Sekarang, untuk mengujinya, mari tambah pemalam gretty ke build.gradle, seperti yang ditunjukkan dalam bahagian " Tambah pemalam gretty dan jalankan apl ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Sungguh menarik bahawa Gretty tidak melihat ralat dalam HelloServlet, yang diterangkan di atas. Ini membuktikan bahawa aplikasi boleh berkelakuan berbeza dalam persekitaran yang berbeza. Gretty boleh berfungsi di mana pelayan kendiri biasa akan menimbulkan ralat. Yang tinggal hanyalah untuk memastikan aplikasi berfungsi dengan betul. Jom buat:gradle appRun
Perkenalan pertama dengan Docker - 18
Jika semuanya baik-baik saja, gunakan arahan gradle waruntuk mengumpul arkib dengan perang sambungan (arkib web). Secara lalai, gradle membinanya dalam \build\libs. Sekarang, kami bersedia untuk menulis fail docker kami. Menggunakan " rujukan Dockerfile " kami akan mencipta Dockerfile. Mari buat fail yang dipanggil "Dockerfile" dalam akar projek Java kami (di tempat yang sama dengan skrip binaan). Jom buka untuk edit. Fail ini mempunyai formatnya sendiri, diterangkan dalam bahagian " Rujukan Fail Docker: Format ". Mana-mana fail docker bermula dengan pernyataan FROM, menunjukkan "imej asas". Kita boleh mengatakan bahawa ini adalah imej induk atas dasar yang kita buat imej kita. Sangat mudah untuk kita memilih imej induk. Aplikasi web memerlukan pelayan web. Sebagai contoh, kita boleh menggunakan pelayan web Tomcat. Kami pergi ke repositori Docker rasmi, yang dipanggil docker hub . Kami melihat ke sana untuk melihat sama ada imej yang kami perlukan ada di sana:
Perkenalan pertama dengan Docker - 19
Ia juga bernilai memahami bahawa imej tomcat dipanggil. Tetapi selain nama ia mempunyai tag. Tag adalah seperti versi. Imej Tomcat versi berbeza berbeza dalam versi Tomcat yang digunakan, versi jre yang mana dan imej asas yang mana. Sebagai contoh, kita boleh mendapatkan imej docker pull tomcat:9-jre8-alpine Ia menggunakan versi 9 tomcat, jre versi 8 dan imej alpine sebagai pangkalan. Ini boleh menjadi penting untuk mengurangkan saiz imej kami:
Perkenalan pertama dengan Docker - 20
Seperti yang kita lihat, perbezaannya sangat besar. Jika kami membina imej kami berdasarkan tomcata alpine, kami akan bermula dengan hanya 100 megabait, dan bukan dengan 600. Sehubungan itu, kami akan menambah kandungan berikut pada fail docker yang dibuat sebelum ini:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
Dan sekarang mari kita laksanakan arahan untuk membina imej: docker build -t jrdocker ..
Perkenalan pertama dengan Docker - 21
-t- ini adalah tag, iaitu, apa yang dipanggil imej yang dipasang. Titik di penghujung bermakna kami menambah direktori semasa (direktori tempat fail docker berada dan tempat kami menjalankan arahan) ke Build context. Build context- ini ialah konteks fail tersebut yang tersedia semasa membuat fail docker. Seperti yang anda lihat, terima kasih kepada ini, kami dapat menyalin fail perang yang dipasang ke dalam imej kami, ke dalam direktori pelayan web. Sekarang mari jalankan imej kami:docker run -d --rm -p 8888:8080 jrdocker
Perkenalan pertama dengan Docker - 22
Untuk memahami sama ada pelayan telah bermula, anda boleh melihat log dari bekas. Log boleh diperoleh menggunakan arahan log docker, menentukan bekas dengan ID atau namanya. Sebagai contoh:
Perkenalan pertama dengan Docker - 23
Nah, jangan lupa bahawa kita sentiasa boleh pergi ke bekas yang sedang berjalan mengikut nama dengan arahan: winpty docker exec -it NameКонтейнера sh Sekarang yang tinggal hanyalah untuk menyambung. Sebelum ini, kami menyatakan EXPOSE , iaitu, kami membenarkan akses kepada port 8080 dari dalam bekas. Apabila kami melancarkan kontena itu sendiri, kami menentukan teg -p ( port masuk ), dengan itu mengaitkan port 8080 pada bekas (pelayan web Tomcat sedang menunggu sambungan di sana) dengan port 8888 pada mesin dengan daemon docker. Seperti yang kami ingat, kami melancarkan daemon docker bukan secara langsung, tetapi melalui mesin docker. Oleh itu, sekali lagi kami akan meminta data pada mesin docker kami menggunakan perintah ls docker-machine dan menghubungi pelayan dalam bekas:
Pengenalan pertama kepada Docker - 24
Oleh itu, anda dan saya baru sahaja melancarkan aplikasi web kami dalam bekas Docker! ) Saya juga ingin mengambil perhatian yang berikut. Dalam kes masalah akses, anda harus ingat bahawa mesin Docker pertama sekali ialah mesin maya Virtual Box. Mungkin terdapat masalah dengan tetapan rangkaian mesin maya. Konfigurasi VMBox yang berfungsi mungkin kelihatan seperti ini:
Perkenalan pertama dengan Docker - 25
Perkenalan pertama dengan Docker - 26

Lapisan

Kami telah mengetahui bahawa imej dicipta daripada dockerfiles dan dockerfiles ialah satu set arahan. Kami juga mendapati bahawa dockerfile mempunyai induk. Dan bahawa saiz imej adalah berbeza. Menariknya, anda boleh melihat sejarah bagaimana imej itu dibina menggunakan arahan sejarah docker . Sebagai contoh:
Perkenalan pertama dengan Docker - 27
Adalah penting untuk mengatakan ini untuk memahami bahawa, pada dasarnya, setiap imej adalah satu set imej. Setiap perubahan imej (setiap arahan baharu dalam fail docker) mencipta lapisan baharu yang mempunyai ID sendiri. Anda boleh membaca lebih lanjut mengenai lapisan dalam dokumentasi " Docker: Imej dan Lapisan ". Saya juga sangat mengesyorkan membaca artikel tentang Habré: " Imej dan bekas docker dalam gambar ."

Kesimpulan

Saya harap gambaran ringkas ini cukup untuk menarik minat anda dalam kontena. Di bawah adalah pautan ke bahan tambahan yang mungkin berguna: #Viacheslav
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION