Apa perbedaan antara gambar Docker dan sebuah wadah?

924

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?

bibstha
sumber
Sebelum Anda melompat ke kompleks detaled, jawaban di bawah ini, jawaban awam untuk pertanyaan awal Anda adalah yang ini - sunilk.work/what-is-docker-with-example
Sunil Kumar

Jawaban:

1241

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 imagesAnda sementara Anda dapat melihat wadah yang sedang berjalan dengan docker ps(dan Anda dapat melihat semua wadah dengan docker ps -a).

Jadi instance yang berjalan dari sebuah gambar adalah sebuah wadah.

Thomas Uhrig
sumber
107
Jadi, apa perbedaan antara gambar dan wadah yang dihentikan?
Victor Dombrovsky
342
gambar adalah resep, wadahnya adalah kue ;-) Anda dapat membuat kue sebanyak yang Anda suka dengan resep yang diberikan
Julien
142
@VictorDombrovsky Wadah yang dihentikan adalah kue di dalam freezer.
Jacob Ford
44
@ Julien jika gambar adalah resepnya, bagaimana dengan Dockerfile? :)
Johnny Willer
71
@JohnnyWiller Analogies memiliki batasnya, tetapi mungkin kita dapat melihat Dockerfile adalah daftar belanjaan Anda untuk bahan ;-). Kalau tidak, sebut Dockerfile resep, gambar cetakan, wadah masih menjadi kue lezat
Julien
585

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:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

