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

Perintah Docker untuk Mengelola Siklus Hidup Container (Panduan Definitif)

Mengetahui berbagai status Docker Container sangat penting bagi setiap pengguna Docker yang serius.

Saya akan menjelaskan daur hidup container dan kemudian menampilkan perintah Docker untuk setiap tahap daur hidup.

Namun sebelum Anda mempelajari semua itu, mari kita tinjau kembali konsep container sekali lagi.

Apa itu container Docker lagi?

Definisi kontainer yang paling tradisional seperti ini:

Container adalah bentuk virtualisasi sistem operasi. Sementara virtualisasi berbasis hypervisor tradisional memerlukan kernel terpisah untuk VM terpisah, container berbagi kernel host yang sama, dan oleh karena itu, jauh lebih ringan dan lebih cepat untuk dijalankan

Definisi akan berbeda dari sumber ke sumber, tetapi intinya sama.

Saya merasa itu membosankan dan tidak perlu rumit. Saya ingin menggunakan sesuatu yang berbeda di sini untuk mendefinisikan container.

Container adalah sekumpulan proses yang ditipu.

Mengapa saya mengatakan itu? Karena container hanyalah kumpulan proses, terkadang hanya satu proses. Dan proses-proses ini dibohongi tentang sumber daya yang berbeda dari host-nya seperti jaringan, pohon proses, sistem file, nama host, dll.

Anda dapat menjalankan proses apa pun, bahkan shell seperti bash , dan sembunyikan pohon proses Anda yang sebenarnya darinya, berikan set jaringan yang berbeda, sembunyikan sistem file root yang sebenarnya darinya, berikan nama host yang berbeda dan pada dasarnya, yang akan Anda lakukan adalah membuat versi proses yang terkemas.

Ini dicapai dengan ruang nama, sistem file root dan cgroup yang terpisah.

Docker hanyalah pembungkus di sekitar alat tingkat bawah yang menjalankan dan mengelola container, atau lebih khusus lagi mengatakan siklus hidup container .

Selain itu, Docker juga melakukan banyak hal lain, seperti membuat jaringan untuk container menjadi mudah, menangani penyimpanan, menarik &mendorong gambar container, dll.

Docker hadir untuk membuat hidup kita lebih mudah.

Sekarang, mari kita lihat Siklus Hidup Kontainer Docker

Siklus hidup container pada dasarnya adalah serangkaian tahapan, mulai dari pembuatan container hingga pemusnahannya.

Diagram berikut akan memperjelas hal ini.

Izinkan saya menjelaskan setiap tahap siklus hidup container.

  • Kreasi: Banyak orang berpikir bahwa ketika Anda menjalankan container, itu hanya satu langkah. Tapi bukan itu masalahnya. Ada proses yang membuat wadah terlebih dahulu sebelum yang lainnya. Lebih lanjut tentang ini nanti.
  • Mulai/Berjalan: Setelah container dibuat, container dapat dimulai, setelah itu statusnya berubah menjadi Running . Ini adalah saat wadah benar-benar melakukan sesuatu.
  • Dijeda: Secara tradisional untuk menjeda proses (yang pada dasarnya adalah wadah), kami menggunakan sinyal SIGSTOP, dan untuk membatalkan jeda, sinyal SIGCONT. Tetapi karena sinyal ini dapat diamati oleh proses, alih-alih sinyal, freezer cgroup digunakan. Dengan cara ini proses dihentikan dengan membekukan cgroup.
  • Keluar/Berhenti: Kebalikan dari Running , tetapi tidak sama dengan Paused . Menghentikan wadah berarti mengirimkan sinyal SIGTERM ke proses wadah utama, yaitu, PID 1 di ruang nama wadah. Kemudian menunggu 10 detik untuk membiarkan proses keluar dengan anggun. Jika tidak, SIGKILL sinyal dikirim, dan kita semua tahu apa artinya itu, bukan?
  • Hancur/Dihapus: Wadah tidak ada lagi, semua sumber daya yang pernah dialokasikan, sekarang hilang.

Saya harap ini membuat konsep siklus hidup kontainer lebih jelas sekarang. Di bagian berikut, saya akan membahas semua perintah buruh pelabuhan khusus yang akan membantu Anda dalam mengelola semua status wadah ini.

Perintah Docker untuk Mengelola Siklus Hidup Container

Semua perintah (subcommands, jika lebih spesifik) yang mengontrol siklus hidup container milik subcommand container .

Di terminal jika Anda menjalankan docker container --help Anda akan mendapatkan daftar subperintah yang terkait dengan beberapa operasi yang dapat dilakukan pada wadah.

Tapi kami tidak peduli tentang mereka semua di sini. Mari kita fokus hanya pada subset tertentu dari itu.

Pembuatan Kontainer

Pembuatan container ditangani dengan perintah berikut:

  1. docker container create
  2. docker create

