Kontainer Docker pada dasarnya adalah instance aplikasi singkat yang tidak memiliki status internal. Itulah cara praktik terbaik untuk menanganinya yang memungkinkan Anda menghentikan atau memulai ulang wadah Anda kapan saja.
Terkadang perubahan pada sistem file container tidak dapat dihindari. Mungkin Anda sedang menguji perangkat lunak dan ingin snapshot kembali lagi nanti. Kasus penggunaan lain mungkin situasi di mana perangkat lunak di dalam wadah berhenti bekerja dan Anda ingin menyimpan salinan yang dapat Anda debug di masa mendatang.
Berikut cara membuat image Docker baru dari container yang sudah ada. Anda bisa memulai satu lagi wadah dari gambar itu untuk diisi dengan sistem file dari yang pertama.
Pembuatan Kontainer
Itu docker commit
Perintah ini digunakan untuk mengambil wadah dan membuat gambar baru darinya. Ini bekerja dengan wadah yang berhenti atau berjalan.
Sintaks dasarnya adalah sebagai berikut:
docker commit example-container example-image:latest
Ini membuat gambar dari wadah bernama example-container
. Anda juga dapat menentukan wadah dengan ID jika Anda mau. Bagian informasi yang sama tersedia dari output dari docker ps
yang mencantumkan semua wadah di Host Anda.
Gambar yang dihasilkan diberi tag yang diberikan sebagai parameter kedua dari perintah. Ini adalah example-image:latest
dalam contoh yang ditunjukkan di atas. Seperti operasi penandaan gambar biasa, gambar baru akan menggantikan referensi tag jika sudah ada.
Sekarang Anda dapat menggunakan gambar Anda untuk memulihkan sistem file dari example-container
dalam contoh wadah baru:
docker run -d example-image:latest
Isi sistem file akan cocok dengan example-container
wadah pada saat docker commit
perintah dieksekusi Ada satu peringatan penting: konten volume yang dipasang tidak akan disertakan, jadi lokasi pemasangannya akan kosong di gambar wadah yang dibuat. Untuk menjalankan wadah baru dengan data volume utuh, gunakan -v
tandai untuk memasang ulang volume dari wadah pertama saat Anda memulai instance kedua dengan docker run
.
Poin penting lainnya adalah bagaimana Docker menangani komit dari menjalankan kontainer. Untuk sebagian besar ini harus bekerja dengan mulus tetapi default untuk menjeda wadah target sebelum melakukan komit. Semua proses dalam wadah akan ditangguhkan dan kemudian dilanjutkan setelah pembuatan gambar selesai. Ini meningkatkan konsistensi data dalam gambar baru tetapi membuat wadah tidak dapat diakses untuk sementara. Anda dapat menonaktifkan perilaku ini dengan mengintegrasikan --pause false
termasuk milikmu docker commit
memesan
Menambahkan Pesan Komit
Itu docker commit
Perintah tersebut mendukung pesan komit dengan cara yang mirip dengan perangkat lunak kontrol versi seperti Git. Menambahkan pesan saat Anda mengkomit gambar dari wadah memungkinkan Anda untuk mendokumentasikan apa yang berubah dan alasan di balik komit Anda.
Menggunakan --message
Hai -m
tandai untuk menerapkan pesan komit:
docker commit -m "Example commit" example-container example-image:latest
Anda juga dapat menambahkan informasi penulis dengan bendera khusus. Berikan string yang sama First Name <email@example.com>
format ke --author
Hai -a
bendera Ini akan disimpan dengan pesan komit.
docker commit -a "Example Author <example@example.com>" -m "Example commit" example-container example-image:latest
Pesan komit ditampilkan saat Anda menggunakan docker history
perintah untuk melihat lapisan dalam gambar. Mereka akan muncul di COMMENT
kolom paling kanan.
Cara lain untuk mengakses informasi ini adalah dengan menggunakan docker inspect
setara dengan grep
untuk mengekstrak nilai penulis dan komentar dari representasi gambar JSON:
docker inspect <image-id> | grep 'Created|Author|Comment'
Ini akan menampilkan data yang terkait dengan lapisan paling atas pada gambar.
Mengubah Instruksi Dockerfile
Membangun gambar memberi Anda kesempatan untuk mengubah beberapa instruksi di Dockerfile-nya. Anda dapat mengganti nilai berikut di gambar baru Anda:
CMD
ENTRYPOINT
ENV
EXPOSE
LABEL
ONBUILD
USER
VOLUME
WORKDIR
Untuk mengatur instruksi, gunakan --change
Hai -c
bendera:
docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest
Anda dapat mengulangi tanda tersebut sebanyak yang diperlukan untuk menerapkan semua perubahan yang Anda inginkan.
Hanya instruksi yang mempengaruhi lapisan tertinggi dari sistem file yang didukung. Anda tidak dapat memperluas gambar terfokus dengan mulus dengan lapisan baru melalui instruksi seperti RUN
dan COPY
. Namun Anda dapat mengambil hasil dari komit dan menulis Dockerfile baru dengan menambahkan konten baru sesuai kebutuhan:
# Created via `docker commit` FROM example-image:latest RUN apt install example-package
Jika Anda mengubah instruksi Dockerfile pada waktu komit, ada baiknya menambahkan pesan komit yang menjelaskan apa yang Anda ubah dan mengapa. Ini akan membantu siapa saja yang memiliki akses ke gambar untuk memahami perbedaan perilaku apa pun dibandingkan dengan wadah tempat gambar itu dibuat.
Ringkasan
Gambar Docker biasanya dibuat dari Dockerfiles dan digunakan untuk memulai wadah sekali pakai. Perubahan pada status sistem file penampung dibuat dengan membangun kembali gambar, menghancurkan penampung saat ini, dan memulai yang baru. Di dunia yang ideal, wadah tidak akan memiliki keadaan internal tetapi ini tidak selalu benar dalam praktiknya.
Membuat wadah memberi Anda cara untuk memulihkan sistem file saat ini di masa mendatang. Komit berguna untuk membuat replika wadah pengganggu sehingga Anda dapat melakukan debug di lingkungan terpisah sambil mempertahankan akses ke log dan file sementara yang dibuat sebelumnya.
Meskipun komit penampung sering kali mirip dengan snapshot VM, mereka tidak sama. VM mengontrol perangkat keras virtual dan status perangkat keras tersebut tercermin dalam snapshot. Kontainer Docker hanyalah sekumpulan proses yang berjalan pada sebuah host; komit adalah gambar Docker baru yang mewakili wadah berkas sistem tetapi harus tanpa data apa pun tentang status proses, kernel, dan perangkat keras Anda.