Ini hanyalah demonstrasi sederhana untuk mendapatkan pemahaman dasar tentang cara kerja Docker sambil bekerja langkah demi langkah. Saya mempelajari docker seperti ini dan membuat repo ini untuk menyelesaikan beberapa masalah yang saya hadapi selama pengalaman belajar saya sehingga dapat membantu pemula lainnya. Semoga Anda menikmati belajar. Jika Anda menyukainya, berikan di GitHub dan dukung pekerjaan saya.
Penting:- Dengan melihat ukuran readme Anda mungkin berpikir dua kali, tetapi sejujurnya, jika Anda bekerja dari awal Anda tidak akan mengalami masalah apa pun dan terus belajar.
Wikipedia mendefinisikan Docker sebagai
adalah sekumpulan produk platform as a service (PaaS) yang menggunakan virtualisasi tingkat OS untuk mengirimkan perangkat lunak dalam paket yang disebut container. Kontainer diisolasi satu sama lain dan menggabungkan perangkat lunak, pustaka, dan file konfigurasinya; mereka dapat berkomunikasi satu sama lain melalui saluran yang terdefinisi dengan baik. Semua container dijalankan oleh satu kernel sistem operasi dan oleh karena itu menggunakan sumber daya yang lebih sedikit dibandingkan mesin virtual.
Docker membantu Anda dalam menyebarkan aplikasi Anda secara lebih efisien di kotak pasir (disebut container) untuk dijalankan di sistem operasi host yaitu Mac. Keuntungan utama buruh pelabuhan adalah memungkinkan Anda mengemas perangkat lunak dengan semua dependensinya ke dalam satu unit standar.
Container merupakan solusi agar perangkat lunak dapat berjalan tanpa masalah saat dipindahkan dari satu lingkungan komputasi ke lingkungan komputasi lainnya. Ini bisa dari lingkungan pementasan ke produksi atau mungkin dari laptop ke laptop lain dengan sistem operasi lain.
Kontainer menyediakan mekanisme pengemasan logis di mana aplikasi Anda dapat diabstraksi dari lingkungan tempat aplikasi tersebut dijalankan. Perbedaan utamanya adalah setiap container tidak memerlukan OS yang lengkap. Semua container di satu host berbagi satu OS. Ini membantu membebaskan sejumlah besar sumber daya sistem seperti CPU, RAM.
Setelah Anda selesai menginstal Docker, uji instalasi Docker Anda dengan menjalankan perintah berikut:
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
adalah dokumen teks yang berisi semua perintah yang dapat Anda panggil pada baris perintah untuk membuat gambar. Buat file hello.js
dan salin kode ini ke dalamnya. Di sini kami menulis kode JS sederhana untuk menampilkan Hello World di localhost:8888
. var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
dan salin kode ini ke dalamnya. FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
Meskipun ini adalah Dockerfile pertama yang pernah Anda lihat, menurut saya Anda sudah bisa menebak apa yang terjadi di sini. Instruksi Dockerfile adalah FROM, ENV, LABEL, RUN , ADD , EXPOSE, dan ENTRYPOINT; mereka berada di ibu kota tapi itu adalah konvensi, bukan keharusan.
Pada tingkat tinggi, Dockerfile ini memberikan instruksi seperti Mulai dengan gambar node, tambahkan “[email protected]”
sebagai pengelola, jalankan npm install
untuk menginstal dependensi, salin file dalam kode aplikasi, dokumentasikan port jaringan aplikasi, dan atur hello.js sebagai aplikasi default untuk dijalankan.
Sekarang kita akan membuat image buruh pelabuhan di mesin lokal kita. Buka terminal Anda di folder proyek saat ini dan jalankan
docker build -t helloworld .
Di sini Anda memberi tahu Docker untuk membuat image bernama helloworld
berdasarkan konten direktori saat ini (perhatikan titik (.) di akhir perintah build). Docker akan mencari Dockerfile di direktori dan membangun image berdasarkan instruksi di file.
Setelah membuat image buruh pelabuhan, langkah berikutnya adalah menjalankan image tersebut dan melihat apakah image tersebut berfungsi:
docker run -p 8888:8888 helloworld
Perintah yang baru saja kita jalankan menggunakan port 8888 untuk server di dalam container dan mengeksposnya secara eksternal pada port 8888. Buka URL dengan port 8888:
Selamat! Anda telah berhasil membuat image buruh pelabuhan pertama Anda.
Gambar Docker seperti templat mesin virtual dan digunakan untuk memulai container. Di balik terpalnya, mereka terdiri dari satu atau lebih lapisan read-only, yang bila ditumpuk bersama-sama, akan membentuk keseluruhan gambar. Docker menangani penumpukan lapisan-lapisan ini dan merepresentasikannya sebagai satu objek terpadu. Catatan: Gambar Docker tidak dapat diubah, artinya gambar Docker tidak dapat diubah. Setelah Anda membuatnya, Anda dapat menghapusnya, tetapi Anda tidak dapat mengubahnya.
Gambar Docker berisi semua file yang Anda kemas, yang menjadi sistem file kontainer - dan juga berisi banyak metadata tentang gambar itu sendiri. Itu termasuk sejarah singkat tentang bagaimana gambar itu dibuat. Anda dapat menggunakannya untuk melihat setiap lapisan gambar, dan perintah yang membuat lapisan tersebut. Anda dapat memeriksa riwayat gambar helloworld
dengan menggunakan:
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
Perintah CREATED BY
adalah instruksi Dockerfile – ada hubungan satu-ke-satu, sehingga setiap baris di Dockerfile membuat lapisan gambar.
Pertama, Anda harus masuk dengan akun dockerhub Anda
docker login --username $dockerId
Sekarang setelah Anda masuk, Anda dapat memasukkan gambar ke akun Anda atau ke organisasi mana pun yang aksesnya Anda miliki. Jika Anda bukan anggota organisasi mana pun, Anda hanya dapat memasukkan gambar ke repositori di akun Anda.
Kami membuat image Docker yang disebut helloworld
. Referensi gambar tersebut tidak memiliki nama akun, jadi kami tidak dapat mengirimkannya ke registri mana pun. Kita tidak perlu membangun kembali gambar untuk memberikan referensi baru, gambar dapat memiliki beberapa referensi. Tandai gambar Anda dengan seperti ini:
docker image tag helloworld $dockerId /helloworld:v1
Sekarang kami memiliki referensi gambar dengan ID Docker kami di nama akun, dan kami masuk ke Docker Hub sehingga kami siap untuk membagikan gambar kami! Perintah docker image push adalah kebalikan dari perintah pull, perintah ini mengunggah lapisan gambar lokal kita ke registri:
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
Kita dapat memasukkan string apa pun ke dalam tag gambar Docker, dan seperti yang telah kita lihat, Anda dapat memiliki beberapa tag untuk gambar yang sama. Kami akan menggunakannya untuk membuat versi perangkat lunak dalam gambar kami dan membiarkan pengguna membuat pilihan berdasarkan informasi mengenai apa yang tidak akan mereka gunakan - dan membuat pilihan berdasarkan informasi kami sendiri ketika kami menggunakan gambar orang lain.
Banyak proyek perangkat lunak menggunakan skema versi numerik dengan titik desimal untuk menunjukkan seberapa besar perubahan antar versi, dan Anda dapat mengikutinya dengan tag gambar Anda. Ide dasarnya adalah sesuatu seperti [mayor].[minor].[patch], yang memiliki beberapa jaminan implisit. Rilis yang hanya menambah nomor patch mungkin memiliki perbaikan bug tetapi harus memiliki fitur yang sama seperti versi terakhir; rilis yang menambah versi minor mungkin menambahkan fitur tetapi tidak menghapus apa pun; rilis besar dapat memiliki fitur yang sangat berbeda.
Kebanyakan aplikasi tidak berjalan dalam satu komponen. Bahkan aplikasi lama yang berukuran besar biasanya dibuat sebagai komponen front-end dan back-end, yang merupakan lapisan logis terpisah yang berjalan dalam komponen yang didistribusikan secara fisik. Docker cocok untuk menjalankan aplikasi terdistribusi - mulai dari monolit tingkat n hingga layanan mikro modern. Setiap komponen berjalan dalam wadahnya yang ringan, dan Docker menyambungkannya menggunakan protokol jaringan standar. Anda menentukan dan mengelola aplikasi multi-kontainer seperti ini menggunakan Docker Compose. Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer. Dengan Compose, Anda menggunakan file YAML
untuk mengonfigurasi layanan aplikasi Anda. Kemudian, dengan satu perintah, kami membuat dan memulai semua layanan dari konfigurasi Anda.
File Docker Compose menjelaskan keadaan aplikasi Anda yang diinginkan - seperti apa tampilannya saat semuanya berjalan. Ini adalah format file sederhana tempat Anda menangkap semua opsi yang akan Anda masukkan ke dalam wadah buruh pelabuhan, jalankan perintah ke dalam file Tulis. Kemudian Anda menggunakan alat Docker Compose untuk menjalankan aplikasi. Ia menentukan sumber daya Docker yang dibutuhkan - yang bisa berupa kontainer, jaringan, atau volume - dan mengirimkan permintaan ke Docker API untuk membuatnya. Nama default untuk file Compose YAML adalah docker-compose.yml
. Namun, kita dapat menggunakan flag -f untuk menentukan nama file khusus.
Mari kita mulai.
Kode di bawah ini menunjukkan file Docker Compose
yang sangat sederhana yang mendefinisikan aplikasi Flask kecil dengan dua layanan (web-frontend dan redis). Aplikasi ini adalah server web sederhana yang menghitung jumlah kunjungan dan menyimpan nilainya di Redis.
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
Kunci version
diperlukan, dan harus selalu menjadi baris pertama file. Ini menjelaskan versi format Compose file
(pada dasarnya API).
Kunci services
tingkat atas adalah tempat kami mendefinisikan layanan aplikasi yang berbeda. Contoh yang kami gunakan mendefinisikan dua layanan; front-end web yang disebut web-frontend
, dan database dalam memori yang disebut Redis. Compose akan menerapkan setiap layanan ini sebagai containernya.
Kunci networks
tingkat atas memberitahu Docker untuk membuat jaringan baru. Secara default, Compose akan membuat jaringan jembatan. Ini adalah jaringan host tunggal yang hanya dapat menghubungkan container pada host yang sama.
Dalam definisi layanan web-frontend, kami memberikan instruksi berikut kepada Docker:
Kami akan menerapkan aplikasi yang ditentukan dalam file Tulis dari bagian sebelumnya. Untuk melakukan ini, Anda memerlukan 4 file berikut dari https://github.com/championshuttler/counter-app:
Kloning repo Git secara lokal.
git clone https://github.com/championshuttler/counter-app.git
Mari kita jelaskan dengan cepat setiap file:
app.py
adalah kode aplikasi (aplikasi Python Flask).docker-compose.yml
adalah file Docker Compose yang menjelaskan cara Docker menyebarkan aplikasi.Dockerfile
menjelaskan cara membuat image untuk layanan frontend web.requirements.txt
mencantumkan paket Python yang diperlukan untuk aplikasi. Mari gunakan Compose untuk memunculkan aplikasi. Anda harus menjalankan semua perintah berikut ini dari dalam direktori counter-app
:
docker-compose up &
Diperlukan waktu beberapa detik hingga aplikasi muncul, dan hasilnya bisa sangat bertele-tele.
Dengan aplikasi yang berhasil diterapkan, Anda dapat mengarahkan browser web ke host Docker Anda pada port 5000
dan melihat aplikasi tersebut dengan segala kemegahannya.
Apakah menurut Anda tutorialnya berantakan atau Anda bersenang-senang dan mempelajari sesuatu? Kirimkan pemikiran Anda langsung kepada saya atau buat masalah saja. Temukan saya di Twitter juga, jangan ragu untuk bertanya jika Anda memiliki keraguan.
Saya ingin mendengar tentang pengalaman Anda dengan tutorial ini. Semoga Anda menikmati belajar. Jika Anda menyukainya, silakan berikan di GitHub dan dukung pekerjaan saya.