Ciri khas wadah Docker adalah kekekalan. Setiap saat, Anda dapat menghancurkan dan membuat ulang container untuk membangun kembali keadaan awal. Menggunakan docker commit
perintah, Anda dapat melakukan perubahan baru pada gambar container, tetapi tidak semudah yang Anda harapkan.
Mari kita jelajahi cara mengkomit perubahan ke image container baru dengan docker commit
perintah!
Kapan Melakukan Perubahan pada Gambar Penampung Baru
Wadah dibuat agar tidak dapat diubah (tidak diubah) jadi mengapa Anda ingin melakukan perubahan pada wadah? Ada beberapa alasan.
- Selama pengembangan layanan kemas baru untuk menguji perubahan dengan cepat.
- Lakukan perbaikan bug cepat pada layanan produksi tanpa perlu memperbaiki gambar sumber terlebih dahulu.
- Gunakan
commit
untuk memotret gambar dan mengekspor gambar ke server baru.
Meskipun ini mungkin tidak mencakup semua skenario potensial, ini adalah beberapa yang menggunakan docker commit
kasus penggunaan yang sempurna.
Melakukan Perubahan pada Gambar Sederhana
Untuk perintah yang tampaknya sederhana, perintah ini sangat berguna.
Di bawah ini adalah contoh sederhana commit
memerintah. Menggunakan ID penampung yang sedang berjalan, d3fdd3517e0a
dalam contoh ini, gambar baru dibuat dalam repo yang disebut myrepository
dan diberi nama changedimage
.
Gambar asli diberi tag sebagai version2
, yang tidak diperlukan, tetapi berguna untuk melacak perubahan di antara gambar dengan nama yang mirip.
Keduanya
myrepository
danchangedimage
dipilih secara sewenang-wenang, tetapi ini biasanya mencerminkan sumber daya yang diberi label dengan benar seperticustomimages/alpine-linux
.
docker commit d3fdd3517e0a myrepository/changedimage:version2
Wadah Docker adalah serangkaian gambar hanya-baca dengan lapisan baca-tulis di atasnya. Dalam contoh di atas, Docker menjeda container yang sedang berjalan. Jeda ini untuk mencegah kerusakan data yang tidak disengaja saat Docker membuat gambar
Karena jeda ini dapat menyebabkan gangguan layanan, Anda dapat menggunakan
--pause=false
. Ini dapat merusak data, karena penulisan mungkin tidak berhasil diselesaikan.
Selain itu, commit
operasi menghilangkan data yang terkandung dalam volume yang dipasang di dalam wadah. Karena volume bukan bagian dari sistem file itu sendiri dari wadah, Docker mengabaikannya.
Setelah operasi komit selesai, Docker kemudian membuat layer baru dengan perubahan dari gambar asli di bawah nama gambar wadah baru.
Prasyarat
Satu-satunya prasyarat dalam tutorial ini adalah Docker itu sendiri. Ini dapat diinstal melalui perangkat lunak Docker Desktop di Windows atau diinstal melalui paket di Linux.
Terkait:Menerapkan Wadah Docker Pertama Anda di Windows
Melakukan Perubahan pada Gambar Kontainer Docker Baru
Sekarang mari kita lihat beberapa skenario umum yang docker commit
perintah mungkin berguna untuk.
Pertama, tarik image container Alpine Linux dari repositori Docker publik. Alpine dikenal dengan wadahnya yang ramping, seperti yang terlihat dari ukuran ~5MB.
# Pull the latest Alpine Linux image
docker pull alpine
# List all Docker images
docker images
Pengembangan dan Pengujian Kontainer
Kasus penggunaan utama untuk docker commit
adalah pengembangan gambar wadah baru. Gambar ini pada akhirnya dapat digunakan sebagai dasar untuk gambar lain, atau sebagai wadah produksi itu sendiri.
Dalam contoh cuplikan di bawah ini, Docker adalah:
- Menjalankan
alpine
yang ditarik sebelumnya gambar - Membuka shell interaktif untuk menginstal sebuah paket
- Menginstal paket htop
# Open an interactive shell to the Docker Alpine Linux container
docker run -it a24bb4013296 bin/sh
# Install the HTOP package
apk add htop
Anda dapat melihat di bawah bahwa paket sudah terpasang dengan benar di wadah dengan menjalankan htop
perintah.
Setelah Anda menginstal paket pada "lapisan" baru, Anda sekarang harus melakukan perubahan itu ke gambar dasar asli. Untuk melakukannya:
- Jalankan
docker ps -a
untuk menemukan ID penampung. - Menggunakan ID penampung, komit konten lapisan saat ini ke gambar dasar baru.
Pada contoh di bawah, gambar baru diberi nama alpine-htop
dan diberi tag version1
. Gambar diberi tag untuk memudahkan pelacakan versi gambar buruh pelabuhan yang diberi nama serupa.
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the layer to a new image named alpine-htop and tagged version1
docker commit b57e066d5bfa alpine-htop:version1
# List all images available
docker images
Perbaikan Bug pada Gambar Produksi
Seringkali Anda mungkin memiliki layanan produksi yang memiliki beberapa kesalahan. Mungkin ada perbaikan yang diketahui dan Anda dapat menerapkan perbaikan lebih cepat daripada memodifikasi konfigurasi yang ada dan menerapkan kembali. Menggunakan docker commit
, Anda dapat dengan cepat menerapkan perbaikan, lalu bekerja di latar belakang untuk memperbarui komponen lain yang diperlukan.
Cuplikan contoh di bawah ini menunjukkan penginstalan NGINX ke dalam image Docker Linux Alpine.
# First List the available images
docker images
# Run an interactive session for the alpine-htop image
docker run -it a24bb4013296 bin/sh
# Install the NGINX package
apk add nginx
# Create the location for the NGINX PID file
mkdir /run/nginx
# Verify that NGINX is installed
nginx -v
# Run NGINX
/usr/sbin/nginx
# Verify that NGINX is properly running
ps | grep nginx
# Kill the NGINX process
kill 18
# Verify that the NGINX process is no longer active
ps | grep nginx
Komit wadah NGINX baru yang dibuat di atas ke dalam gambar baru bernama alpine-nginx
dan dengan tag, version1
. Memberi tag pada gambar adalah praktik terbaik, untuk membantu membedakan versi berbeda dari gambar yang sama.
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the changes to a new image named alpine-nginx
docker commit 37043139525c alpine-nginx:version1
# Verify that the new image was created
docker images
Tidak semua yang dapat dieksekusi akan dapat dijalankan di latar belakang, dan NGINX tidak berbeda. Untuk menjalankan wadah ini dengan benar, dengan NGINX berjalan di latar belakang, teruskan -g 'daemon off;'
opsi ke NGINX.
# Run the NGINX container in the background
docker run -d f6b46a3b76be /usr/sbin/nginx -g 'daemon off;'
# Verify that the container is running
docker ps -a
Terakhir, gunakan --change
beralih untuk mengekspos port 80. Dengan memanfaatkan --change
parameter, EXPOSE 80
perintah akan ditulis ke DockerFile dari wadah. Setelah perubahan ini dibuat, mulai wadah baru. Setelah wadah baru dimulai, lanjutkan untuk menghentikan wadah sebelumnya yang salah dijalankan tanpa port yang terbuka. Ini akan membantu mentransisikan container yang tidak berfungsi dengan baik ke container yang berfungsi.
# List all running containers
docker ps -a
# Commit the changes to a new image with an exposed port 80
docker commit --change "EXPOSE 80" c649c813d985 alpine-nginx:version2
# List the running containres
docker ps -a
# List all Docker images
docker images
# Run the newly created image
docker run -d c71f0f9cef7b /usr/sbin/nginx -g 'daemon off;'
# List running containers
docker ps -a
# Stop the prior container without the exposed port 80
docker stop c649c813d985
# List running containers
docker ps -a
Memotret Gambar Docker
Terakhir, bagaimana dengan skenario di mana Anda mungkin perlu memotret, gambar titik waktu, dari wadah yang sedang berjalan untuk memindahkan wadah ke server baru? docker commit
perintah berfungsi dengan baik untuk melakukan itu, seperti yang Anda lihat di bawah.
Perintah di bawah ini membuat container berjalan yang akan kita hentikan dan komit ke alpine-nginx
baru versi.
# List running Docker containers
docker ps -a
# Create a new running Docker NGINX container
docker run -d c71f0f9cef7b
# List running Docker containers
docker ps -a
# Stop the Docker container
docker stop 7ff99f2bcf6b
# Create a new alpine-nginx version to export
docker commit 7ff99f2bcf6b alpine-nginx:version3
# List the Docker images available
docker images
Ekspor gambar Docker ke file. Dalam contoh ini, file ekspor bernama export.tar
, tetapi beri nama file sesuai kebutuhan Anda. Terakhir, impor export.tar
file kembali ke Docker, mendemonstrasikan proses ujung ke ujung.
Pastikan untuk mengekspor menggunakan format
repo:tag
jika Anda ingin label tersebut dipertahankan saat mengimpor ulang gambar.
# Save the image to a file on the local disk
docker save -o export.tar alpine-nginx:version3
# Verify that the image exists
ls
# Remove the just exported Docker image
docker rmi 39ca9e64828a
# List Docker images and verify that the image is removed
docker images
# Load the Docker image back in
docker load -i export.tar
# List Docker images and show that the image has been loaded back in
docker images
Opsi Tambahan untuk Perintah Komit Docker
Memanfaatkan opsi tambahan yang tersedia untuk commit
perintah, banyak skenario berbeda yang didukung.
Menjeda Penampung
Untuk tidak menjeda wadah saat sedang berjalan, Anda dapat meneruskan --pause=false
perintah untuk menonaktifkan fitur jeda. Ini sering digunakan saat mencadangkan layanan produksi dan menjeda layanan tersebut akan merugikan.
Perintah jeda juga memiliki singkatan -p
yang mungkin lebih cepat untuk digunakan. Namun perlu diketahui bahwa dengan mengabaikan jeda penampung, Anda berisiko merusak data, jika terjadi penulisan sistem file, yang dapat menyebabkan penulisan data tidak lengkap atau rusak.
Meninggalkan Pesan Komit
Akrab bagi banyak pengembang adalah menyediakan pesan komit yang benar. Sama seperti dalam menggunakan kontrol sumber, idealnya Anda ingin memberikan pesan berguna yang menjelaskan mengapa versi baru penampung di-commit.
Ini dapat dilakukan dengan menggunakan --message="message to commit"
memerintah. Seperti sebelumnya, ada versi singkat dari perintah ini, -m
. Untuk melihat daftar pesan komit Docker, gunakan docker history
perintah.
Mendefinisikan Penulis
Untuk menunjukkan dengan benar siapa yang membuat perubahan, Anda dapat memberikan nilai penulis yang akan memberikan beberapa konteks tambahan kepada siapa yang membuat perubahan. Ini dapat digunakan melalui --author="Jane Author ([email protected])"
. Perintah ini juga dapat digunakan melalui singkatan -a
. Menggunakan docker inspect
Anda akan dapat mengambil daftar JSON dari informasi penampung, termasuk label seperti penulis.
Menerapkan Perubahan DockerFile Secara Paralel
Terakhir, perintah paling rumit yang dapat digunakan dalam docker commit
perintahnya adalah change
parameter. Parameter ini menerapkan perubahan dalam penampung ke DockerFile pada saat yang sama dengan komit.
Anda dapat menggunakan change
parameter dengan meneruskan instruksi ke Dockerfile seperti ini, --change="ENV TEST true"
. Perintah ini menempatkan teks, ENV TEST true
ke dalam DockerFile. Sekarang ketika penampung dimulai lagi, perubahan yang Anda tetapkan di sini akan sudah diterapkan.
Alih-alih
--change
nama, Anda dapat mengambil jalan pintas dan menggunakan-c
alias.
Dengan perintah ini, Anda juga dapat merangkai beberapa --change
parameter bersama. Ini memungkinkan Anda untuk dengan mudah menambahkan beberapa perubahan ke DockerFile dalam satu perintah komit.
Ubah Opsi Parameter
Anda hanya dapat menggunakan beberapa perintah dengan change
parameter seperti yang ditunjukkan di bawah ini.
CMD
– Instruksi CMD berbentuk CMD ["executable","parameter1","parameter2"]
. Ini adalah metode yang disukai, tetapi perlu diingat bahwa hanya satuCMD
bisa ada di DockerFile pada suatu waktu.CMD
terakhir akan menjadi salah satu yang berlaku. Tujuan utamaCMD
adalah untuk memberikan perintah eksekusi default untuk wadah saat dibuat.ENTRYPOINT
– Serupa dengan perintah CMD, ENTRYPOINT menggunakan sintaksENTRYPOINT ["executable","parameter1","parameter2"]
. Sintaks ini menimbulkan pertanyaan mengapa menggunakan ENTRYPOINT melalui CMD?
Perintah ENTRYPOINT menjalankan executable sebagai proses utamaPID 1
. Tindakan ini kemudian memungkinkan Anda untuk mematikan proses menggunakandocker stop
dengan anggun. Selain itu, Anda dapat menggunakanCMD
dengan ini dengan meninggalkanexecutable
bagian yang meneruskan parameter tersebut keENTRYPOINT
dapat dieksekusi.ENV
– Karena sebagian besar aplikasi menggunakan variabel lingkungan, perintah ENV memungkinkan Anda mengaturnya secara sederhana dalam format nilai kunciENV key=value
. Akses variabel key=value ini sebagai variabel lingkungan Linux standar.EXPOSE
– Perintah EXPOSE memperlihatkan port dan protokol opsional di luar wadah. Perintah ini memetakan port di dalam container ke luar container dan memungkinkan container berinteraksi dengan sumber daya luar seperti server web yang menyajikan konten.LABEL
– Perintah LABEL menambahkan metadata ke wadah. Anda dapat menambahkan metadata dengan menggunakan format,LABEL version="2.0"
untuk melihat metadata tambahan, gunakan perintah inspeksi gambar buruh pelabuhan.ONBUILD
– Perintah ONBUILD menambahkan instruksi untuk dieksekusi nanti ketika gambar digunakan sebagai dasar untuk pembuatan wadah lain. Parameter ini menggunakan perintah ADD dan RUN untuk menambahkan konten dengan perintah ADD atau RUN yang dapat dieksekusi.USER
-Perintah USER menetapkan nama pengguna (atau UID) dan secara opsional grup pengguna (atau GID) untuk digunakan saat menjalankan gambar. Ini terlihat sepertiUSER myuser:mygroup
dalam praktik.- VOLUME – Dengan sebagian besar container, Anda perlu mengakses data dengan cara tertentu. Perintah VOLUME akan membuat titik pemasangan dengan nama tertentu yang menandainya sebagai memegang volume yang dipasang secara eksternal. Ini biasanya digunakan seperti ini,
VOLUME ["/data"]
. WORKDIR
– Terakhir, perintah WORKDIR menetapkan direktori kerja perintah CMD atau ENTRYPOINT. Ini digunakan seperti ini,WORKDIR /path/to/directory
. WORKDIR berguna saat Anda perlu memulai eksekusi tetapi lokasinya tidak berada dalam variabel lingkungan PATH default.
Kesimpulan
docker commit
perintah sangat kompleks. Meskipun ada sintaks sederhana, dengan kemampuan untuk menambahkan perubahan DockerFile saat menggunakan perintah komit, Anda dapat dengan cepat membuat perubahan yang tetap ada pada pembuatan container berikutnya melalui DockerFile.
Perintah ini mungkin tidak diperlukan untuk semua situasi, tetapi untuk pemecahan masalah yang cepat dan untuk snapshot container yang dapat dengan mudah dipindahkan melintasi server, perintah commit dengan cepat menjadi sangat berguna!