GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Menggunakan Docker Commit untuk Mengubah Gambar Kontainer

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 dan changedimage dipilih secara sewenang-wenang, tetapi ini biasanya mencerminkan sumber daya yang diberi label dengan benar seperti customimages/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 satu CMD bisa ada di DockerFile pada suatu waktu. CMD terakhir akan menjadi salah satu yang berlaku. Tujuan utama CMD adalah untuk memberikan perintah eksekusi default untuk wadah saat dibuat.
  • ENTRYPOINT – Serupa dengan perintah CMD, ENTRYPOINT menggunakan sintaks ENTRYPOINT ["executable","parameter1","parameter2"] . Sintaks ini menimbulkan pertanyaan mengapa menggunakan ENTRYPOINT melalui CMD?

    Perintah ENTRYPOINT menjalankan executable sebagai proses utama PID 1 . Tindakan ini kemudian memungkinkan Anda untuk mematikan proses menggunakan docker stop dengan anggun. Selain itu, Anda dapat menggunakan CMD dengan ini dengan meninggalkan executable bagian yang meneruskan parameter tersebut ke ENTRYPOINT dapat dieksekusi.
  • ENV – Karena sebagian besar aplikasi menggunakan variabel lingkungan, perintah ENV memungkinkan Anda mengaturnya secara sederhana dalam format nilai kunci ENV 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 seperti USER 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!


Docker
  1. Cara Memindahkan Gambar Docker antar Host

  2. Cara Menggunakan Dockerfile untuk Membangun Gambar Docker

  3. Cara Memodifikasi Gambar Docker

  1. Cara melakukan perubahan pada gambar Docker

  2. Cara membuat Gambar Docker dari Wadah dan File Docker

  3. Bagaimana cara menggunakan gambar buruh pelabuhan lokal dengan Minikube?

  1. Cara Berbagi Gambar Docker Dengan Orang Lain

  2. Cara membuat gambar khusus dari wadah Docker

  3. Cara Mengubah Zona Waktu Untuk Wadah Docker