JavaRush /Java Blog /Random-ID /Kenalan pertama dengan Docker
Viacheslav
Level 3

Kenalan pertama dengan Docker

Dipublikasikan di grup Random-ID
Kontainerisasi adalah mekanisme yang sering digunakan dalam praktik. Misalnya, saat Anda mencari di headhunter, Anda akan menemukan 477 lowongan hari ini yang menyebutkan Docker. Oleh karena itu, bukanlah ide yang buruk untuk membiasakan diri dengan apa itu. Saya harap ulasan singkat ini akan membantu membentuk ide pertama. Ya, dia akan mendukungnya dengan materi tambahan, seperti kursus tentang Udemy. Pengenalan pertama ke Docker - 1

Perkenalan

Dalam ulasan singkat ini saya ingin menyentuh topik seperti containerisasi. Dan Anda harus mulai dengan memahami apa sebenarnya containerisasi itu. Menurut Wikipedia, “ Kontainerisasi ” adalah virtualisasi tingkat sistem operasi (yaitu BUKAN perangkat keras) di mana kernel sistem operasi memelihara beberapa ruang pengguna yang terisolasi, bukan hanya satu. " Ruang pengguna " adalah ruang alamat memori virtual sistem operasi yang disediakan untuk program pengguna. Instance ruang pengguna (biasa disebut container) sepenuhnya identik dengan instance sistem operasi tunggal dari sudut pandang pengguna. Kernel memastikan isolasi container yang lengkap, sehingga program dari container yang berbeda tidak dapat saling mempengaruhi. Ternyata containerization adalah virtualisasi perangkat lunak, yaitu virtualisasi pada tingkat sistem operasi, yang menjadi tanggung jawab kernel sistem operasi. Salah satu ciri khas dari pendekatan ini adalah bahwa semua container menggunakan kernel yang sama, sama dengan sistem operasi host (yaitu, kernel tempat container berada). Hal ini memungkinkan Anda menghilangkan biaya tambahan untuk meniru perangkat keras virtual dan meluncurkan sistem operasi yang lengkap. Kita dapat mengatakan bahwa ini adalah virtualisasi “ringan”. Kernel adalah bagian sentral dari OS yang menyediakan aplikasi dengan akses terkoordinasi ke sumber daya komputer, seperti waktu prosesor, memori, perangkat keras eksternal, dan perangkat input dan output eksternal. Kernel juga biasanya menyediakan sistem file dan layanan protokol jaringan. Secara umum, ini adalah jantung dari keseluruhan sistem. Sebagai tambahan informasi, mungkin bermanfaat untuk mengulas materi “ Informasi umum tentang kontainer ”. Dan beberapa kata lagi untuk melengkapi pendahuluan. Kami sekarang memiliki pemahaman bahwa sistem operasi memiliki kernel. Ini menyediakan isolasi untuk instance ruang pengguna. Dalam konteks ini, Anda mungkin menemukan istilah " cgroups ". Ini adalah nama mekanisme kernel Linux yang memungkinkan Anda mencapai hal ini. Oleh karena itu, kita dapat mengatakan bahwa jalur containerisasi dimulai dengan sistem Linux. Namun, dimulai dengan Windows 10, dukungan untuk containerisasi juga muncul. Untuk bekerja dengan virtualisasi, Anda perlu mengkonfigurasi dukungan virtualisasi di BIOS komputer Anda. Cara melakukan ini tergantung pada komputer. Misalnya, mungkin terlihat seperti ini:
Pengenalan pertama ke Docker - 2
Di Windows, Anda dapat memeriksanya dengan berbagai cara. Misalnya, Anda dapat mengunduh utilitas khusus dari situs web Microsoft: Alat Deteksi Virtualisasi Berbantuan Perangkat Keras . Nah, perlu disebutkan konsep penting lainnya - Hypervisor. Hypervisor adalah monitor mesin virtual, sebuah program untuk memastikan eksekusi paralel beberapa sistem operasi pada komputer yang sama. Hypervisor memastikan bahwa sistem operasi diisolasi satu sama lain dan berbagi sumber daya antar OS yang berjalan. Salah satu hypervisor tersebut adalah Oracle VirtualBox .
Pengenalan pertama ke Docker - 3

Buruh pelabuhan

