Docker Compose down dhidi ya stop: Tofauti ni ipi?
stop husimamisha na kuhifadhi kontena; down hufuta kontena na mtandao wa mradi. Hakuna inayofuta volume yenye jina bila kutumia --volumes.
Jibu fupi
docker compose stop husimamisha kontena na kuziacha kwenye diski. docker compose down huzisimamisha, kisha hufuta kontena hizo pamoja na mtandao ambao Compose iliunda kwa mradi huo. Hakuna amri kati ya hizo inayogusa volume yenye jina. Database yako itafutwa tu unapoongeza -v, kama ilivyo katika docker compose down -v, ambayo huondoa volume zenye majina zilizotangazwa katika sehemu ya volumes ya faili ya Compose.
Hiyo ndiyo tofauti yote kwa aya moja. Mwongozo uliosalia unaithibitisha kwa kutumia volume ya Postgres ambayo unaweza kufuatilia ikiendelea kuwepo baada ya down na kutoweka baada ya down -v, na unaeleza hali mbili ambazo unahitaji --force-recreate.
docker compose stop: kontena hubaki
stop hutuma SIGTERM kwa mchakato mkuu katika kila kontena, husubiri, kisha hutuma SIGKILL ikiwa mchakato bado unaendelea. Muda wa kusubiri kwa chaguo-msingi ni sekunde 10, na -t hubadilisha muda huo. Hakuna kinachofutwa. Kontena huhifadhi kitambulisho chake, tabaka lake linaloweza kuandikwa, uhifadhi wake wa IP, na kumbukumbu zake.
docker compose stop
docker compose ps -adocker compose ps peke yake huonyesha kontena zinazoendelea tu, kwa hiyo baada ya stop huonyesha jedwali tupu na watu hudhani kuwa kontena zimeondoka. ps -a hujumuisha kontena zilizosimamishwa, na hapo utaona Exited (0) karibu na kila huduma. Zirejeshe kwa docker compose start, ambayo hutumia tena kontena zilezile kabisa.
Kwa kuwa kontena bado zipo, chochote kilichoandikwa ndani yake nje ya volume bado kipo. Hii inajumuisha kifurushi ulichosakinisha kwa mkono kwa kutumia docker compose exec, pamoja na faili ya usanidi uliyohariri ndani ya kontena. Hii ndiyo sababu ya vitendo ya kupendelea stop wakati wa utatuzi: unaweza kuanzisha tena mfumo ukiwa katika hali ileile.
docker compose down: kontena na mitandao huondolewa
down husimamisha kontena, kisha huziondoa pamoja na mtandao chaguo-msingi ambao Compose iliunda kwa mradi. Nyaraka za Docker zinaieleza kama amri ya kusimamisha kontena na kuondoa kontena, mitandao, volumu na image zilizoundwa na up, lakini sehemu za volumu na image hutekelezwa tu unapozitaka kwa kutumia -v na --rmi.
docker compose down
docker compose ps -a
docker network lsBaada ya down, ps -a haichapishi chochote kuhusu mradi, na mtandao wa <project>_default haupo tena. Jina la mradi hutokana na jina la saraka, isipokuwa ukiweka name: katika faili ya Compose au upitishe -p. Kila mabadiliko uliyofanya ndani ya safu inayoweza kuandikwa ya kontena sasa hayawezi kurejeshwa. Kwa hiyo, chukulia down kuwa amri inayotupa kontena na kuhifadhi data uliyoweka katika volumu.
Ukiitekeleza katika saraka isiyo sahihi, utapata no configuration file provided: not found. Compose haijui ni mradi upi uliokusudia, kwa hiyo inakataa kutekeleza amri. Tumia docker compose -f /srv/myapp/compose.yaml down unapokuwa nje ya folda ya mradi.
Je, docker compose down hufuta volumes zangu?
Hapana. Volume yenye jina iliyotangazwa chini ya ufunguo wa kiwango cha juu volumes hudumu baada ya down, na pia hudumu baada ya container iliyounganishwa nayo. Hili ndilo jambo linaloleta hofu zaidi kuhusu amri hii, na jibu hili halibadiliki katika Compose v2.
Sanidi stack unayoweza kuifanyia majaribio. Weka maudhui haya katika compose.yaml ndani ya saraka tupu inayoitwa voltest.
services:
db:
image: postgres:16.4
restart: unless-stopped
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:Ianzishe kisha uandike rekodi utakayoitambua baadaye.
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');"Sasa futa container na ukague volume.
docker compose down
docker volume lsMatokeo bado yanaorodhesha voltest_pgdata. Container imeondolewa, lakini data haijaondolewa. Rudisha stack na usome rekodi.
docker compose up -d
sleep 10
docker compose exec -T db psql -U postgres -c "select * from marker;"Unapata rekodi moja iliyo na survived. Container mpya ni container tofauti yenye ID tofauti, iliyounganishwa na volume hiyo hiyo. Ikiwa unataka maelezo mapana zaidi, mwongozo wa misingi ya Compose unaeleza tofauti kati ya volumes zenye majina na bind mounts, pamoja na mahali kila moja huhifadhiwa kwenye host.
Kile ambacho down -v huharibu, hasa
-v (kwa namna ndefu --volumes) huondoa volumes zenye majina zilizotangazwa katika sehemu ya volumes ya faili ya Compose, pamoja na volumes zisizo na majina zilizounganishwa na containers. Iendeshe dhidi ya stack hiyo hiyo.
docker compose down -v
docker volume lsvoltest_pgdata haijaorodheshwa tena. Anzisha stack tena, kisha entrypoint ya Postgres hupata directory tupu ya data na kuanzisha cluster mpya. Log ya container inaeleza hivyo kwa maneno wazi.
The files belonging to this database system will be owned by user "postgres".
PostgreSQL init process complete; ready for start up.Kuona kizuizi hicho kwenye stack ambayo imekuwa ikiendesha kwa miezi kadhaa kunamaanisha kuwa volume iliondolewa. Jedwali lako la marker limepotea, na njia pekee ya kulirejesha ni kutumia nakala rudufu.
Baadhi ya storage haiondolewi kamwe na -v. Bind mount ni njia ya host, kwa hiyo Docker huiondoa tu kama mount, na faili zako hubaki zilipo. Volume iliyowekwa alama ya external: true imetangazwa kuwa ni ya kitu kilicho nje ya mradi huu, na Compose haiiondoi kamwe. Volume yenye jina ambayo uliifuta kutoka kwenye faili ya Compose kabla ya kuendesha down -v haitangazwi tena, kwa hiyo Compose haijui kwamba inapaswa kuiondoa na huiacha kama orphan kwa docker volume prune.
Kisa hicho cha mwisho huwakamata watu wakati wa kufanya refactor. Ondoa service na volume yake kwenye faili, endesha down -v, na volume itaendelea kuwepo kwa sababu faili haiitaji tena. Endesha down -v kabla ya kuhariri faili, si baada ya kuhariri.
Wakati unahitaji kwa kweli --force-recreate
docker compose up -d haijengi upya kila kitu kila wakati. Compose huhifadhi heshi ya usanidi uliotatuliwa wa kila service kwenye container kama lebo. Ikiwa heshi inalingana na kitambulisho cha image pia kinalingana, container huachwa bila kubadilishwa na unapata Container voltest-db-1 Running badala ya Recreated. Hii ndiyo tabia unayoihitaji karibu kila wakati, kwa sababu hufanya up -d iwe salama kuendesha tena mara kwa mara.
Hii pia ndiyo sababu baadhi ya mabadiliko huonekana kutofanya chochote. Compose huhesabu heshi ya ufafanuzi wa service uliotatuliwa, si yaliyomo kwenye faili ambazo ufafanuzi huo unaelekeza. Faili ya usanidi iliyowekwa kwenye container na kusomwa mara moja wakati wa kuanza haitasababisha container ijengwe upya unapoiihariri, kwa sababu njia ya mount haikubadilika. Service inaendelea kufanya kazi kwa thamani ilizosoma wakati wa kuanza.
docker compose up -d --force-recreateHusimamisha na kuondoa kila container, kisha huunda mpya kwa kutumia ufafanuzi uleule. Itumie baada ya kuhariri faili ya usanidi iliyowekwa kwenye container, na wakati container imeingia katika hali ambayo huwezi kuieleza. Volumes haziguswi, kwa hiyo database huendelea kuwepo baada ya force recreate. Ili kutumia image mpya zaidi yenye tag ileile, unahitaji pia pull.
docker compose pull
docker compose up -dpull hupakua kitambulisho kipya cha image, kisha up -d huona kuwa kitambulisho cha image ni tofauti na kile cha container inayoendesha na huijenga upya yenyewe. Kuongeza --force-recreate bila pull hukupa container mpya inayotumia image ileile ya zamani. Ndiyo maana malalamiko ya “Nilifanya force recreate lakini bado ni toleo la zamani” hutokea mara nyingi.
docker compose restart haifanyi chochote kati ya hayo. Huanzisha upya container zilizopo na haisomi tena faili ya Compose kabisa, kwa hiyo mabadiliko ya environment variable au mapping ya port hayatatumika. Ikiwa ulihariri faili, tumia up -d.
Mfano wa kiakili wa kuzingatia
Kontena zinaweza kubadilishwa. Kontena ni mchakato pamoja na tabaka jembamba linaloweza kuandikwa, na Compose inaweza kuunda kontena linalofanana kabisa kutoka kwenye faili hilo kwa takriban sekunde moja. Volumu haziwezi kubadilishwa, kwa sababu zina nakala pekee ya hali ambayo hakuna faili katika hazina yako inaweza kuunda upya.
Kila amri ya Compose inalingana na mgawanyo huo. stop na start huhifadhi kontena. down na up hubadilisha kontena na kuhifadhi volumu. down -v ndiyo amri pekee ya kawaida inayoondoa hali, ndiyo maana inahitaji flag iliyo wazi. Kabla ya kuiandika kwenye mfumo halisi, thibitisha kuwa una nakala rudufu ambayo umeirejesha angalau mara moja.
Mantiki hiyo hiyo inatumika kwa siri. Nenosiri lililowekwa kupitia POSTGRES_PASSWORD husomwa mara ya kwanza tu hifadhidata inapoanzishwa, kwa hiyo kulibadilisha katika faili yako ya mazingira na kuendesha up -d kunakupa password authentication failed for user "postgres". Kontena ni jipya na volumu ni ya zamani, na volumu ya zamani bado ina nenosiri la zamani. Jinsi Compose inavyotatua faili za mazingira na siri inaeleza ni tabaka gani hushinda wakati kigezo kilekile kinawekwa mara mbili.
Aina za kushindwa na ujumbe utakaoona
no configuration file provided: not found inamaanisha kuwa Compose inaendeshwa katika saraka ambayo haina compose.yaml wala docker-compose.yml. Pitisha -f pamoja na njia kamili.
network voltest_default has active endpoints kwenye down inamaanisha kuwa kontena lililo nje ya mradi huu limeunganishwa kwenye mtandao wa mradi, kwa kawaida kontena lililoanzishwa mwenyewe kwa docker run --network. Ondoa kontena hilo, kisha endesha down tena.
Found orphan containers ([voltest-old-1]) for this project huonekana baada ya kubadilisha jina au kufuta huduma. Kontena la zamani bado lina lebo ya mradi. docker compose down --remove-orphans huziondoa, na ni salama kuiendesha kwenye stack yenye afya.
Error response from daemon: remove voltest_pgdata: volume is in use kwenye docker volume rm ya mwongozo inamaanisha kuwa bado kuna kontena linalorejelea volume hiyo, hata kontena lililosimamishwa. Endesha docker compose down kwanza, kisha ondoa volume hiyo, au tumia down -v tu. Kwenye mradi mkubwa, stack ya Compose yenye huduma nyingi inaonyesha idadi ya volume ambazo mradi mmoja unaweza kukusanya.
FAQ
Je, docker compose down hufuta hifadhidata yangu?
La, ikiwa hifadhidata iko kwenye volume yenye jina au bind mount. down huondoa containers na mtandao wa mradi, huku volume ikibaki kwenye diski pamoja na data yake bila kubadilika. docker compose up -d inayofuata huunganisha container mpya kwenye volume hiyo hiyo, na data bado inapatikana. docker compose down -v pekee huondoa volumes zenye majina, na huondoa zile tu zilizotangazwa katika sehemu ya volumes ya faili ya Compose.
Kuna tofauti gani kati ya stop na down kwa container ninayotaka kuitumia tena?
stop huihifadhi container, kwa hiyo docker compose start hukurejesha kwenye container ileile yenye writable layer ileile. Kitu chochote ulichosakinisha au kuhariri mwenyewe ndani ya container bado kipo. down huifuta container, kwa hiyo up -d inayofuata huunda mpya kutoka kwenye image, na mabadiliko hayo ya mikono hupotea. Unapochunguza hitilafu, tumia stop.
Ninaondoaje kila kitu kilichoundwa na mradi wa Compose?
docker compose down -v --rmi all --remove-orphans huondoa containers, mtandao wa mradi, volumes zenye majina zilizotangazwa kwenye faili, images zilizotumiwa na services, pamoja na container yoyote ambayo bado ina label ya jina la mradi. Haiathiri bind mounts au volumes zilizo na alama ya external: true. Kagua utakachopoteza kwa docker volume ls kabla ya kuiendesha.
Kwa nini container yangu haizingatii mabadiliko niliyofanya kwenye faili ya usanidi iliyowekwa mount?
Compose huamua ikiwa itaunda container upya kwa kulinganisha hash ya service definition iliyotatuliwa. Hash hiyo haijumuishi maudhui ya faili iliyowekwa mount. Path haikubadilika, kwa hiyo Compose huacha container ikiendelea na thamani ilizosoma wakati wa kuanza. Tekeleza docker compose up -d --force-recreate ili kuunda container mpya itakayosoma faili hiyo tena.
Kwa nini POSTGRES_PASSWORD yangu mpya haifanyi kazi baada ya kuibadilisha?
Postgres image husoma POSTGRES_PASSWORD tu inapoanzisha data directory tupu. Volume yako tayari ina cluster iliyoanzishwa, kwa hiyo variable hiyo inapuuzwa na password ya zamani bado inatumika. Utaona password authentication failed for user "postgres". Badilisha password kwa kutumia ALTER USER ndani ya database inayoendelea, au ukubali kupoteza data na uanze upya kwa docker compose down -v.