Yang pertama adalah bentuk panjang, sedangkan yang kedua, Anda dapat menebaknya dengan benar, adalah bentuk pendek.

Saya sarankan Anda menggunakan formulir panjang karena lebih bertele-tele dan sesuatu yang saya anggap sebagai praktik yang baik.

Apa itu pembuatan container?

Pembuatan wadah adalah membuat lapisan R/W di atas lapisan R/O gambar yang ditentukan, dan mempersiapkannya untuk menjalankan program yang diperlukan. Membuat wadah tidak memulai proses yang sebenarnya, Anda dapat menentukan semua parameter konfigurasi seperti kemampuan, batas CPU, batas memori, gambar wadah dll tepat pada tahap pembuatan dan kemudian memulai wadah kapan saja Anda mau tanpa harus menentukan ulang parameter tersebut .

Baca docker container create --help untuk daftar opsi yang dapat dikonfigurasi.

Contoh

Pertama buat container seperti berikut (saya menggunakan alpine gambar di sini untuk menjalankan perintah sleep infinity )

docker container create \
	--name alpine alpine:latest sleep infinity

Setelah wadah dibuat, Anda harus mendapatkan ID-nya di layar terminal. Sekarang Anda dapat memfilter daftar penampung untuk menemukan penampung yang tidak berjalan, tetapi baru saja dibuat .

docker container ls --filter=status=created

Di sini saya memfilter daftar sehingga saya hanya mendapatkan wadah yang dibuat. Lihat STATUS kolom, itulah yang menentukan status wadah. Anda akan melihat sesuatu seperti berikut:-

➟ docker container ls --filter=status=created
CONTAINER ID   IMAGE           COMMAND            CREATED          STATUS    PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   17 seconds ago   Created             alpine

Anda juga dapat memeriksa wadah dan melihat kondisinya.

➟ docker container inspect -f '{{json .State.Status}}' alpine
"created"

Menggunakan docker create tidak akan memberi Anda sesuatu yang berbeda.

Memulai Penampung

Untuk memulai penampung, gunakan salah satu dari dua perintah berikut:-

  1. docker container start
  2. docker start

Hal yang sama di sini, satu versi panjang dan satu versi pendek. Dan saya sarankan Anda menggunakan ...container start perintah.

Apa itu startup kontainer?

Setelah wadah dibuat, Anda dapat memulainya. Memulai wadah berarti benar-benar menjalankan aplikasi dalam wadah.

Saat membuat wadah hanya menyiapkan semua konfigurasi (bagaimana wadah akan berjalan, lingkungan runtime, kendala runtime, nama wadah dll), itu tidak mengalokasikan sumber daya apa pun.

Memulai wadah mengalokasikan sumber daya yang diperlukan dan menjalankan aplikasi.

Contoh

Perhatikan container sebelumnya yang kita buat. Cukup mulai perintah dengan nama wadah atau ID seperti ini:

docker container start alpine

Setelah penampung dimulai, statusnya berubah dari Created untuk Running . Dalam daftar penampung, Anda dapat memfilter menurut status lagi seperti yang Anda lakukan sebelumnya:-

docker container ls --filter=status=running

Pada STATUS kolom, bukannya Running itu akan menunjukkan berapa lama wadah telah berjalan sejak dimulai.

➟ docker container ls --filter=status=running
CONTAINER ID   IMAGE           COMMAND            CREATED         STATUS          PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   8 minutes ago   Up 18 seconds             alpine

Anda juga dapat memeriksa wadah untuk melihat statusnya. Saya akan menggunakan template Go untuk memformat output menjadi satu-satunya hal yang saya perlukan, yaitu status.

docker container inspect \
	-f '{{json .State.Status}}' alpine

Anda akan melihat sesuatu seperti ini -

➟ docker container inspect -f '{{json .State.Status}}' alpine
"running"

Tidak terdengar berlebihan, tetapi docker start akan melakukan hal yang sama.

Perintah Menjalankan Docker Khusus

Ini adalah perintah khusus yang menyatukan pembuatan container dan startup dan ini adalah perintah yang paling sering kita gunakan.

  1. docker container run
  2. docker run

Perintah-perintah ini pada dasarnya (i) membuat wadah dan kemudian segera (ii) memulai wadah yang sama.

Ini berguna karena membuat dan meninggalkan wadah untuk memulai di lain waktu bukanlah sesuatu yang terlalu sering kita lakukan. Saat Anda berada di baris perintah, dengan CLI buruh pelabuhan, Anda berada di sini untuk menjalankan sebuah wadah. Dan itulah yang ...container run perintah tidak.

Contoh

Contoh perintah ini sangat sederhana. Untuk menjalankan wadah, alih-alih docker container create , gunakan docker container run .