Beberapa hal yang perlu diperhatikan:

  1. ID IMAGE adalah 12 karakter pertama dari pengidentifikasi sebenarnya untuk suatu gambar. Anda dapat membuat banyak tag dari gambar yang diberikan, tetapi ID mereka semua akan sama (seperti di atas).
  2. UKURAN VIRTUAL adalah virtual karena menambah ukuran semua lapisan dasar yang berbeda. Ini berarti bahwa jumlah semua nilai dalam kolom itu mungkin jauh lebih besar daripada ruang disk yang digunakan oleh semua gambar itu.
  3. Nilai dalam kolom REPOSITORY berasal dari -tflag docker buildperintah, atau dari docker 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 suatu docker pushatau docker pull.
  4. Bentuk lengkap dari tag adalah [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Untuk di ubuntuatas, REGISTRYHOST disimpulkan sebagai registry.hub.docker.com. Jadi, jika Anda berencana untuk menyimpan gambar Anda dipanggil my-applicationdalam registri di docker.example.com, Anda harus menandai gambar itu docker.example.com/my-application.
  5. Kolom TAG hanya bagian [: TAG] dari tag lengkap . Ini adalah terminologi yang tidak menguntungkan.
  6. The latesttag tidak magis, itu hanya tag default ketika Anda tidak menentukan tag.
  7. Anda dapat memiliki gambar yang tidak ditandai hanya dapat diidentifikasi oleh ID IMAGE mereka. Ini akan mendapatkan <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:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

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:

  1. Seperti ID IMAGE, ID KONTAINER adalah pengidentifikasi sebenarnya untuk wadah. Ini memiliki bentuk yang sama, tetapi mengidentifikasi jenis objek yang berbeda.
  2. docker pshanya menghasilkan wadah yang berjalan . Anda dapat melihat semua wadah ( berjalan atau berhenti ) dengan docker ps -a.
  3. NAMES dapat digunakan untuk mengidentifikasi wadah yang dimulai melalui --namebendera.

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 rmidengan dangling=truepermintaan 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 rmterlebih dahulu:

docker rm `docker ps --no-trunc -aq`

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:

  1. Selalu keluarkan wadah yang tidak berguna dan terhenti docker rm [CONTAINER_ID].
  2. Selalu hapus gambar di belakang wadah yang tidak berguna dan terhenti docker rmi [IMAGE_ID].
paislee
sumber
5
Diferensiasi yang baik dengan gambar dan wadah. Banyak membantu untuk pemula seperti saya.
Gibbs
2
Saya kira apa yang saya terjebak adalah bagaimana gambar berjalan (saya menggunakan boot2docker pada Windows). Mengapa kita membuat gambar untuk aplikasi, katakanlah mysql? Pada titik ini, bagaimana mysql berjalan? Apakah saya tidak perlu memiliki gambar Linux untuk menjalankan mysql di atas?
Kenny Worden
Sebenarnya ini tidak benar: "buruh pelabuhan menarik: tag terbaru dari sebuah gambar akan menambahkan setidaknya dua gambar ke daftar gambar lokal Anda: satu dengan tag terbaru, dan satu untuk setiap tag asli dari gambar terbaru, misalnya 14,04 dan kencan di atas. " Itu hanya akan menambahkan satu gambar dengan tag terbaru. Menarik 14,04 nanti mungkin menjadi no-op jika ID gambar sama, tetapi masih memerlukan tarikan terpisah.
Adrian Mouat
4
Dalam versi docker yang lebih baru, Anda dapat menggunakannya docker image pruneuntuk membersihkan gambar yang menggantung. Pangkas objek Docker yang tidak digunakan
Dario Seidl
3
Saya hanya gunakan docker system pruneuntuk membersihkan semuanya
Rami Alloush
137

Dengan kata-kata yang mudah.

Gambar -

Sistem file dan aplikasi konfigurasi (hanya baca) yang digunakan untuk membuat wadah. Lebih detail .

Wadah -

Ini menjalankan contoh gambar Docker. Wadah menjalankan aplikasi yang sebenarnya. Wadah mencakup aplikasi dan semua dependensinya. Ini berbagi kernel dengan wadah lain dan berjalan sebagai proses terisolasi di ruang pengguna pada OS host. Lebih detail .


Istilah penting lainnya untuk diperhatikan:


Docker daemon -

Layanan latar belakang berjalan pada host yang mengelola gedung, menjalankan dan mendistribusikan kontainer Docker.

Klien Docker -

Alat baris perintah yang memungkinkan pengguna untuk berinteraksi dengan daemon Docker.

Docker Store -

Store adalah, antara lain, registrasi gambar Docker. Anda dapat menganggap registri sebagai direktori semua gambar Docker yang tersedia.

Gambar dari posting blog ini bernilai ribuan kata.

Masukkan deskripsi gambar di sini

(Untuk pemahaman yang lebih dalam, baca ini .)

Ringkasan:

  • Tarik gambar dari hub Docker atau bangun dari Dockerfile => Memberikan gambar Docker (tidak dapat diedit).
  • Jalankan gambar ( docker run image_name:tag_name) => Memberikan Gambar yang berjalan yaitu wadah (dapat diedit)
Imran Ahmad
sumber
1
Terima kasih. Apa sumber diagram itu? apakah itu dari dokumen resmi Docker?
Gambar yang diposting sangat fantastis . Satu masalah yang saya miliki: Anda mengatakan "Ditemukan saat membaca beberapa artikel" - Jika bukan diagram Anda , secara moral penting [dan secara hukum diperlukan] untuk memberikan kredit pada saat jatuh tempo ("atribusi"): Penulis gambar asli adalah WHO? Awalnya ditemukan di URL apa?
ToolmakerSteve
@ToolmakerSteve Terima kasih atas tipnya, saya akan mengingatnya dan akan memperbarui jawabannya segera setelah saya menemukan sumbernya.
Imran Ahmad
126

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.

Adrian Mouat
sumber
bagaimana cara mengubah gambar menjadi wadah tanpa menjalankannya?
Janus Troelsen
12
@JanusTroelsen Use docker create.
Adrian Mouat
1
Ini agak membingungkan. Kami mengatakan gambar tidak dapat diubah, tetapi ketika dijalankan sebagai sebuah wadah, gambar itu menyimpan perubahan apa pun pada lapisan teratas yang dapat berubah seperti yang Anda katakan. Tetapi ketika dihentikan, apakah perubahan ini kemudian disimpan sebagai lapisan baru pada gambar? Jika ya, lalu bagaimana mungkin karena gambar asli seharusnya tidak berubah?
Dchucks
4
OK, lakukan beberapa bacaan dan dapatkan jawabannya di utas ini sendiri. "Ketika wadah dihapus, lapisan yang dapat ditulisi juga dihapus. Gambar yang mendasarinya tetap tidak berubah."
Dchucks
Balasan sangat membantu. Saya bingung sebelumnya. Jika saya DL gambar, jalankan sebagai wadah, letakkan file teks acak di wadah itu, dan hentikan wadah, file teks di wadah berhenti tetapi BUKAN gambar dasar saya unduh.
James Allen
89

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 ).

Tk421
sumber
44

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.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Untuk membuat daftar gambar yang dapat Anda jalankan, jalankan:

docker image ls

Untuk daftar kontainer Anda dapat menjalankan perintah pada:

docker ps
Sridhar Sarnobat
sumber
1
Untuk diagram alur kerja yang lebih komprehensif, lihat ini: stackoverflow.com/a/46528745/714112
Sridhar Sarnobat
1
Tetapi pengguliran yang diperlukan dalam seni ASCII adalah masalah.
Peter Mortensen
Unicode dapat digunakan sebagai gantinya untuk mendapatkan kotak yang tampak lebih bagus. Alat online adalah Demo Menggambar Kotak Javascript .
Peter Mortensen
40

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.

DARI ubuntu: 15.04

SALINAN. /aplikasi

LARI membuat / aplikasi

CMD python /app/app.py

Yang penting , setiap lapisan hanya satu set perbedaan dari lapisan sebelumnya.

  • Kontainer . Saat Anda membuat wadah baru, Anda menambahkan lapisan baru yang bisa ditulisi di atas lapisan yang mendasarinya . Lapisan ini sering disebut "lapisan wadah". Semua perubahan yang dibuat pada wadah yang sedang berjalan, seperti menulis file baru, memodifikasi file yang ada, dan menghapus file, ditulis ke lapisan kontainer tipis yang dapat ditulis ini.

