SSD Nodes Learn RAM 8GB — $66/tahun
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-01

Docker Compose down vs stop: Apa Bezanya?

stop menghentikan bekas tetapi mengekalkannya, manakala down memadamkan bekas dan rangkaian projek. Volum bernama kekal kecuali anda menggunakan flag volumes.

Jawapan ringkas

docker compose stop menghentikan bekas dan meninggalkannya pada cakera. docker compose down menghentikan bekas, kemudian memadamkan bekas serta rangkaian yang dicipta oleh Compose untuk projek tersebut. Tiada satu pun arahan ini menyentuh volum bernama. Pangkalan data anda hanya terpadam apabila anda menambahkan -v, seperti dalam docker compose down -v, yang mengalih keluar volum bernama yang diisytiharkan dalam bahagian volumes fail Compose.

Itulah keseluruhan perbezaannya dalam satu perenggan. Selebihnya panduan ini membuktikannya dengan volum Postgres yang boleh anda pantau kekal selepas down dan hilang selepas down -v, serta menerangkan dua keadaan apabila anda memerlukan --force-recreate.

docker compose stop: bekas masih ada

stop menghantar SIGTERM kepada proses utama dalam setiap bekas, menunggu, kemudian menghantar SIGKILL jika proses itu masih berjalan. Tempoh menunggu lalai ialah 10 saat dan -t mengubah tempoh tersebut. Tiada apa-apa yang dipadamkan. Bekas itu mengekalkan ID, lapisan boleh tulis, tempahan IP dan lognya.

docker compose stop
docker compose ps -a

docker compose ps secara bersendirian hanya memaparkan bekas yang sedang berjalan. Oleh itu, selepas stop, perintah tersebut memaparkan jadual kosong dan menyebabkan pengguna menyangka bahawa bekas telah hilang. ps -a turut menyertakan bekas yang telah dihentikan. Di situ, anda akan melihat Exited (0) di sebelah setiap perkhidmatan. Mulakan semula bekas tersebut dengan docker compose start, yang menggunakan semula bekas yang sama.

Oleh sebab bekas tersebut masih wujud, segala kandungan yang ditulis di dalamnya di luar volume masih kekal. Ini termasuk pakej yang anda pasang secara manual dengan docker compose exec serta fail konfigurasi yang anda sunting di dalam bekas. Inilah sebab praktikal untuk memilih stop semasa penyahpepijatan: anda boleh memulakan semula bekas dalam keadaan yang sama.

docker compose down: kontena dan rangkaian dialih keluar

down menghentikan kontena, kemudian mengalih keluarnya bersama rangkaian lalai yang dicipta oleh Compose untuk projek tersebut. Dokumentasi Docker menerangkannya sebagai tindakan menghentikan kontena serta mengalih keluar kontena, rangkaian, volum dan imej yang dicipta oleh up. Namun, volum dan imej hanya dialih keluar apabila anda memintanya dengan -v dan --rmi.

docker compose down
docker compose ps -a
docker network ls

Selepas down, ps -a tidak memaparkan apa-apa untuk projek tersebut dan rangkaian <project>_default telah tiada. Nama projek berasal daripada nama direktori, melainkan anda menetapkan name: dalam fail Compose atau memberikan -p. Semua perubahan yang anda buat dalam lapisan boleh tulis kontena kini tidak dapat dipulihkan. Oleh itu, anggap down sebagai perintah yang membuang kontena tetapi mengekalkan data yang anda simpan dalam volum.

Jalankan perintah itu dalam direktori yang salah dan anda akan menerima no configuration file provided: not found. Compose tidak mengetahui projek yang anda maksudkan, lalu menolak perintah tersebut. 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 kekal selepas down selesai, dan juga kekal selepas bekas yang dilampirkan kepadanya dipadamkan. Ini ialah kebimbangan yang paling biasa tentang arahan tersebut, dan jawapannya kekal sama untuk Compose v2.

Sediakan tindanan yang boleh anda uji. Letakkan kandungan 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:

Mulakannya dan tulis satu baris yang boleh anda kenal pasti 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 padamkan bekas itu dan semak volume tersebut.

docker compose down
docker volume ls

Output masih menyenaraikan voltest_pgdata. Bekas itu telah dipadamkan, tetapi datanya masih ada. Mulakan semula tindanan tersebut dan baca baris itu.

docker compose up -d
sleep 10
docker compose exec -T db psql -U postgres -c "select * from marker;"

Anda mendapat satu baris yang mengandungi survived. Bekas baharu itu ialah bekas yang berbeza dengan ID yang berbeza, tetapi dilampirkan pada volume yang sama. Untuk gambaran yang lebih luas, panduan asas Compose menerangkan perbezaan antara volume bernama dengan bind mount serta lokasi sebenar setiap satunya pada hos.