Anda akan harus melewati semua opsi yang akan Anda berikan ke docker container create ke docker container run memerintah. Ini karena buruh pelabuhan membutuhkan semua informasi itu saat itu juga karena tidak ada lagi langkah kedua.

➟ docker container run --name echo-me alpine:3.13.4 echo "Subscribe to Linux Handbook"
Subscribe to Linux Handbook
Docker Run vs Start vs Create:Perbedaan Dijelaskan Untuk pemula docker, istilah seperti docker start, docker run, dan docker create bisa membingungkan. Artikel ini menjelaskan perbedaannya dengan contoh. Buku Pegangan LinuxAbhishek Prakash

Jeda Penampung

Menjeda wadah berarti persis seperti apa kedengarannya. Kami tidak menghentikan proses apa pun, hanya menjedanya. Jadi, jika proses di dalam wadah menghitung dari 1 hingga 100, dan dihentikan sementara pada hitungan 50 dan kemudian tidak dijeda di lain waktu, penghitungan akan melanjutkan dari 50.

Satu hal yang perlu dipahami adalah saat Paused adalah keadaan sebenarnya, Unpaused tidak. Saat Anda membuka jeda beberapa penampung yang dijeda, pada dasarnya Anda mengubah status dari Paused untuk Running .

Perintah yang digunakan untuk menjeda container adalah sebagai berikut:-

  1. docker container pause
  2. docker pause

Demikian pula, Anda dapat membatalkan jeda wadah dengan rekanan yang membatalkan jeda:-

  1. docker container unpause
  2. docker unpause

Bagaimana penampung dijeda?

Sebuah proses dijeda dengan menggunakan sinyal SIGSTOP, dan untuk membatalkan jeda, digunakan sinyal SIGCONT. Karena sinyal ini dapat diamati oleh proses, alih-alih sinyal, freezer cgroup digunakan. Dengan cara ini proses dihentikan dengan membekukan cgroup. Membekukan cgroup akan membekukan semua tugasnya, dan semua cgroup turunannya.

Contoh:

Demi demo ini, saya telah membuat wadah khusus. Tarik gambar dengan menjalankan perintah berikut:-

docker image pull debdutdeb/pause-demo:v1

Anda dapat memeriksa Dockerfile dan kodenya di sini.

Setelah ditarik, pada satu terminal, mulai wadah dengan gambar ini

docker container run --name pause-demo debdutdeb/pause-demo:v1

Sekarang seharusnya menunjukkan penghitungan mulai dari 0 dan seterusnya. Seharusnya terlihat seperti berikut

➟ docker container run --name pause-demo debdutdeb/pause-demo:v1 
Count at 30

Di terminal lain, jeda penampung ini.

docker container pause pause-demo

Saat Anda menjeda wadah, Anda akan melihat hitungan mundur berhenti, tetapi terminal belum kembali kepada Anda. Ini karena wadahnya belum berhenti (saya akan membicarakannya nanti di artikel ini). Setelah Anda membatalkan jeda penampung ini, hitungan mundur akan dilanjutkan, bukan dimulai ulang.

docker container unpause pause-demo

Untuk mendapatkan kembali terminal, jalankan terminal terpisah

docker container stop pause-demo

Berikut adalah video singkat yang akan menunjukkan ini dalam tindakan:-

Sebelum menghentikan wadah Anda dapat menyukai yang sebelumnya, periksa keadaan wadah yang dijeda seperti ini:

➟ docker container inspect -f '{{json .State.Status}}' pause-demo 
"paused"

Penghentian Kontainer

Anda dapat menghentikan wadah Docker menggunakan salah satu dari dua perintah berikut:-

  1. docker container stop
  2. docker stop

Menghentikan wadah berarti menghentikan semua proses yang terkait dengannya.

Ini tidak sama dengan menjeda wadah. Jika Anda menghentikan wadah, Anda dapat memulai kembali, tetapi proses tidak akan melanjutkan dari keadaan sebelumnya. Suatu proses dapat menyimpan informasi statusnya dalam "file", dan memulihkan statusnya dari file itu, tetapi itu kasus yang berbeda.

Misalnya, setelah Anda menghentikan pause-demo sebelumnya container, jika Anda mencoba dan memulai ulang menggunakan ...container start perintah, itu akan mulai menghitung dari awal, tidak seperti pause rekanan yang melanjutkan penghitungan.

Bagaimana prosesnya?

Saat Anda meminta Docker untuk menghentikan sebuah wadah, ia mengirimkan SIGTERM sinyal ke PID 1 wadah. Setelah itu, menunggu selama 10 detik, yang merupakan periode waktu anggunnya, proses ini diberikan waktu untuk keluar dengan anggun, dengan kata lain membersihkan dan menyelesaikan apa pun yang berfungsi. Setelah 10 detik selesai, Docker mengirimkan SIGKILL terakhir sinyal, saya tidak perlu memberi tahu Anda apa yang terjadi selanjutnya.

