Perbezaan Docker Compose Stop vs Down
Ketahui perbezaan utama antara docker compose stop dan down. Arahan stop mengekalkan kontena manakala down memadamkan kontena serta rangkaian projek secara kekal.
Jawapan ringkas
docker compose stop menghentikan kontena dan membiarkannya tersimpan pada cakera. docker compose down menghentikan kontena tersebut kemudian memadamkan kontena serta rangkaian yang dicipta oleh Compose untuk projek berkenaan. Kedua-dua arahan tidak menyentuh mana-mana volume yang dinamakan (named volume). Menambah -v, seperti dalam docker compose down -v, akan membuang volume dinamakan bukan luaran yang diisytiharkan dalam bahagian volumes fail Compose yang tergolong dalam projek ini. Apa yang dilupuskan oleh down ialah sebarang data yang ditulis oleh kontena ke dalam lapisan boleh tulisnya sendiri, di luar mana-mana volume.
Itulah perbezaan keseluruhannya dalam satu perenggan. Selebih panduan ini membuktikannya dengan volume Postgres yang boleh anda perhatikan kekal selepas down dan hilang di bawah down -v, serta menjelaskan dua kes di mana anda memerlukan --force-recreate.
docker compose stop: bekas kekal ada
stop menghantar isyarat henti yang dikonfigurasikan bagi bekas, iaitu SIGTERM secara lalai, kepada proses utama dalam setiap bekas, menunggu, kemudian menghantar SIGKILL jika proses tersebut masih aktif. Tempoh tunggu lalai ialah 10 saat dan -t mengubah tempoh tersebut. Tiada apa-apa yang dipadamkan. Bekas mengekalkan ID, lapisan boleh tulis (writable layer), dan lognya.
docker compose stop
docker compose ps -adocker compose ps secara sendirinya hanya memaparkan bekas yang sedang berjalan, jadi selepas stop ia mencetak jadual kosong dan pengguna menyangka bekas tersebut telah hilang. ps -a menyertakan bekas yang telah dihentikan, dan di situlah anda akan melihat status Exited di sebelah setiap servis, berserta kod keluar (exit code) yang dikembalikan oleh prosesnya. Penutupan yang bersih sering menunjukkan Exited (0), tetapi tidak semestinya. Sesetengah pelayan menamatkan penutupan secara tertib (graceful shutdown) dan kemudian membangkitkan semula isyarat henti supaya proses berakhir dengan isyarat tersebut, dan Uvicorn melakukan perkara ini, jadi penutupan yang teratur masih boleh meninggalkan kod bukan sifar. Kod bukan sifar juga boleh bermaksud proses gagal atau dimatikan selepas tamat tempoh masa (timeout). Hidupkan semula bekas tersebut dengan docker compose start, yang menggunakan semula bekas yang sama.
Oleh kerana bekas tersebut masih wujud, apa-apa yang ditulis di dalamnya di luar volume akan kekal ada. Ini termasuk pakej yang anda pasang secara manual dengan docker compose exec, dan fail konfigurasi yang anda sunting di dalam bekas. Ini adalah sebab praktikal untuk memilih stop semasa anda melakukan penyahpepijatan (debugging): anda boleh memulakan semula ke dalam keadaan yang sama.
docker compose down: kontena dan rangkaian dialih keluar
down menghentikan kontena dan kemudian mengalih keluarnya, bersama-sama dengan rangkaian lalai yang dicipta oleh Compose untuk projek tersebut. Dokumentasi Docker menerangkannya sebagai menghentikan kontena dan mengalih keluar kontena, rangkaian, volum dan imej yang dicipta oleh up, namun bahagian volum dan imej hanya berlaku apabila anda memintanya dengan -v dan --rmi.
docker compose down
docker compose ps -a
docker network lsSelepas down, ps -a tidak mencetak apa-apa untuk projek tersebut dan rangkaian <project>_default telah tiada. Nama projek diambil daripada nama direktori projek kecuali jika anda menetapkan name: dalam fail Compose, menetapkan COMPOSE_PROJECT_NAME, atau menghantar -p. Setiap perubahan yang anda buat di dalam lapisan boleh tulis (writable layer) kontena kini tidak boleh dipulihkan, jadi anggap down sebagai arahan yang membuang kontena dan mengekalkan data yang anda letakkan dalam volum.
Jika Compose tidak dapat mencari fail konfigurasi dalam direktori semasa atau direktori induknya, dan anda tidak membekalkannya melalui -f atau COMPOSE_FILE, anda akan mendapat no configuration file provided: not found. Compose tidak tahu projek mana yang anda maksudkan, jadi ia menolak. Gunakan docker compose -f /srv/myapp/compose.yaml down apabila anda tidak berada dalam folder projek.
Adakah docker compose down memadamkan volume saya?
Tidak. Volume bernama yang diisytiharkan di bawah kunci peringkat atas volumes akan terus wujud selepas down, dan ia juga terus wujud selepas kontena yang dipasang padanya dipadamkan. Ini adalah kebimbangan paling lazim mengenai arahan tersebut. Compose v5.7.0 telah mengubah down -v: ia kini melangkau volume bernama yang dimiliki oleh projek lain atau yang dicipta di luar Compose, dengan memaparkan amaran.
Sediakan satu stack yang boleh anda uji. Letakkan ini dalam compose.yaml di dalam direktori kosong bernama voltest.
services:
db:
image: postgres:16.4
restart: unless-stopped
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:Mulakan stack tersebut dan tulis satu baris yang anda akan kenali kemudian.
docker compose up -d
sleep 10
docker compose exec -T db psql -U postgres -c "create table marker (note text);"
docker compose exec -T db psql -U postgres -c "insert into marker values ('survived');"Sekarang, musnahkan kontena tersebut dan semak volume berkenaan.
docker compose down
docker volume lsOutput tersebut masih menyenaraikan voltest_pgdata. Kontena telah tiada tetapi data masih kekal. Hidupkan semula stack tersebut dan baca baris tadi.
docker compose up -d
sleep 10
docker compose exec -T db psql -U postgres -c "select * from marker;"Anda akan mendapat satu baris yang mengandungi survived. Kontena baharu itu merupakan kontena berbeza dengan ID berbeza, yang dipasang pada volume yang sama. Jika anda mahukan gambaran yang lebih luas, panduan asas Compose membincangkan perbezaan antara volume bernama dengan bind mount serta lokasi sebenar setiap satunya pada hos.
Apakah yang sebenarnya dimusnahkan oleh down -v
-v (bentuk panjang --volumes) membuang volume bernama bukan luaran yang diisytiharkan dalam bahagian volumes fail Compose yang tergolong dalam projek ini, serta volume tanpa nama yang dilampirkan pada container. Dalam Compose v5.7.0, volume bernama dengan label pemilikan projek lain atau tiada label projek akan dilangkau dengan amaran; jika pemilikannya tidak dapat diperiksa, arahan tersebut gagal dan mengekalkan volume itu. Jalankan arahan tersebut terhadap stack yang sama.
docker compose down -v
docker volume lsvoltest_pgdata tidak lagi disenaraikan. Mulakan semula stack tersebut dan entrypoint Postgres akan menemui direktori data yang kosong, lalu ia memulakan kluster yang baharu. Log container menyatakan perkara ini dengan jelas.
The files belonging to this database system will be owned by user "postgres".
PostgreSQL init process complete; ready for start up.Melihat blok tersebut pada stack yang telah berjalan selama berbulan-bulan bermakna Postgres sedang memulakan direktori data yang kosong. Jadual marker anda telah hilang dan satu-satunya cara untuk mendapatkannya semula adalah melalui sandaran (backup).
Sesetengah storan tidak pernah dibuang oleh -v. Bind mount ialah laluan hos, jadi Docker hanya menyahlekapnya dan fail anda kekal di tempat asalnya. Volume yang ditandakan sebagai external: true diisytiharkan sebagai milik sesuatu di luar projek ini, dan Compose tidak pernah membuangnya. Volume bernama yang anda padamkan daripada fail Compose sebelum menjalankan down -v tidak lagi diisytiharkan, jadi Compose tidak tahu untuk membuangnya dan ia ditinggalkan sebagai yatim untuk docker volume prune -a sebaik sahaja tiada container yang merujuk kepadanya.
Kes terakhir itu sering memerangkap pengguna semasa proses refactor. Anda membuang servis dan volumenya daripada fail, menjalankan down -v, dan volume tersebut kekal kerana fail itu tidak lagi menyebutnya. Jalankan down -v sebelum anda menyunting fail tersebut, bukan selepasnya.
Apabila anda benar-benar memerlukan --force-recreate
docker compose up -d tidak membina semula segala-galanya setiap kali. Compose menyimpan hash bagi konfigurasi setiap servis yang telah diselesaikan pada container sebagai label. Dalam Compose v5.7.0, container yang sedang berjalan tidak akan diusik apabila hash konfigurasi, ID imej dan digest volum imej sepadan, sambungan rangkaian serta mount volum bernama yang dijangkakan tersedia, dan tiada induk yang berkongsi namespace atau volum sedang dicipta semula. Anda mendapat Container voltest-db-1 Running dan bukannya Recreated. Ini adalah kelakuan yang anda inginkan hampir setiap masa, kerana ia menjadikan up -d selamat untuk dijalankan berulang kali.
Ini juga sebab mengapa sesetengah suntingan kelihatan tidak memberikan kesan. Compose melakukan hashing terhadap definisi servis yang telah diselesaikan, bukan kandungan fail yang dirujuk oleh definisi tersebut. Fail konfigurasi yang di-mount ke dalam container dan dibaca sekali semasa permulaan tidak akan mencetuskan penciptaan semula apabila anda menyuntingnya, kerana laluan mount tidak berubah. Servis terus berjalan dengan nilai yang dibaca semasa but.
docker compose up -d --force-recreatePerintah ini menghentikan dan membuang setiap container serta mencipta yang baharu daripada definisi yang sama. Gunakannya selepas menyunting fail konfigurasi yang di-mount, dan apabila container telah terpesong ke dalam keadaan yang tidak dapat anda jelaskan. Volum tidak disentuh, jadi pangkalan data akan kekal selamat selepas penciptaan semula secara paksa. Untuk mendapatkan imej yang lebih baharu pada tag yang sama, anda perlu melakukan pull juga.
docker compose pull
docker compose up -dpull mengambil ID imej yang baharu, dan up -d kemudian melihat ID imej yang berbeza daripada container yang sedang berjalan lalu mencipta semula container tersebut secara automatik. Menambah --force-recreate tanpa pull hanya memberikan anda container baharu daripada imej lama yang sama. Itulah sebabnya "Saya telah melakukan force recreate tetapi ia masih versi lama" merupakan aduan yang sangat biasa.
docker compose restart tidak melakukan semua ini. Ia memulakan semula container sedia ada tanpa menggunakan perubahan pada konfigurasinya, jadi pemboleh ubah persekitaran yang diubah atau pemetaan port yang diubah tidak akan diaplikasikan. Jika anda telah menyunting fail tersebut, gunakan up -d.
Model mental yang perlu diingati
Kontena boleh diganti. Kontena ialah satu proses berserta lapisan boleh tulis yang nipis, dan Compose boleh mencipta pengganti daripada fail dan imej tersebut. Volume tidak boleh diganti, kerana ia menyimpan satu-satunya salinan data yang tidak boleh dijana semula oleh mana-mana fail dalam repositori anda.
Setiap kata kerja Compose selari dengan pembahagian tersebut. stop dan start mengekalkan kontena. down dan up menggantikan kontena dan mengekalkan volume. down -v ialah satu-satunya arahan rutin yang memadamkan data, itulah sebabnya ia memerlukan flag yang eksplisit. Sebelum anda menaipnya pada mana-mana sistem sebenar, pastikan anda mempunyai sandaran yang telah anda pulihkan sekurang-kurangnya sekali.
Logik yang sama terpakai pada rahsia (secrets). Kata laluan yang ditetapkan melalui POSTGRES_PASSWORD hanya digunakan untuk menetapkan kata laluan pangkalan data apabila pangkalan data tersebut dimulakan buat kali pertama. Oleh itu, menukarnya dalam fail persekitaran anda dan menjalankan up -d tidak akan mengubah kata laluan yang telah disimpan. Kontena tersebut adalah baharu manakala volume adalah lama, dan volume lama masih menyimpan kata laluan yang lama. Bagaimana Compose menyelesaikan fail env dan rahsia menjelaskan lapisan mana yang diutamakan apabila pemboleh ubah yang sama ditetapkan dua kali.
Mod kegagalan dan rentetan yang akan anda lihat
no configuration file provided: not found bermaksud Compose tidak dapat mencari fail konfigurasi melalui carian direktori semasa dan direktori induknya, -f, atau COMPOSE_FILE. Berikan -f dengan laluan penuh.
Network voltest_default Resource is still in use pada down dalam Compose v5.7.0 bermaksud kontena masih terikat pada rangkaian projek, biasanya kontena di luar projek ini yang dimulakan secara manual dengan docker run --network. Alihkan kontena tersebut, kemudian jalankan down sekali lagi.
Found orphan containers (voltest-old-1) for this project muncul selepas anda menamakan semula atau memadamkan servis. Compose semasa menyenaraikan nama-nama tersebut secara terus dan dipisahkan dengan koma. Keluaran Compose v2 yang lebih lama mencetak amaran yang sama dengan nama di dalam kurungan segi empat sama, seperti dalam ([voltest-old-1]). Kontena lama masih membawa label projek tersebut. docker compose down --remove-orphans akan membersihkannya.
Error response from daemon: remove voltest_pgdata: volume is in use pada docker volume rm manual bermaksud terdapat kontena yang masih merujuk kepada volum tersebut, termasuk kontena yang telah dihentikan. Jalankan docker compose down dahulu, kemudian alihkan volum tersebut, atau gunakan sahaja down -v. Bagi projek yang lebih besar, timbunan Compose berbilang servis menunjukkan betapa banyak volum yang boleh terkumpul dalam satu projek.
FAQ
Adakah docker compose down memadamkan pangkalan data saya?
Tidak, jika pangkalan data tersebut berada dalam named volume atau bind mount. down membuang kontena dan rangkaian projek, namun volume kekal pada cakera dengan data yang utuh. docker compose up -d seterusnya akan menyambungkan kontena baharu kepada volume yang sama dan data tersebut akan tersedia. docker compose down -v membuang named volume bukan luaran yang diisytiharkan dalam bahagian volumes fail Compose yang tergolong dalam projek ini.
Apakah perbezaan antara stop dan down bagi kontena yang ingin saya gunakan semula?
stop mengekalkan kontena, jadi docker compose start mengembalikan anda kepada kontena yang sama dengan lapisan boleh tulis (writable layer) yang sama. Sebarang perkara yang anda pasang atau sunting di dalam kontena secara manual akan kekal ada. down memadamkan kontena, jadi up -d seterusnya akan membina kontena baharu daripada imej tersebut dan perubahan manual itu akan hilang. Semasa anda melakukan penyahpepijatan (debugging), gunakan stop.
Bagaimanakah cara untuk membuang segala-galanya yang dicipta oleh projek Compose?
docker compose down -v --rmi all --remove-orphans membuang kontena, rangkaian projek, named volume bukan luaran yang diisytiharkan dalam fail yang tergolong dalam projek ini, imej yang digunakan oleh servis, serta kontena yatim (orphan containers) bagi projek tersebut. Ia tidak menyentuh bind mount atau volume yang ditandakan sebagai external: true. Semak perkara yang bakal hilang dengan docker volume ls sebelum anda menjalankannya.
Mengapakah kontena saya mengabaikan perubahan yang saya buat pada fail konfigurasi yang dipasang (mounted)?
Compose menentukan sama ada untuk membina semula kontena dengan membandingkan hash definisi servis yang diselesaikan, dan hash tersebut tidak merangkumi kandungan fail yang dipasang. Laluan fail tidak berubah, jadi Compose membiarkan kontena berjalan dengan nilai yang dibacanya semasa permulaan. Jalankan docker compose up -d --force-recreate untuk membina kontena baharu yang membaca fail tersebut semula.
Mengapakah POSTGRES_PASSWORD baharu saya tidak berfungsi selepas saya menukarnya?
Imej Postgres hanya menggunakan POSTGRES_PASSWORD untuk menetapkan kata laluan pangkalan data apabila ia memulakan direktori data yang kosong. Volume anda sudah pun mengandungi kluster yang telah dimulakan, jadi pemboleh ubah tersebut diabaikan dan kata laluan lama masih terpakai. Menyambung dengan kata laluan baharu akan memberikan anda password authentication failed for user "postgres". Tukar kata laluan dengan ALTER USER di dalam pangkalan data yang sedang berjalan, atau terima hakikat kehilangan data dan mulakan semula dengan docker compose down -v.