Perkara yang dimusnahkan oleh down -v, tepatnya

-v (bentuk panjang --volumes) mengalih keluar volum bernama yang diisytiharkan dalam bahagian volumes fail Compose, serta volum tanpa nama yang dilampirkan pada kontena. Jalankan perintah ini terhadap tindanan yang sama.

docker compose down -v
docker volume ls

voltest_pgdata tidak lagi disenaraikan. Mulakan tindanan itu semula dan entrypoint Postgres mendapati direktori data kosong, lalu memulakan kluster baharu. Log kontena 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.

Jika blok tersebut muncul pada tindanan yang telah berjalan selama berbulan-bulan, ini bermakna volum itu telah dialih keluar. Jadual marker anda telah hilang dan satu-satunya cara untuk mendapatkannya semula ialah daripada sandaran.

Sesetengah storan tidak pernah dialih keluar oleh -v. Bind mount ialah laluan hos, jadi Docker hanya menyahlekapnya dan fail anda kekal di lokasi asal. Volum yang ditandakan external: true diisytiharkan sebagai milik sesuatu di luar projek ini, dan Compose tidak akan mengalih keluarnya. Volum bernama yang anda padamkan daripada fail Compose sebelum menjalankan down -v tidak lagi diisytiharkan, jadi Compose tidak tahu untuk mengalih keluarnya dan volum itu kekal sebagai anak yatim selama docker volume prune.

Kes terakhir ini sering menimbulkan masalah semasa pemfaktoran semula. Alih keluar perkhidmatan dan volumnya daripada fail, jalankan down -v, dan volum itu kekal kerana fail tersebut tidak lagi merujuk kepadanya. Jalankan down -v sebelum anda mengedit fail, bukan selepasnya.

Apabila anda benar-benar memerlukan --force-recreate

docker compose up -d tidak membina semula semuanya setiap kali. Compose menyimpan hash konfigurasi setiap service yang telah diselesaikan pada container sebagai label. Jika hash dan ID image sepadan, container dibiarkan dan anda menerima Container voltest-db-1 Running, bukannya Recreated. Biasanya, itulah tingkah laku yang anda perlukan kerana up -d selamat dijalankan berulang kali.

Hal ini juga menjelaskan sebab sesetengah pengeditan kelihatan tidak memberi kesan. Compose mengira hash definisi service yang telah diselesaikan, bukan kandungan fail yang dirujuk oleh definisi tersebut. Fail konfigurasi yang dipasang ke dalam container dan dibaca sekali semasa permulaan tidak akan mencetuskan penciptaan semula apabila anda mengeditnya kerana laluan mount tidak berubah. Service terus berjalan dengan nilai yang dibacanya semasa boot.

docker compose up -d --force-recreate

Perintah ini menghentikan dan mengalih keluar setiap container, kemudian mencipta container baharu daripada definisi yang sama. Gunakannya selepas mengedit fail konfigurasi yang dipasang, dan apabila container telah berubah kepada keadaan yang tidak dapat anda jelaskan. Volume tidak terjejas, jadi pangkalan data kekal selepas penciptaan semula secara paksa. Untuk mengambil image yang lebih baharu pada tag yang sama, anda juga perlu melakukan pull.

docker compose pull
docker compose up -d

pull mendapatkan ID image baharu, kemudian up -d mendapati bahawa ID image tersebut berbeza daripada ID container yang sedang berjalan dan mencipta semula container itu secara automatik. Menambah --force-recreate tanpa pull menghasilkan container baharu daripada image lama yang sama. Oleh itu, aduan “Saya mencipta semula secara paksa tetapi versinya masih lama” sering berlaku.

docker compose restart tidak melakukan semua ini. Perintah ini memulakan semula container sedia ada dan tidak membaca semula fail Compose langsung. Oleh itu, pemboleh ubah persekitaran atau pemetaan port yang diubah tidak akan digunakan. Jika anda mengedit fail tersebut, gunakan up -d.

Model mental yang perlu diingati

Container boleh digantikan. Container ialah proses bersama lapisan boleh tulis yang nipis, dan Compose boleh membina container yang serupa daripadanya berdasarkan fail tersebut dalam kira-kira satu saat. Volume tidak boleh digantikan kerana volume menyimpan satu-satunya salinan keadaan yang tidak boleh dijana semula oleh mana-mana fail dalam repositori anda.

Setiap kata kerja Compose sepadan dengan pembahagian tersebut. stop dan start mengekalkan container. down dan up menggantikan container serta mengekalkan volume. down -v ialah satu-satunya arahan rutin yang mengalih keluar keadaan. Oleh itu, arahan ini memerlukan flag yang dinyatakan dengan jelas. Sebelum anda menaipnya pada sistem sebenar, pastikan anda mempunyai sandaran yang telah dipulihkan sekurang-kurangnya sekali.