Docker mengirimkan sinyal ke PID 1 container karena setiap proses lainnya adalah anak dari PID 1, jika proses ini dihentikan/dimatikan, proses chil akan secara otomatis tidak ada lagi.

Ini menjadi lebih jelas dengan contoh di bawah ini.

Contoh:

Anda perlu menarik gambar lagi.

docker image pull debdutdeb/stop-demo:v1

Untuk Dockerfile dan kode sumber, lihat intisari ini.

Di satu terminal, jalankan container dari gambar ini.

docker container run --name stop-demo debdutdeb/stop-demo:v1

Setelah dijalankan, Anda akan melihat layar yang memberi tahu Anda PID-nya dan menunggu.

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...

Buka terminal lain, dan jalankan perintah stop pada container ini.

docker container stop stop-demo

Setelah dijalankan, Anda akan melihat di terminal yang menjalankan penampung, memberi tahu Anda apa TI sedang mengalami, yaitu menerima SIGTERM sinyal.

Setelah itu mulai menghitung detik, dan Anda akan melihat setelah 10 detik itu berhenti menghitung. Ini bukan karena saya membuat kode keras seperti itu, sebenarnya saya membuat kode keras untuk melanjutkan tanpa batas.

Tapi setelah 10 detik buruh pelabuhan mengirimkan SIGKILL sinyal yang tidak dapat kita tangkap atau abaikan, prosesnya pasti akan dihentikan.

Anda dapat mengubah waktu tunggu buruh pelabuhan sebelum mengirim SIGKILL sinyal dengan menggunakan -t opsi dengan docker container stop .

Setelah semuanya selesai, Anda akan melihat sesuatu seperti ini

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...
SIGTERM ignored,
Starting count..
10 seconds

Berikut adalah video kecil yang menunjukkan hal ini:-

Anda dapat memeriksa status penampung ini sekarang menggunakan ...container inspect seperti ini:-

➟ docker container inspect -f '{{json .State.Status}}' stop-demo
"exited"

Penghapusan Penampung

Wadah dihapus menggunakan salah satu dari dua perintah berikut:-

  1. docker container rm
  2. docker rm

Penghapusan container adalah kebalikan dari pembuatan container. Saat Anda menghapus penampung, penampung itu hilang, Anda tidak dapat membawa khusus itu wadah kembali. Anda dapat memulai yang baru dari gambar yang sama menggunakan konfigurasi yang sama, membuatnya identik, tetapi tidak akan sama persis dengan yang sebelumnya.

Contoh:

Sebagai contoh hapus saja stop-demo sebelumnya wadah.

docker container rm stop-demo

Hingga saat ini, semua container yang Anda buat dan kemudian dihentikan dapat dihapus dengan satu perintah:-

docker container prune

Ini akan menghapus semua wadah dengan status Exited .

Contoh keluaran:

✗ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ffbdd621c01d0eb3f42d348eeb75c731ddd9bd85674bb90dece32bd70357e541
21b9ed6a6198cd6ee7e162aebd936ae3e93b3b0f738161924a825a27794f2b20
f5f5149866a6ced675ad3bfff0b7386f75ee3fdbddca86be8b8ba341dba4b27f

Total reclaimed space: 0B

Jadi, Anda telah mempelajari konsep siklus hidup container. Dan Anda juga mempelajari perintah Docker untuk mengelola setiap tahap siklus hidup container. Jika Anda menginginkan beberapa tips Docker lainnya, Anda dapat mempelajari tentang perintah Docker yang kurang dikenal tetapi berguna ini.

3 Perintah Docker yang Harus Diketahui Pengguna Docker Tingkat Lanjut Berikut adalah beberapa perintah Docker yang mungkin tidak Anda ketahui tetapi dapat berguna saat mengelola container Anda. Linux HandbookDebdut Chakraborty

Saya sangat berharap artikel ini telah membuat teori siklus hidup kontainer mudah dipahami dan juga menghapus semua perintah yang Anda perlukan untuk mengelola status yang berbeda ini.

Jika Anda memiliki pertanyaan, silakan tinggalkan komentar di bawah.


Docker
  1. Cara Menjalankan MySQL di Docker Container:Panduan Sederhana dan Mudah Diikuti

  2. Beberapa Perintah DOCKER

  3. Cara Mengubah Zona Waktu Untuk Wadah Docker

  1. Apa itu Docker Container:Panduan Pengantar untuk Pemula

  2. Cara Menjalankan Nginx dalam Wadah Docker:Panduan Langkah demi Langkah

  3. Pengantar Docker

  1. Daftar Perintah Docker:Cheat Sheet

  2. Perintah Docker Lembar Cheat Referensi Cepat

  3. Cara Membuat Wadah Docker MySQL untuk Pengujian