Jadi, apa itu virtualisasi sudah jelas. Tapi bagaimana cara menggunakannya? Dan di sinilah Docker membantu kami. Docker adalah perangkat lunak untuk mengotomatiskan penerapan dan pengelolaan aplikasi di lingkungan dalam container. Ada baiknya dimulai dengan fakta bahwa Docker diwakili oleh konsep seperti Docker Enginge. Dan Anda harus mulai dengan situs web resmi Docker dan bagian “ Ikhtisar Docker ”.
Pengenalan pertama ke Docker - 4
Dokumentasi mengatakan bahwa buruh pelabuhan terdiri dari:
  • Server Docker disebut proses Docker Daemon (dockerd).
  • Antarmuka baris perintah, juga dikenal sebagai CLI (buruh pelabuhan).
  • REST API yang menjelaskan bagaimana program dapat "berbicara" dengan deamon dan memberitahukan apa yang harus dilakukan.
Sebelum kita mendalami lebih jauh, mari kita instal docker, yaitu menginstal daemon docker. Situs web Docker memiliki instruksi untuk menginstal " Docker untuk Windows ". Menariknya, Docker memiliki persyaratan sistemnya sendiri. Dan jika Anda, seperti saya, memiliki Windows lama, misalnya Windows 7, maka Anda perlu menggunakan Docker Toolbox.
Pengenalan pertama ke Docker - 5

Kotak Alat Docker

Untuk menginstal Docker pada mesin lama yang tidak memenuhi persyaratan sistem. Situs webnya mengatakan demikian, “Solusi Desktop Lama”. Ayo buka halaman " Docker Toolbox " dan unduh. Set ini beratnya sekitar 211 megabyte. Kami akan menginstalnya sebagai default, yaitu, kami hanya akan dengan patuh menyetujui semuanya tanpa mengatur ulang tandanya. Setelah instalasi, kami akan memeriksa apakah semuanya baik-baik saja. Di masa depan, medan perang kita akan menjadi garis komando. Saya sarankan untuk tidak menggunakan baris perintah Windows, karena mungkin ada masalah yang tidak terlihat jelas dengannya. Lebih baik menggunakan bash shell. Di Windows, cara yang paling direkomendasikan untuk mendapatkannya adalah dengan menginstal sistem kontrol versi git , ini akan tetap berguna. Karena “dibundel” dengannya akan menjadi pesta yang kita butuhkan. Untuk ulasan ini saya akan menggunakan git bash. Anda juga dapat menginstal bash dengan CYGWIN . Mari kita luncurkan bash atau git bash. Pastikan kita telah menginstal Mesin Docker, juga dikenal sebagai Mesin Docker: docker-machine -version Apa itu Mesin Docker? Docker Machine adalah utilitas untuk mengelola host yang di-docker (ini adalah host tempat Docker Engine diinstal). Jika kita segera setelah menginstal Docket Toolbox melihat mesin buruh pelabuhan menggunakan perintah docker-machine ls, kita akan melihat daftar kosong:
Pengenalan pertama ke Docker - 6
Mari kita buat mesin baru. Untuk melakukan ini, kita perlu menjalankan perintah create : docker-machine create -- driver virtualbox javarush: Kita akan melihat log pembuatan mesin buruh pelabuhan:
Pengenalan pertama ke Docker - 7
Yang menarik bagi kami di sini adalah sebagai berikut. Apa itu Boot2Docker? Ini adalah distribusi Linux minimalis untuk menjalankan Mesin Docker (kami memahami bahwa Docker bekerja berkat alat virtualisasi Linux, dan di Windows mekanisme yang diperlukan hanya muncul mulai dari Windows 10). Distribusi ini didasarkan pada distribusi " Tiny Core Linux ". Disebutkan juga tentang VirtualBox VM. Ini karena kami telah menentukannya --driver virtualbox. Mesin virtual baru telah dibuat di VirtualBox dari image Boot2Docker. Setelah pembuatan, kita dapat meluncurkan VirtualBox (karena VirtualBox diinstal dengan Docker Toolbox) dan melihat mesin virtual yang dibuat untuk mesin buruh pelabuhan:
Pengenalan pertama ke Docker - 8
Setelah pembuatan, kita akan diminta untuk menjalankan perintah “ docker-machine env ” untuk mendapatkan variabel lingkungan yang perlu dikonfigurasi untuk terhubung ke mesin buruh pelabuhan:
Pengenalan pertama ke Docker - 9
Setelah menjalankan perintah ini menggunakan mesin buruh pelabuhan, kami terhubung ke host docker jarak jauh (dalam hal ini, host virtual yang dihosting di Virtual Box) dan dapat menjalankan perintah buruh pelabuhan secara lokal seolah-olah kami menjalankannya di host jarak jauh. Untuk memeriksanya, kita bisa menjalankan perintah " docker info ". Jika koneksi ke mesin buruh pelabuhan tidak dibuat, kami akan menerima pesan kesalahan. Dan jika semuanya baik-baik saja, informasi tentang buruh pelabuhan di mesin buruh pelabuhan. Sekaranglah waktunya untuk memahami cara kerja Docker secara umum dan cara menggunakannya.
Pengenalan pertama ke Docker - 10