Logik yang sama terpakai pada rahsia. Kata laluan yang ditetapkan melalui POSTGRES_PASSWORD hanya dibaca apabila pangkalan data dimulakan buat kali pertama. Oleh itu, menukarnya dalam fail persekitaran dan menjalankan up -d menghasilkan password authentication failed for user "postgres". Container itu baharu, tetapi volume itu lama. Volume lama tersebut masih menyimpan kata laluan lama. Cara Compose menyelesaikan fail env dan rahsia menerangkan lapisan yang digunakan apabila pemboleh ubah yang sama ditetapkan dua kali.

Kegagalan dan rentetan yang akan dipaparkan

no configuration file provided: not found bermaksud Compose sedang berjalan dalam direktori yang tidak mempunyai compose.yaml dan docker-compose.yml. Luluskan -f dengan laluan penuh.

network voltest_default has active endpoints pada down bermaksud bekas di luar projek ini disambungkan ke rangkaian projek. Biasanya, bekas itu dimulakan secara manual dengan docker run --network. Alih keluar bekas tersebut, kemudian jalankan down sekali lagi.

Found orphan containers ([voltest-old-1]) for this project dipaparkan selepas anda menamakan semula atau memadamkan perkhidmatan. Bekas lama masih mempunyai label projek. docker compose down --remove-orphans mengosongkan bekas tersebut dan selamat dijalankan pada tindanan yang sihat.

Error response from daemon: remove voltest_pgdata: volume is in use pada docker volume rm manual bermaksud terdapat bekas yang masih merujuk kepada volum tersebut, termasuk bekas yang dihentikan. Jalankan docker compose down dahulu, kemudian alih keluar volum itu, atau gunakan down -v sahaja. Dalam projek yang lebih besar, tindanan Compose berbilang perkhidmatan menunjukkan jumlah volum yang boleh terkumpul bagi satu projek.

FAQ

Adakah docker compose down memadamkan pangkalan data saya?

Tidak jika pangkalan data berada dalam volum bernama atau lekap ikatan. down mengalih keluar bekas dan rangkaian projek, manakala volum kekal pada cakera bersama datanya. docker compose up -d seterusnya melampirkan bekas baharu pada volum yang sama dan data tersedia di situ. Hanya docker compose down -v mengalih keluar volum bernama, dan hanya volum yang diisytiharkan dalam bahagian volumes fail Compose.

Apakah perbezaan antara stop dengan down bagi bekas yang ingin saya gunakan semula?

stop mengekalkan bekas, jadi docker compose start mengembalikan anda kepada bekas yang sama dengan lapisan boleh tulis yang sama. Apa-apa sahaja yang anda pasang atau edit secara manual dalam bekas masih tersedia. down memadamkan bekas, jadi up -d seterusnya membina bekas baharu daripada imej dan perubahan manual tersebut hilang. Semasa menyahpepijat, gunakan stop.

Bagaimanakah cara mengalih keluar semua yang dicipta oleh projek Compose?

docker compose down -v --rmi all --remove-orphans mengalih keluar bekas, rangkaian projek, volum bernama yang diisytiharkan dalam fail, imej yang digunakan oleh perkhidmatan dan mana-mana bekas yang masih dilabelkan dengan nama projek. Perintah ini tidak menyentuh lekap ikatan atau volum yang ditandakan sebagai external: true. Semak perkara yang bakal hilang dengan docker volume ls sebelum menjalankannya.

Mengapakah bekas saya mengabaikan perubahan yang saya buat pada fail konfigurasi yang dilekapkan?

Compose menentukan sama ada bekas perlu dicipta semula dengan membandingkan cincangan definisi perkhidmatan yang telah diselesaikan. Cincangan itu tidak termasuk kandungan fail yang dilekapkan. Laluan tersebut tidak berubah, jadi Compose membiarkan bekas berjalan dengan nilai yang dibacanya semasa dimulakan. Jalankan docker compose up -d --force-recreate untuk membina bekas baharu yang membaca fail itu sekali lagi.

Mengapakah POSTGRES_PASSWORD baharu saya tidak berfungsi selepas saya mengubahnya?

Imej Postgres hanya membaca POSTGRES_PASSWORD apabila memulakan direktori data yang kosong. Volum anda sudah mengandungi kluster yang telah dimulakan, jadi pemboleh ubah itu diabaikan dan kata laluan lama masih digunakan. Anda akan melihat password authentication failed for user "postgres". Tukar kata laluan dengan ALTER USER dalam pangkalan data yang sedang berjalan, atau terima kehilangan data dan mulakan semula dengan docker compose down -v.