Saat menggunakan Docker, kami mulai dengan gambar dasar. Kami mem-boot-nya, membuat perubahan dan perubahan-perubahan itu disimpan dalam lapisan membentuk gambar lain.
Jadi akhirnya saya memiliki gambar untuk instance PostgreSQL saya dan gambar untuk aplikasi web saya, perubahan yang terus bertahan.
Apa itu wadah?
docker
docker-container
docker-image
bibstha
sumber
sumber
Jawaban:
Sebuah instance dari sebuah gambar disebut wadah. Anda memiliki gambar, yang merupakan kumpulan lapisan seperti yang Anda gambarkan. Jika Anda memulai gambar ini, Anda memiliki wadah untuk menjalankan gambar ini. Anda dapat memiliki banyak wadah berjalan dengan gambar yang sama.
Anda dapat melihat semua gambar
docker images
Anda sementara Anda dapat melihat wadah yang sedang berjalan dengandocker ps
(dan Anda dapat melihat semua wadah dengandocker ps -a
).Jadi instance yang berjalan dari sebuah gambar adalah sebuah wadah.
sumber
Dari artikel saya tentang Penyebaran Docker Otomatis :
Gambar Docker vs. Kontainer
Di Dockerland, ada gambar dan ada wadah . Keduanya terkait erat, tetapi berbeda. Bagi saya, memahami dikotomi ini telah memperjelas Docker.
Apa itu Gambar?
Sebuah gambar adalah file yang lembam, tidak dapat diubah, yang pada dasarnya merupakan snapshot dari sebuah wadah. Gambar dibuat dengan perintah build , dan mereka akan menghasilkan wadah ketika dimulai dengan menjalankan . Gambar disimpan dalam registri Docker seperti registry.hub.docker.com . Karena mereka dapat menjadi sangat besar, gambar dirancang untuk terdiri dari lapisan-lapisan gambar lain, memungkinkan jumlah minimal data yang akan dikirim ketika mentransfer gambar melalui jaringan.
Gambar lokal dapat didaftar dengan menjalankan
docker images
:Beberapa hal yang perlu diperhatikan:
-t
flagdocker build
perintah, atau daridocker tag
-ing gambar yang ada. Anda bebas memberi tag pada gambar menggunakan nomenklatur yang masuk akal bagi Anda, tetapi ketahuilah bahwa buruh pelabuhan akan menggunakan tag sebagai lokasi registri di suatudocker push
ataudocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Untuk diubuntu
atas, REGISTRYHOST disimpulkan sebagairegistry.hub.docker.com
. Jadi, jika Anda berencana untuk menyimpan gambar Anda dipanggilmy-application
dalam registri didocker.example.com
, Anda harus menandai gambar itudocker.example.com/my-application
.latest
tag tidak magis, itu hanya tag default ketika Anda tidak menentukan tag.<none>
TAG dan REPOSITORI. Sangat mudah untuk melupakannya.Informasi lebih lanjut tentang gambar tersedia dari dokumentasi Docker dan glosarium .
Apa itu wadah?
Untuk menggunakan metafora pemrograman, jika gambar adalah kelas, maka wadah adalah turunan dari kelas — objek runtime. Kontainer semoga menjadi alasan Anda menggunakan Docker; mereka enkapsulasi ringan dan portabel dari suatu lingkungan di mana untuk menjalankan aplikasi.
Lihat wadah lari lokal dengan
docker ps
:Di sini saya menjalankan versi docker dari registry docker, sehingga saya memiliki tempat pribadi untuk menyimpan gambar saya. Sekali lagi, beberapa hal yang perlu diperhatikan:
docker ps
hanya menghasilkan wadah yang berjalan . Anda dapat melihat semua wadah ( berjalan atau berhenti ) dengandocker ps -a
.--name
bendera.Bagaimana menghindari penumpukan gambar dan wadah
Salah satu frustrasi awal saya dengan Docker adalah penumpukan gambar tanpa tanda yang tampaknya konstan dan menghentikan wadah . Pada beberapa kesempatan, penumpukan ini menghasilkan hard drive yang maksimal memperlambat laptop saya atau menghentikan jalur pipa otomatis saya. Bicara tentang "wadah di mana-mana"!
Kami dapat menghapus semua gambar yang tidak ditandai dengan menggabungkan
docker rmi
dengandangling=true
permintaan terbaru :docker images -q --filter "dangling=true" | xargs docker rmi
Docker tidak akan dapat menghapus gambar yang berada di belakang wadah yang ada, jadi Anda mungkin harus menghapus wadah yang dihentikan dengan
docker rm
terlebih dahulu:Ini adalah poin rasa sakit yang diketahui dengan Docker dan dapat diatasi dalam rilis mendatang. Namun, dengan pemahaman yang jelas tentang gambar dan wadah, situasi ini dapat dihindari dengan beberapa praktik:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.sumber
docker image prune
untuk membersihkan gambar yang menggantung. Pangkas objek Docker yang tidak digunakandocker system prune
untuk membersihkan semuanyaDengan kata-kata yang mudah.
Gambar -
Wadah -
Istilah penting lainnya untuk diperhatikan:
Docker daemon -
Klien Docker -
Docker Store -
Gambar dari posting blog ini bernilai ribuan kata.
(Untuk pemahaman yang lebih dalam, baca ini .)
Ringkasan:
docker run image_name:tag_name
) => Memberikan Gambar yang berjalan yaitu wadah (dapat diedit)sumber
Meskipun paling sederhana untuk menganggap wadah sebagai gambar yang sedang berjalan, ini tidak cukup akurat.
Gambar sebenarnya adalah templat yang dapat diubah menjadi wadah. Untuk mengubah gambar menjadi sebuah wadah, mesin Docker mengambil gambar, menambahkan sistem file baca-tulis di atas dan menginisialisasi berbagai pengaturan termasuk port jaringan, nama wadah, ID dan batas sumber daya. Sebuah wadah yang sedang berjalan memiliki proses yang sedang berjalan, tetapi sebuah wadah juga dapat dihentikan (atau keluar dalam terminologi Docker). Wadah yang keluar tidak sama dengan gambar, karena dapat dimulai ulang dan akan mempertahankan pengaturannya dan perubahan sistem file apa pun.
sumber
docker create
.Mungkin menjelaskan seluruh alur kerja dapat membantu.
Semuanya dimulai dengan Dockerfile . Dockerfile adalah kode sumber gambar.
Setelah Dockerfile dibuat, Anda membangunnya untuk membuat gambar wadah. Gambar hanyalah "versi terkompilasi" dari "kode sumber" yang merupakan Dockerfile.
Setelah Anda memiliki gambar wadah, Anda harus mendistribusikannya menggunakan registri . Registri seperti repositori Git - Anda dapat mendorong dan menarik gambar.
Selanjutnya, Anda dapat menggunakan gambar untuk menjalankan wadah . Wadah yang berjalan sangat mirip, dalam banyak aspek, dengan mesin virtual (tetapi tanpa hypervisor ).
sumber
Alur kerja
Berikut ini adalah alur kerja ujung ke ujung yang menunjukkan berbagai perintah dan input serta output yang terkait. Itu harus memperjelas hubungan antara gambar dan wadah.
Untuk membuat daftar gambar yang dapat Anda jalankan, jalankan:
Untuk daftar kontainer Anda dapat menjalankan perintah pada:
sumber
Saya tidak dapat memahami konsep gambar dan lapisan meskipun membaca semua pertanyaan di sini dan akhirnya menemukan dokumentasi yang sangat bagus dari Docker ini (ya!).
Contohnya memang ada kunci untuk memahami keseluruhan konsep. Ini adalah posting yang panjang, jadi saya merangkum poin-poin penting yang perlu dipahami untuk mendapatkan kejelasan.
Gambar : Gambar Docker dibangun dari serangkaian lapisan hanya baca
Lapisan : Setiap lapisan mewakili instruksi di Dockerfile gambar.
Example
: Dockerfile di bawah ini berisi empat perintah, yang masing-masing membuat sebuah layer.Yang penting , setiap lapisan hanya satu set perbedaan dari lapisan sebelumnya.
Memahami gambar dan Kontainer dari perspektif ukuran pada disk
Untuk melihat perkiraan ukuran wadah yang sedang berjalan, Anda dapat menggunakan
docker ps -s
perintah. Anda mendapatkansize
danvirtual size
sebagai dua output:Ukuran: jumlah data (pada disk) yang digunakan untuk lapisan yang dapat ditulis dari setiap wadah
Ukuran Virtual: jumlah data yang digunakan untuk data gambar hanya baca yang digunakan oleh wadah. Beberapa wadah dapat berbagi sebagian atau semua data gambar hanya-baca. Karenanya ini bukan aditif. Yaitu Anda tidak dapat menambahkan semua ukuran virtual untuk menghitung berapa ukuran pada disk yang digunakan oleh gambar
Konsep penting lainnya adalah strategi copy-on-write
Jika file atau direktori ada di lapisan bawah di dalam gambar, dan lapisan lain (termasuk lapisan yang dapat ditulisi) perlu akses baca untuk itu, itu hanya menggunakan file yang ada. Pertama kali layer lain perlu memodifikasi file (ketika membangun gambar atau menjalankan wadah), file tersebut disalin ke lapisan itu dan dimodifikasi.
Saya harap itu membantu orang lain seperti saya.
sumber
Dockerfile → (Build) → Image → (Run) → Container .
Dockerfile : berisi sekumpulan instruksi Docker yang menyediakan sistem operasi sesuai keinginan Anda, dan menginstal / mengkonfigurasi semua perangkat lunak Anda.
Gambar : kompilasi Dockerfile. Menghemat waktu Anda dari membangun kembali Dockerfile setiap kali Anda perlu menjalankan sebuah wadah. Dan itu adalah cara untuk menyembunyikan kode ketentuan Anda.
Container : sistem operasi virtual itu sendiri. Anda dapat ssh ke dalamnya dan menjalankan perintah yang Anda inginkan, seolah-olah itu adalah lingkungan nyata. Anda dapat menjalankan 1000+ wadah dari Gambar yang sama.
sumber
Secara sederhana, jika gambar adalah kelas , maka wadah adalah turunan dari kelas adalah objek runtime .
sumber
Wadah hanyalah biner yang dapat dijalankan yang dijalankan oleh OS host di bawah seperangkat batasan yang telah ditetapkan menggunakan aplikasi (misalnya, Docker) yang tahu cara memberi tahu OS mana batasan untuk diterapkan.
Pembatasan khasnya adalah terkait proses-isolasi, terkait keamanan (seperti menggunakan perlindungan SELinux ) dan terkait sumber daya sistem (memori, disk, CPU, dan jaringan).
Sampai saat ini, hanya kernel dalam sistem berbasis Unix yang mendukung kemampuan untuk menjalankan executable di bawah batasan ketat. Itu sebabnya sebagian besar pembicaraan kontainer saat ini melibatkan sebagian besar Linux atau distribusi Unix lainnya.
Docker adalah salah satu aplikasi yang tahu bagaimana cara memberitahu OS (kebanyakan Linux) pembatasan apa yang harus dijalankan. Eksekusi yang terkandung di dalam gambar Docker, yang hanya tarfile. Yang dapat dieksekusi itu biasanya versi singkat dari distribusi Linux (Ubuntu, CentOS, Debian, dll.) Yang telah dikonfigurasi untuk menjalankan satu atau lebih aplikasi di dalamnya.
Meskipun kebanyakan orang menggunakan basis Linux sebagai yang dapat dieksekusi, itu bisa berupa aplikasi biner lainnya selama OS host dapat menjalankannya (lihat membuat gambar basis sederhana menggunakan awal ). Apakah biner dalam gambar Docker adalah OS atau hanya sebuah aplikasi, untuk host OS itu hanyalah proses lain, proses yang terkandung diatur oleh batas-batas OS yang telah ditetapkan.
Aplikasi lain yang, seperti Docker, dapat memberi tahu OS host yang batas-batasnya berlaku untuk suatu proses saat sedang berjalan, termasuk LXC , libvirt , dan systemd . Docker dulu menggunakan aplikasi ini untuk berinteraksi secara tidak langsung dengan OS Linux, tetapi sekarang Docker berinteraksi langsung dengan Linux menggunakan perpustakaannya sendiri yang disebut " libcontainer ".
Jadi kontainer hanya proses yang berjalan dalam mode terbatas, mirip dengan apa yang chroot lakukan.
IMO, yang membedakan Docker dari teknologi wadah lainnya adalah repositori (Docker Hub) dan alat manajemennya yang membuat bekerja dengan wadah menjadi sangat mudah.
Lihat Docker (perangkat lunak) .
sumber
Konsep inti Docker adalah membuatnya mudah untuk membuat "mesin" yang dalam hal ini dapat dianggap sebagai wadah. Kontainer membantu dalam penggunaan ulang, memungkinkan Anda untuk membuat dan menjatuhkan wadah dengan mudah.
Gambar menggambarkan keadaan wadah di setiap titik waktu. Jadi alur kerja dasarnya adalah:
sumber
Seperti banyak jawaban menunjukkan ini: Anda membangun Dockerfile untuk mendapatkan gambar dan Anda menjalankan gambar untuk mendapatkan wadah .
Namun, langkah-langkah berikut membantu saya merasakan lebih baik tentang apa gambar dan wadah Docker:
1) Bangun Dockerfile:
docker build -t my_image dir_with_dockerfile
2) Simpan gambar ke
.tar
filedocker save -o my_file.tar my_image_id
my_file.tar
akan menyimpan gambar. Buka dengantar -xvf my_file.tar
, dan Anda akan bisa melihat semua layer. Jika Anda menyelam lebih dalam ke setiap lapisan, Anda dapat melihat perubahan apa yang ditambahkan di setiap lapisan. (Mereka harus cukup dekat dengan perintah di Dockerfile).3) Untuk melihat bagian dalam wadah, Anda dapat melakukan:
sudo docker run -it my_image bash
dan Anda dapat melihat bahwa itu sangat mirip OS.
sumber
Gambar setara dengan definisi kelas dalam OOP dan lapisan adalah metode dan properti yang berbeda dari kelas itu.
Kontainer adalah Instansiasi gambar yang sebenarnya seperti halnya sebuah objek adalah Instansiasi atau instance kelas.
sumber
Saya pikir lebih baik dijelaskan di awal.
Misalkan Anda menjalankan perintah
docker run hello-world
. Apa yang terjadi?Ini panggilan Docker CLI yang bertanggung jawab untuk mengambil perintah Docker dan mengubah untuk memanggil perintah server Docker . Segera setelah server Docker mendapat perintah untuk menjalankan gambar , ia memeriksa cuaca cache gambar menyimpan gambar dengan nama seperti itu.
Misalkan hello-world tidak ada. Server Docker pergi ke Docker Hub (Docker Hub hanyalah repositori gambar gratis) dan bertanya, hei Hub, apakah Anda memiliki gambar yang disebut
hello-world
? Respons hub - ya, saya lakukan. Kalau begitu berikan itu padaku. Dan proses pengunduhan dimulai. Segera setelah gambar Docker diunduh, server Docker memasukkannya ke dalam cache gambar .Jadi sebelum kita menjelaskan apa gambar Docker dan wadah Docker, mari kita mulai dengan pengantar tentang sistem operasi pada komputer Anda dan bagaimana ia menjalankan perangkat lunak.
Ketika Anda menjalankan, misalnya, Chrome di komputer Anda, ia memanggil sistem operasi, sistem operasi itu sendiri memanggil kernel dan bertanya, hei saya ingin menjalankan program ini. Kernel mengelola untuk menjalankan file dari hard disk Anda.
Sekarang bayangkan Anda memiliki dua program, Chrome dan Node.js. Chrome membutuhkan Python versi 2 untuk berjalan dan Node.js membutuhkan Python versi 3 untuk dijalankan. Jika Anda hanya menginstal Python v2 di komputer Anda, hanya Chrome yang akan dijalankan.
Agar kedua kasing berfungsi, entah bagaimana Anda harus menggunakan fitur sistem operasi yang dikenal sebagai namespacing. Namespace adalah fitur yang memberi Anda kesempatan untuk mengisolasi proses, hard drive, jaringan, pengguna, nama host, dan sebagainya.
Jadi, ketika kita berbicara tentang gambar, kita sebenarnya berbicara tentang snapshot sistem file. Sebuah gambar adalah file fisik yang berisi arah dan metadata untuk membangun tertentu kontainer . The kontainer itu sendiri adalah sebuah contoh dari sebuah gambar ; itu mengisolasi hard drive menggunakan namespacing yang hanya tersedia untuk wadah ini . Jadi suatu wadah adalah suatu proses atau serangkaian proses yang mengelompokkan berbagai sumber daya yang berbeda ditugaskan kepadanya.
sumber
Gambar Docker mengemas aplikasi dan lingkungan yang diperlukan oleh aplikasi untuk menjalankan, dan sebuah wadah adalah instance dari gambar.
Gambar adalah bagian pengepakan Docker, analog dengan "kode sumber" atau "program". Kontainer adalah bagian eksekusi Docker, analog dengan "proses".
Dalam pertanyaan, hanya bagian "program" yang dirujuk dan itulah gambarnya. Bagian "running" dari Docker adalah wadah. Ketika sebuah wadah dijalankan dan perubahan dibuat, seolah-olah proses tersebut membuat perubahan dalam kode sumbernya sendiri dan menyimpannya sebagai gambar baru.
sumber
Seperti dalam aspek pemrograman,
Gambar adalah kode sumber.
Ketika kode sumber dikompilasi dan dibangun, itu disebut aplikasi.
Mirip dengan "ketika sebuah instance dibuat untuk gambar", itu disebut " wadah ".
sumber
Sebuah gambar adalah "snapshot" dari wadah . Anda dapat membuat gambar dari sebuah wadah ("snapshots" baru), dan Anda juga dapat memulai wadah baru dari sebuah gambar (instantiate "snapshot").
Misalnya, Anda dapat membuat instance wadah baru dari gambar dasar, menjalankan beberapa perintah dalam wadah, dan mengambil gambar itu sebagai gambar baru. Kemudian Anda dapat menjalankan 100 kontainer dari gambar baru itu.
Hal-hal lain yang perlu dipertimbangkan:
docker images
.sumber
Saya ingin mengisi bagian yang hilang di sini antara
docker images
dancontainers
. Docker menggunakan sistem file gabungan ( UFS ) untuk wadah, yang memungkinkan beberapa sistem file untuk dipasang dalam hierarki dan muncul sebagai sistem file tunggal. Sistem file dari gambar telah di-mount sebagairead-only
layer, dan segala perubahan pada container yang sedang berjalan dibuat keread-write
layer yang dipasang di atas ini. Karena itu, Docker hanya perlu melihat lapisan baca-tulis paling atas untuk menemukan perubahan yang dibuat pada sistem yang sedang berjalan.sumber
Untuk analogi pemrograman dummy, Anda dapat menganggap Docker memiliki ImageFactory abstrak yang menampung ImageFactories yang berasal dari toko .
Kemudian setelah Anda ingin membuat aplikasi dari ImageFactory itu, Anda akan memiliki wadah baru, dan Anda dapat memodifikasinya seperti yang Anda inginkan. DotNetImageFactory tidak akan berubah, karena bertindak sebagai kelas pabrik abstrak, di mana ia hanya memberikan contoh yang Anda inginkan.
sumber
Pendeknya:
Container adalah divisi (virtual) dalam kernel yang berbagi OS yang sama dan menjalankan gambar (gambar Docker).
Wadah adalah aplikasi mandiri yang akan memiliki paket dan semua dependensi yang diperlukan bersama untuk menjalankan kode.
sumber
Wadah Docker menjalankan instance gambar. Anda dapat menghubungkan gambar dengan program dan wadah dengan proses :)
sumber
Gambar adalah kelas sebagai wadah untuk objek.
Wadah adalah turunan dari sebuah gambar karena objek adalah turunan dari kelas.
sumber
Dockerfile seperti skrip Bash Anda yang menghasilkan tarball (gambar Docker).
Kontainer Docker seperti versi tarball yang diekstraksi. Anda dapat memiliki salinan sebanyak mungkin di folder yang berbeda (wadah).
sumber