Kontainer Docker

Jadi kita punya buruh pelabuhan. Apa sih buruh pelabuhan ini? Dokumentasi Docker dan bagian “ Memulai ” akan membantu kita memahami hal ini . Bagian pengantar bagian ini memperkenalkan Konsep Docker . Disebutkan bahwa Docker adalah platform untuk mengembangkan, men-debug, dan menjalankan aplikasi dalam container. Oleh karena itu, hal utama bagi Docker adalah container. Bahkan jika Anda melihat logo buruh pelabuhan, itu adalah seekor ikan paus yang memegang kontainer di punggungnya. Tapi apa itu wadah? Selanjutnya di bagian " Gambar dan Kontainer " dikatakan bahwa sebuah wadah adalah instance Gambar yang sedang berjalan. Dan Gambar adalah “paket” yang berisi semua yang diperlukan untuk aplikasi (kode, lingkungan, perpustakaan, pengaturan, dll.). Sekarang mari kita mencobanya sendiri. Situs web Docker memiliki bagian yang disebut " Sampel Docker " yang mencakup " Docker untuk Pemula ". Contoh dari sini tampak lebih menarik bagi saya. Jadi, kami tiba-tiba ingin mengenal Alpine Linux dan kami bisa melakukannya menggunakan container Docker. Untuk mendapatkan suatu gambar, kita harus “menarik” atau “menariknya” keluar. Oleh karena itu, kami menjalankan perintah docker pull :docker pull apline
Pengenalan pertama ke Docker - 11
Seperti yang bisa kita lihat, kita mengunduh dari suatu tempat. Secara default, Docker melihat repositorinya di jaringan https://hub.docker.com . Setelah berhasil mengambil image, kita dapat memeriksa daftar image yang tersedia dengan menjalankan perintah docker images :
Pengenalan pertama ke Docker - 12
Sekarang kita memiliki gambar apline. Karena container adalah contoh gambar yang sedang berjalan, mari kita luncurkan gambar ini. Mari luncurkan wadah menggunakan perintah docker run alpine. Seperti yang bisa kita lihat, tidak terjadi apa-apa. Jika kita menjalankan perintah docker psuntuk menampilkan semua container yang aktif, kita juga tidak akan mendapatkan apa-apa. Namun jika kita mengeksekusi, docker ps -akita akan melihat semua containernya:
Kenalan pertama dengan Docker - 13
Masalahnya adalah kami tidak meluncurkan Docker dalam mode interaktif. Oleh karena itu, dia menjalankan perintah dan berhenti. Perintahnya adalah membuka terminal. Mari kita lakukan hal yang sama, tetapi dalam mode interaktif (dengan flag -it ):
Pengenalan pertama ke Docker - 14
Seperti yang Anda lihat, setelah mengatasi satu kesalahan dan menggunakan petunjuknya, kami sampai ke wadah dan dapat mengerjakannya! Untuk keluar dari wadah tanpa menghentikan pengoperasiannya, Anda dapat menekan Ctrl + p + q. Jika kita jalankan sekarang docker ps, kita akan melihat satu container aktif. Untuk masuk ke container yang sudah berjalan, jalankan perintah docker exec :
Kenalan pertama dengan Docker - 15
Saya sarankan membaca deskripsi sampel Docker untuk penjelasan yang sangat baik tentang bagaimana semua ini terjadi: “ 1.0 Menjalankan container pertama Anda ”. Saya menyukainya karena semuanya ditulis di sana dengan cara yang sangat mudah diakses dan dimengerti. Singkatnya, kami terhubung menggunakan mesin buruh pelabuhan ke mesin virtual yang menjalankan Docker Daemon. Menggunakan CLI melalui REST API, kami meminta untuk meluncurkan gambar alpine. Docker menemukannya dan karena itu tidak mengunduhnya. Docker membuat container baru dan menjalankan perintah yang kami tentukan di container ini. Dan semua ini, tentu saja, bagus. Tapi mengapa kita membutuhkan semua ini? Dan di sini kita perlu mencari tahu bagaimana buruh pelabuhan membuat gambar. Dan dia membuatnya berdasarkan dockerfile.
Pengenalan pertama ke Docker - 16

