Ketika menggunakan Docker, kita mulai dengan dasar gambar. Kita boot up, membuat perubahan dan perubahan tersebut akan disimpan dalam lapisan-lapisan yang membentuk gambar yang lain.
Jadi akhirnya saya memiliki sebuah gambar untuk saya PostgreSQL contoh dan gambar untuk aplikasi web saya, perubahan yang terus berlangsung.
Apa yang merupakan wadah?
Contoh sebuah gambar yang disebut kontainer. Anda memiliki sebuah gambar, yang merupakan satu set dari lapisan seperti yang anda jelaskan. Jika anda ingin gambar ini, anda harus menjalankan wadah dari gambar ini. Anda dapat memiliki banyak menjalankan wadah dari gambar yang sama.
Anda dapat melihat semua gambar anda dengan gambar docker
sedangkan anda bisa melihat anda berjalan kontainer dengan docker ps
(dan anda dapat melihat semua kontainer dengan docker ps -a
).
Jadi contoh menjalankan sebuah gambar adalah sebuah wadah.
Dari artikel saya tentang Mengotomatisasi Docker Penyebaran:
Di Dockerland, ada gambar dan ada wadah. Keduanya terkait erat, tetapi berbeda. Bagi saya, menggenggam dikotomi ini telah diklarifikasi Docker sangat.
Gambar inert, abadi, file yang's pada dasarnya adalah cuplikan dari sebuah wadah. Gambar yang dibuat dengan membangun perintah, dan mereka'akan menghasilkan sebuah wadah bila dimulai dengan run. Gambar disimpan dalam Docker registry seperti registry.hub.docker.com. Karena mereka dapat menjadi sangat besar, gambar yang dirancang untuk dapat terdiri dari lapisan-lapisan lainnya gambar, yang memungkinkan jumlah minimal data yang akan dikirim ketika mentransfer gambar melalui jaringan.
Gambar lokal dapat terdaftar dengan menjalankan docker gambar
:
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:
-t
bendera docker membangun
perintah, atau dari docker tag
-ing gambar yang ada. Anda're gratis untuk tag gambar menggunakan nomenklatur yang masuk akal untuk anda, tapi tahu bahwa docker akan menggunakan tag sebagai lokasi registri dalam docker push
atau docker menarik
.[REGISTRYHOST/][NAMA/]NAMA [TAG:]
. Untuk ubuntu
di atas, REGISTRYHOST disimpulkan untuk menjadi registry.hub.docker.com
. Jadi jika anda berencana untuk menyimpan gambar anda disebut my aplikasi
di sebuah registry di docker.example.com
, anda harus memberi tag pada gambar docker.example.com/my-application
.terbaru
tag tidak ajaib, it's hanya default tag ketika anda don't menentukan sebuah tag.<none>
TAG dan REPOSITORI. It's mudah untuk melupakan mereka.Informasi lebih lanjut tentang gambar ini tersedia dari Docker dokumentasi dan glossary.
Untuk menggunakan pemrograman metafora, jika gambar adalah kelas, maka wadah adalah instance dari sebuah class runtime objek. Wadah yang mudah-mudahan mengapa anda're menggunakan Docker; mereka're ringan dan portabel enkapsulasi dari lingkungan di mana untuk menjalankan aplikasi.
Lihat berjalan lokal wadah 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'm menjalankan dockerized versi docker registry, sehingga saya memiliki tempat pribadi untuk menyimpan gambar-gambar saya. Sekali lagi, beberapa hal yang perlu diperhatikan:
docker ps
hanya output running wadah. Anda dapat melihat semua wadah (running atau stopped) dengan docker ps -a
.--nama
bendera.Dari awal saya frustrasi dengan Docker adalah tampaknya konstan penumpukan untagged gambar dan berhenti wadah. Pada beberapa kesempatan penumpukan ini mengakibatkan maxed out hard drive memperlambat laptop saya atau menghentikan saya otomatis membangun jaringan pipa. Berbicara tentang "wadah di mana-mana"!
Kita dapat menghapus semua untagged gambar dengan menggabungkan docker rmi
dengan menjuntai=true
query:
docker gambar -q-filter "menjuntai=true" | xargs docker rmi
Docker won't dapat menghapus gambar yang berada di belakang kontainer yang ada, sehingga anda mungkin harus menghapus berhenti wadah dengan docker rm
pertama:
docker rm `docker ps --no-trunc -aq`
Ini adalah dikenal pain point dengan Docker dan dapat ditangani dalam rilis mendatang. Namun, dengan pemahaman yang jelas tentang gambar dan kontainer, situasi ini dapat dihindari dengan beberapa praktik:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Sementara itu's paling sederhana untuk memikirkan sebuah wadah berjalan gambar, ini isn't cukup akurat.
Gambar ini benar-benar sebuah template yang dapat berubah menjadi sebuah wadah. Untuk mengubah sebuah gambar menjadi sebuah wadah, Docker engine mengambil gambar, menambahkan baca-tulis filesystem di atas dan initialises berbagai pengaturan, termasuk port jaringan, wadah nama, ID dan batasan sumber daya. Menjalankan wadah memiliki saat mengeksekusi proses, tetapi wadah ini juga dapat dihentikan (atau exited di Docker's terminologi). Yang keluar dari wadah adalah tidak sama seperti gambar, karena dapat direstart dan akan mempertahankan pengaturan dan filesystem perubahan.
Dalam kata-kata yang mudah.
Gambar -
sistem file dan konfigurasi(read-only) aplikasi yang digunakan untuk membuat wadah. Lebih detail.
Wadah -
Ini adalah contoh menjalankan Docker gambar. Wadah berjalan yang sebenarnya aplikasi. Wadah yang mencakup aplikasi dan semua dependensi. Ini saham kernel dengan wadah lainnya dan berjalan sebagai proses yang terisolasi dalam ruang pengguna pada host OS. Lebih detail.
Ketentuan-ketentuan penting lainnya untuk melihat:
Docker daemon -
layanan latar belakang berjalan pada host yang mengelola gedung, menjalankan dan mendistribusikan Docker containers.
Docker klien -
alat baris perintah yang memungkinkan pengguna untuk berinteraksi dengan Docker daemon.
Docker Toko -
Toko ini, antara lain, registry gambar Docker. Anda dapat berpikir registri sebagai sebuah direktori dari semua tersedia Docker gambar.
Gambar dari posting blog ini bernilai seribu kata-kata.
(Untuk pemahaman yang lebih mendalam silakan baca ini.)
Ringkasan:
docker menjalankan image_name:tag_name
) => Memberi menjalankan Gambar yaitu wadah (diedit)Mungkin menjelaskan seluruh alur kerja dapat membantu.
Semuanya dimulai dengan Dockerfile. Yang Dockerfile adalah sumber kode dari gambar.
Setelah Dockerfile dibuat, anda membangun untuk membuat gambar wadah. Gambar hanya "yang dihimpun versi" yang "source code" yang merupakan Dockerfile.
Setelah anda memiliki gambar dari wadah, anda harus mendistribusikannya dengan menggunakan registry. Registry adalah seperti sebuah repositori Git-anda dapat mendorong dan menarik gambar.
Selanjutnya, anda dapat menggunakan gambar untuk menjalankan wadah. Menjalankan wadah ini sangat mirip, dalam banyak aspek, untuk sebuah mesin virtual (tapi tanpa hypervisor).
Berikut ini adalah end-to-end alur kerja yang menunjukkan berbagai perintah dan mereka yang terkait input dan output. Yang harus memperjelas hubungan antara gambar dan wadah.
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
Untuk menampilkan gambar-gambar yang anda bisa menjalankan, melaksanakan:
docker image ls
Untuk daftar wadah anda bisa menjalankan perintah:
docker ps
Saya tidak't memahami konsep gambar dan layer terlepas dari membaca semua pertanyaan di sini dan kemudian akhirnya stumbled atas ini dokumentasi yang sangat baik dari Docker (duh!).
Contoh yang ada adalah benar-benar kunci untuk memahami seluruh konsep. Ini adalah posting yang panjang, jadi saya meringkas poin-poin penting yang harus benar-benar dipahami untuk mendapatkan kejelasan.
Gambar: Docker image dibangun dari serangkaian read-only lapisan
Layer: Setiap lapisan merupakan instruksi dalam gambar Dockerfile.
Contoh
: di bawah ini Dockerfile berisi empat perintah, masing-masing yang menciptakan lapisan.
DARI ubuntu:15.04
COPY . /aplikasi
RUN, membuat aplikasi
CMD python /app/app.py
Penting, masing-masing lapisan adalah hanya satu set perbedaan dari lapisan sebelumnya.
oleh Karena itu, perbedaan besar di antara wadah dan gambar top dapat ditulis lapisan. Semua menulis untuk wadah yang menambahkan baru atau memodifikasi data-data yang ada disimpan dalam ini ditulis lapisan. Ketika wadah dihapus, dapat ditulisi lapisan ini juga akan dihapus. Yang image yang mendasari tetap tidak berubah.
Memahami gambar cnd Wadah dari ukuran-on-disk perspektif
Untuk melihat perkiraan ukuran menjalankan wadah, anda dapat menggunakan docker ps -s
perintah. Anda mendapatkan ukuran
dan virtual
ukuran sebagai dua output:
Ukuran: jumlah data (disk) yang digunakan untuk ditulisi lapisan dari masing-masing wadah
Virtual Ukuran: jumlah data yang digunakan untuk hanya-baca data citra yang digunakan oleh wadah. Beberapa wadah yang dapat berbagi beberapa atau semua hanya-baca data gambar. Oleh karena itu ini bukan aditif. I. e. anda dapat't menambahkan semua virtual ukuran untuk menghitung berapa banyak ukuran pada disk yang digunakan oleh gambar
Konsep lain yang penting adalah copy-on-write strategi
Jika file atau direktori yang ada di lapisan bawah dalam gambar, dan lapisan lain (termasuk ditulisi layer) kebutuhan akses baca untuk itu, itu hanya menggunakan file yang ada. Pertama kalinya lapisan lain kebutuhan untuk memodifikasi file (ketika membangun citra atau menjalankan wadah), file tersebut akan disalin ke dalam lapisan dan dimodifikasi.
Saya berharap yang membantu orang lain seperti saya.
Dockerfile → (Membangun) → Gambar → (Menjalankan) → Wadah.
Dockerfile: berisi satu set Docker petunjuk bahwa ketentuan sistem operasi anda dengan cara yang anda suka, dan instalasi/konfigurasi semua perangkat lunak anda.
Gambar: disusun Dockerfile. Menghemat waktu anda dari membangun kembali Dockerfile setiap waktu yang anda butuhkan untuk menjalankan sebuah wadah. Dan itu's cara untuk menyembunyikan pemberian kode.
Wadah: virtual sistem operasi itu sendiri. Anda bisa ssh ke dalamnya dan menjalankan setiap perintah yang anda inginkan, seolah-olah itu's sebuah lingkungan nyata. Anda dapat menjalankan 1000+ wadah dari Gambar yang sama.
Konsep inti dari Docker adalah untuk membuatnya mudah untuk membuat "mesin" yang dalam hal ini dapat dianggap sebagai wadah. Wadah aids di usabilitas, yang memungkinkan anda untuk membuat dan drop wadah dengan mudah.
Gambar-gambar yang menggambarkan keadaan sebuah wadah pada setiap titik dalam waktu. Jadi alur kerja dasar adalah:
Wadah ini hanya sebuah executable biner yang akan dijalankan oleh OS host di bawah satu set pembatasan yang ditetapkan dengan menggunakan sebuah aplikasi (misalnya, Docker) yang tahu bagaimana untuk memberitahu OS pembatasan yang berlaku.
Khas pembatasan proses isolasi yang terkait, keamanan terkait (seperti menggunakan SELinux perlindungan) dan sistem-sumber terkait (memori, disk, CPU, dan networking).
Sampai saat ini, hanya kernel dalam sistem berbasis Unix yang didukung kemampuan untuk menjalankan executable di bawah pembatasan yang ketat. Yang's mengapa kebanyakan wadah berbicara hari ini melibatkan sebagian besar Linux atau Unix lainnya distribusi.
Docker adalah salah satu aplikasi yang tahu bagaimana untuk memberitahu OS (Linux sebagian besar) apa batasan untuk menjalankan eksekusi di bawah. Eksekusi yang terkandung dalam gambar Docker, yang hanya tarfile. Bahwa eksekusi biasanya versi stripped-down dari sebuah distribusi Linux (Ubuntu, CentOS, Debian, dll.) dikonfigurasi untuk menjalankan satu atau lebih aplikasi dalam.
Meskipun sebagian besar orang-orang yang menggunakan basis Linux sebagai eksekusi, hal ini dapat biner lainnya aplikasi sebagai host OS dapat menjalankan itu (lihat membuat sederhana gambar dasar menggunakan scratch). Apakah biner pada gambar Docker adalah sebuah OS atau hanya sebuah aplikasi, untuk OS host itu hanya proses lain, terdapat proses yang diperintah oleh preset OS batas.
Aplikasi lain itu, seperti Docker, dapat memberitahu host OS yang batas-batas yang berlaku untuk proses yang saat ini berjalan, termasuk LXC, bash, dan dev. Docker digunakan untuk menggunakan aplikasi ini untuk langsung berinteraksi dengan OS Linux, tapi sekarang Docker berinteraksi langsung dengan Linux menggunakan perpustakaan sendiri yang disebut "[libcontainer][6]".
Jadi wadah hanyalah proses yang berjalan dalam mode terbatas, mirip dengan apa yang chroot yang digunakan untuk melakukan.
IMO, apa yang membuat Docker terpisah dari wadah lainnya teknologi adalah repositori (Docker) dan alat-alat manajemen yang membuat bekerja dengan wadah yang sangat mudah.
Melihat [Docker (perangkat lunak)][8].
[6]: https://en.wikipedia.org/wiki/Docker_(perangkat lunak)
[8]: https://en.wikipedia.org/wiki/Docker_(perangkat lunak)
Banyak jawaban yang menunjukkan hal ini: Anda membangun Dockerfile untuk mendapatkan gambar dan run gambar untuk mendapatkan wadah.
Namun, berikut ini langkah-langkah yang membantu saya merasa lebih baik untuk apa yang Docker gambar dan wadah adalah:
docker membangun -t my_image dir_with_dockerfile
.tar
filedocker save-o my_file.tar my_image_id
my_file.tar
akan menyimpan gambar. Membukanya dengan tar -xvf my_file.tar
, dan anda akan mendapatkan untuk melihat semua lapisan. Jika anda menyelam lebih dalam ke setiap lapisan anda dapat melihat perubahan apa yang ditambahkan pada masing-masing lapisan. (Mereka harus cukup dekat untuk perintah di Dockerfile).
sudo docker run-itu my_image bash
dan anda dapat melihat bahwa sangat banyak seperti OS.
Gambar adalah setara dengan sebuah definisi kelas di OOP dan lapisan yang berbeda metode dan properti dari class tersebut.
Wadah sebenarnya instansiasi dari gambar yang sama seperti bagaimana sebuah objek adalah instansiasi atau sebuah instance dari sebuah kelas.
Gambar Docker paket aplikasi dan lingkungan yang diperlukan oleh aplikasi untuk menjalankan, dan sebuah wadah yang menjalankan contoh gambar.
Gambar kemasan bagian dari Docker, analog dengan "source code" atau "program". Wadah eksekusi bagian dari Docker, analog dengan "proses".
Pada pertanyaan, hanya "program" bagian ini disebut dan yang's gambar. "berjalan" bagian dari Docker adalah wadah. Ketika sebuah wadah yang dijalankan dan perubahan yang dibuat, it's seolah-olah proses membuat perubahan dalam kode sumber dan menyimpannya sebagai gambar baru.
Seperti dalam pemrograman aspek,
Gambar adalah kode sumber.
Ketika source code dikompilasi dan membangun, hal itu disebut aplikasi.
Serupa dengan "ketika sebuah contoh yang dibuat untuk gambar", hal ini disebut "wadah".
Saya pikir itu lebih baik untuk menjelaskan di awal.
Misalkan anda menjalankan perintah docker berjalan halo-dunia
. Apa yang terjadi?
Itu panggilan Docker CLI yang bertanggung jawab untuk mengambil Docker perintah dan mengubah untuk memanggil Docker server perintah. Sesegera Docker server mendapat perintah untuk menjalankan aplikasi gambar, cek cuaca gambarcache memegang gambar** dengan nama seperti itu.
Kira-halo dunia tidak ada. Docker server pergi Docker Hub (Docker Hub ini hanya tersedia dalam repositori dari gambar) dan bertanya, hei Hub, apakah anda memiliki gambar disebut halo dunia
?
Hub tanggapan - ya, saya lakukan. Kemudian memberikannya kepada saya, silakan. Dan proses download dimulai. Begitu gambar Docker download, Docker server menempatkan itu di cache gambar.
Jadi sebelum kita menjelaskan apa yang Docker gambar dan Docker container, let's mulai dengan pengenalan tentang sistem operasi pada komputer dan cara menjalankan perangkat lunak.
Ketika anda jalankan, misalnya, Chrome pada komputer anda, itu panggilan sistem operasi, sistem operasi itu sendiri panggilan kernel dan bertanya, hei saya ingin menjalankan program ini. Kernel berhasil menjalankan file dari hard disk.
Sekarang bayangkan bahwa anda memiliki dua program, Chrome dan Node.js. Chrome membutuhkan Python versi 2 untuk menjalankan dan Node.js membutuhkan Python versi 3 untuk menjalankan. Jika anda hanya memiliki diinstal Python v2 pada komputer anda, hanya Chrome akan dijalankan.
Untuk membuat kedua kasus bekerja, entah bagaimana anda harus menggunakan sistem operasi fitur yang dikenal sebagai namespacing. Namespace adalah fitur yang memberikan anda kesempatan untuk mengisolasi proses, hard drive, jaringan, pengguna, nama host, dan sebagainya.
Jadi, ketika kita berbicara tentang sebuah gambar kami benar-benar berbicara tentang sistem file snapshot. An gambar fisik file yang berisi arah dan metadata untuk membangun tertentu wadah. The wadah itu sendiri adalah sebuah instance dari sebuah gambar; isolat hard drive menggunakan namespacing yang tersedia hanya untuk ini wadah. Jadi wadah adalah suatu proses atau rangkaian proses yang memiliki sumber daya yang berbeda yang ditugaskan untuk itu.
An gambar adalah "snapshot" a wadah. Anda dapat membuat gambar dari sebuah wadah (baru "snapshot"), dan anda juga dapat memulai wadah baru dari sebuah gambar (instantiate "snapshot").
Misalnya, anda dapat instantiate sebuah wadah baru dari gambar dasar, menjalankan beberapa perintah dalam wadah, dan kemudian foto itu sebagai gambar baru. Kemudian anda dapat menjalankan 100 kontainer dari yang baru gambar.
Hal lain yang perlu dipertimbangkan:
docker gambar
.Singkatnya:
Container adalah sebuah divisi (virtual) ke dalam kernel yang berbagi umum OS dan menjalankan sebuah gambar (gambar Docker).
Wadah adalah self-sustainable aplikasi yang akan memiliki paket dan semua dependensi yang diperlukan bersama-sama untuk menjalankan kode.