Oleh karena itu, perbedaan utama antara wadah dan gambar adalah lapisan yang dapat ditulisi . Semua tulisan ke wadah yang menambah baru atau mengubah data yang ada disimpan di lapisan yang dapat ditulisi ini. Ketika wadah dihapus, lapisan yang dapat ditulisi juga dihapus. Gambar yang mendasarinya tetap tidak berubah.

Memahami gambar dan Kontainer dari perspektif ukuran pada disk

Untuk melihat perkiraan ukuran wadah yang sedang berjalan, Anda dapat menggunakan docker ps -sperintah. Anda mendapatkan sizedan virtual sizesebagai 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.

HopeKing
sumber
1
Terima kasih atas komentar ini, ini mengkonfirmasi perbedaan antara ukuran dan ukuran virtual dan sangat menarik untuk beberapa wadah yang mereka bagikan dengan data read-only yang sama dan ini merupakan ruang disk peningkatan.
user1842947
34

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.

Mahmoud Zalt
sumber
Analogi yang bagus. Jika saya bisa memberi Anda 1000 jempol saya akan.
Rich Lysakowski PhD
16

Secara sederhana, jika gambar adalah kelas , maka wadah adalah turunan dari kelas adalah objek runtime .

kogoia
sumber
13

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) .

AleQ
sumber
12

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:

  1. buat gambar
  2. mulai wadah
  3. buat perubahan pada wadah
  4. simpan wadah kembali sebagai gambar
kweku360
sumber
8

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 .tarfile

docker save -o my_file.tar my_image_id

my_file.tarakan menyimpan gambar. Buka dengan tar -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.

Akavall
sumber
6

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.

Rohit Salecha
sumber
4

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.

Alexander Gharibashvili
sumber
3

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.

div
sumber
3

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 ".

Nandakumar
sumber
1
Dockerfile seperti kode sumber. Gambar seperti file yang dapat dieksekusi setelah kode sumber dikompilasi / dibangun. Wadah seperti aplikasi yang berjalan dari file yang dapat dieksekusi.
ejlp12
Gambar BUKAN kode sumber untuk sebuah wadah. File docker adalah metaclass atau spesifikasi untuk kelas. Gambar adalah kelas atau templat untuk wadah, dan wadah adalah turunan dari kelas. Wadah adalah contoh yang berjalan. Anda dapat memiliki 1000 instance kelas. Gambar seperti kode objek yang dikompilasi yang dapat ditautkan ke program lain dan dijalankan sebagai bagian dari program itu.
Rich Lysakowski PhD
3

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:

  • Gambar terbuat dari lapisan, dan lapisan adalah snapshot "diffs" (jadi ketika Anda mendorong gambar, Anda hanya perlu mengirim "diff" ke registri).
  • Dockerfile mendefinisikan beberapa perintah di atas gambar dasar, yang menciptakan lapisan baru ("diffs") yang menghasilkan gambar baru ("snapshot").
  • Tag gambar bukan hanya tag. Mereka adalah "nama lengkap" gambar ("repositori: tag"). Jika gambar yang sama memiliki beberapa nama, itu menunjukkan beberapa kali saat melakukan docker images.
tothemario
sumber
Jawaban ini terbalik. Wadah adalah turunan dari sebuah gambar, atau snapshot dari suatu gambar yang dapat dieksekusi. Gambar tidak dieksekusi secara langsung karena kelas induk dari instance. Instance (wadah) adalah anak dari orang tua (resep atau templat untuk membuat instance.)
Rich Lysakowski PhD
Jawaban ini dimulai pada akhir proses. Gambar baru BISA dibuat sebagai potret wadah, tetapi semua wadah harus memiliki gambar induk. Dalam hal ini di sini tidak ada masalah ayam dan telur, karena gambar primordial pertama harus dibangun dari Dockerfile. Pertama datang Dockerfile, lalu Image, lalu Container. Wadah dapat digunakan sebagai dasar untuk gambar baru, tetapi wadah itu harus memiliki "gambar induk".
Rich Lysakowski PhD
3

Saya ingin mengisi bagian yang hilang di sini antara docker imagesdan containers. 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 sebagai read-onlylayer, dan segala perubahan pada container yang sedang berjalan dibuat ke read-writelayer 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.

mohammed wazeem
sumber
1

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.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
Teoman shipahi
sumber
1

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.

Rajendra kumar Vankadari
sumber
1

Wadah Docker menjalankan instance gambar. Anda dapat menghubungkan gambar dengan program dan wadah dengan proses :)

Rahul Bagad
sumber
1

Gambar adalah kelas sebagai wadah untuk objek.

Wadah adalah turunan dari sebuah gambar karena objek adalah turunan dari kelas.

Rodolfo
sumber
1

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).

haalcala
sumber