file buruh pelabuhan

Sebagaimana dinyatakan dalam referensi Dockerfile , dockerfile adalah file teks yang berisi semua perintah untuk mendapatkan gambar. Faktanya, semua gambar yang kami terima (bahkan Alpine, dari contoh di atas) dibuat dari dockerfile. Mari kita bangun citra kita dengan aplikasi Java. Dan pertama-tama kita membutuhkan aplikasi Java ini. Saya sarankan menggunakan sistem build Gradle, yang dapat Anda baca selengkapnya di ulasan singkat ini: “ Pengantar Singkat tentang Gradle ”. Akan membantu kami dalam membuat proyek " Plugin init Gradle Build ". Mari kita membuat aplikasi Java baru menggunakan Gradle: gradle init --type java-application Perintah ini membuat proyek template Java. Ini adalah aplikasi mandiri, tapi kami ingin membuat aplikasi web. Mari kita hapus kelas App dan AppTest (keduanya dihasilkan secara otomatis oleh Plugin Gradle Build Init). Untuk membuat aplikasi web dengan cepat, kita akan menggunakan tutorial dari Gradle: “ Membangun Aplikasi Web Java ”. Menurut tutorialnya, mari kita lakukan: Anda harus berhati-hati di sini. Seperti biasa, mungkin ada kesalahan dalam contoh. Ini dia:
Pengenalan pertama ke Docker - 17
Sekarang, untuk mengujinya, mari tambahkan plugin gretty ke build.gradle, seperti yang ditunjukkan di bagian " Tambahkan plugin gretty dan jalankan aplikasi ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Menariknya, Gretty tidak melihat kesalahan HelloServletyang dijelaskan di atas. Hal ini membuktikan bahwa suatu aplikasi dapat berperilaku berbeda di lingkungan yang berbeda. Gretty dapat bekerja di mana server mandiri biasa akan menimbulkan kesalahan. Yang tersisa hanyalah memeriksa apakah aplikasi berfungsi dengan benar. Mari lakukan:gradle appRun
Kenalan pertama dengan Docker - 18
Jika semuanya baik-baik saja, gunakan perintah gradle waruntuk mengumpulkan arsip dengan ekstensi perang (arsip web). Secara default, gradle membangunnya dalam format \build\libs. Sekarang, kami siap untuk menulis file docker kami. Menggunakan " Referensi Dockerfile " kita akan membuat Dockerfile. Mari kita buat file bernama "Dockerfile" di root proyek Java kita (di tempat yang sama dengan skrip build). Mari kita buka untuk diedit. File ini memiliki formatnya sendiri, dijelaskan di bagian " Referensi Dockerfile: Format ". Semua dockerfile dimulai dengan pernyataan FROM, yang menunjukkan "gambar dasar". Kita dapat mengatakan bahwa ini adalah gambar induk yang menjadi dasar kita membuat gambar kita. Sangat mudah bagi kita untuk memilih gambar induk. Aplikasi web memerlukan server web. Misalnya kita bisa menggunakan server web Tomcat. Kami pergi ke repositori Docker resmi, yang disebut docker hub . Kami melihat ke sana untuk melihat apakah gambar yang kami butuhkan ada di sana:
Kenalan pertama dengan Docker - 19
Perlu dipahami juga apa yang disebut dengan gambar kucing jantan. Tapi selain namanya ada tagnya. Tag itu seperti sebuah versi. Gambar Tomcat dari berbagai versi berbeda dalam versi Tomcat mana yang digunakan, versi jre mana, dan gambar dasar mana. Misalnya, kita bisa mendapatkan gambar docker pull tomcat:9-jre8-alpine yang menggunakan Tomcat versi 9, jre versi 8, dan gambar alpine sebagai dasarnya. Ini penting untuk mengurangi ukuran gambar kita:
Pengenalan pertama ke Docker - 20
Seperti yang kita lihat, perbedaannya sangat besar. Jika kita membangun image kita berdasarkan Tomcata alpine, kita akan mulai dengan hanya 100 megabyte, dan bukan dengan 600. Oleh karena itu, kita akan menambahkan konten berikut ke dockerfile yang dibuat sebelumnya:
# Базовый образ, "наследуемся" от него
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 jalankan perintah untuk membuat gambar: docker build -t jrdocker ..
Kenalan pertama dengan Docker - 21
-t- ini adalah tag, yaitu apa yang disebut gambar rakitan. Titik di akhir berarti kita menambahkan direktori saat ini (direktori tempat file docker berada dan tempat kita menjalankan perintah) ke Build context. Build context- ini adalah konteks file-file yang tersedia saat membuat dockerfile. Seperti yang Anda lihat, berkat ini kami dapat menyalin file perang yang telah dirakit ke dalam gambar kami, ke direktori server web. Sekarang mari kita jalankan gambar kita:docker run -d --rm -p 8888:8080 jrdocker
Kenalan pertama dengan Docker - 22
Untuk memahami apakah server telah dimulai, Anda dapat melihat log dari container. Log dapat diperoleh dengan menggunakan perintah docker logs, yang menentukan kontainer berdasarkan ID atau namanya. Misalnya:
Kenalan pertama dengan Docker - 23
Nah, jangan lupa bahwa kita selalu bisa masuk ke container yang sedang berjalan berdasarkan namanya dengan perintah: winpty docker exec -it NameКонтейнера sh Sekarang yang tersisa hanyalah menghubungkan. Sebelumnya, kami menentukan EXPOSE , yaitu, kami mengizinkan akses ke port 8080 dari dalam wadah. Saat kami meluncurkan wadah itu sendiri, kami menentukan tag -p ( port masuk ), sehingga menghubungkan port 8080 pada wadah (server web Tomcat sedang menunggu koneksi di sana) dengan port 8888 pada mesin dengan daemon buruh pelabuhan. Seingat kami, kami meluncurkan daemon buruh pelabuhan tidak secara langsung, tetapi melalui mesin buruh pelabuhan. Oleh karena itu, mari kita sekali lagi meminta data pada mesin buruh pelabuhan kita menggunakan perintah docker-machine ls dan menghubungi server di dalam wadah:
Pengenalan pertama ke Docker - 24
Jadi, Anda dan saya baru saja meluncurkan aplikasi web kita di container Docker! ) Saya juga ingin mencatat hal berikut. Jika terjadi masalah akses, Anda harus ingat bahwa mesin Docker adalah mesin virtual Virtual BOX yang pertama dan terpenting. Mungkin ada masalah dengan pengaturan jaringan mesin virtual. Konfigurasi VMBox yang berfungsi mungkin terlihat seperti ini:
Kenalan pertama dengan Docker - 25
Kenalan pertama dengan Docker - 26

Lapisan

Kita telah mengetahui bahwa gambar dibuat dari dockerfiles dan dockerfiles adalah sekumpulan perintah. Kami juga menemukan bahwa dockerfile memiliki induk. Dan ukuran gambarnya berbeda. Menariknya, Anda dapat melihat riwayat bagaimana gambar itu dibuat menggunakan perintah docker history . Misalnya:
Kenalan pertama dengan Docker - 27
Penting untuk mengatakan hal ini untuk memahami bahwa, pada dasarnya, setiap gambar adalah sekumpulan gambar. Setiap perubahan gambar (setiap perintah baru di dockerfile) membuat lapisan baru yang memiliki ID sendiri. Anda dapat membaca lebih lanjut tentang lapisan di dokumentasi " Docker: Gambar dan Lapisan ". Saya juga sangat merekomendasikan membaca artikel di Habré: “ Gambar dan wadah Docker dalam gambar .”

Kesimpulan

Saya harap gambaran singkat ini cukup membuat Anda tertarik pada containerization. Di bawah ini tautan ke materi tambahan yang mungkin berguna: #Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION