వాల్యూమ్లు: కంటైనర్ డేటా నిజంగా ఎక్కడ ఉంటుంది
పేరున్న వాల్యూమ్ bind mount నుండి ఎలా భిన్నంగా ఉంటుంది, అది భౌతికంగా డిస్క్లో ఎక్కడ ఉంటుంది, మరియు కంటైనర్ను తిరిగి సృష్టించేటప్పుడు డేటాబేస్ ఎలా పోకుండా కాపాడాలి.
23 ఆగస్టు, 2026న నవీకరించబడింది
ఒక కంటైనర్ పునర్వినియోగించగలది. దానిలో రాసిన ప్రతిదీ దానితో పాటు అదృశ్యమవుతుంది. డేటా బయట ఉండాలి, మరియు సరిగ్గా రెండు మార్గాలు ఉన్నాయి: ఒక నేమ్డ్ వాల్యూమ్ మరియు హోస్ట్ డైరెక్టరీ బైండ్ మౌంట్.
రెండు మార్గాలు మరియు ఏది ఎప్పుడు ఉపయోగించాలి
services:
db:
image: postgres:17
volumes:
- db-data:/var/lib/postgresql/data # named volume
app:
image: nginx:1.27
volumes:
- ./site:/usr/share/nginx/html:ro # directory bind mount
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
db-data:
నేమ్డ్ వాల్యూమ్ను Docker స్వయంగా సృష్టించి, /var/lib/docker/volumes/<name>/_data లో నిల్వ చేస్తుంది. లోపల ఉన్న అనుమతులు ఇమేజ్ ద్వారా స్వయంచాలకంగా సెట్ చేయబడతాయి. డేటాబేస్లు మరియు అంతర్గత సేవ స్థితిని ఈ విధంగా ఉంచుతారు.
డైరెక్టరీ బైండ్ మౌంట్ అనేది మెషీన్ డిస్క్పై ఉన్న సాధారణ పాత్. కాన్ఫిగరేషన్ ఫైల్లు, వెబ్సైట్ స్టాటిక్ అసెట్లు మరియు సర్టిఫికెట్లను ఈ విధంగా అందిస్తారు: వాటిని ఎడిటర్లో సౌకర్యవంతంగా సవరించవచ్చు మరియు రిపాజిటరీలో నిల్వ చేయవచ్చు.
:ro ఫ్లాగ్ మౌంట్ను రీడ్-ఓన్లీగా చేస్తుంది. కంటైనర్కు రైట్ యాక్సెస్ అవసరం లేని ప్రతిచోటా దీన్ని ఉపయోగించండి — ఇది తక్కువ ఖర్చుతో కూడిన రక్షణ.
ప్రతిదీ భౌతికంగా ఎక్కడ నిల్వ ఉంటుంది
docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail
డిస్క్ స్పేస్ అయిపోయినప్పుడు మొదట రన్ చేయాల్సిన కమాండ్ చివరిది. మరిన్ని వివరాలు: disk space.
docker compose down -vమరియుdocker volume pruneవాల్యూమ్లను శాశ్వతంగా తొలగిస్తాయి. కంటైనర్ ఆపివేయబడి ఉన్నప్పుడు డేటాబేస్ ఉన్న వాల్యూమ్ “ఉపయోగించని”దిగా కనిపించి క్లీనప్ పరిధిలోకి వస్తుంది. శుభ్రం చేయడానికి ముందు జాబితాను చూడండి:docker volume ls -f dangling=true.
కాపీ చేయడం మరియు మైగ్రేషన్
పునర్వినియోగించగల కంటైనర్తో నేమ్డ్ వాల్యూమ్ను కాపీ చేయడం:
docker run --rm -v db-data:/from -v $(pwd):/to alpine \
tar czf /to/db-data.tar.gz -C /from .
పునరుద్ధరించడం:
docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
tar xzf /from/db-data.tar.gz -C /to
డేటాబేస్ల విషయంలో, ఈ పద్ధతి కంటైనర్ ఆపివేయబడినప్పుడు మాత్రమే సరిపోతుంది: నడుస్తున్న డేటాబేస్ యొక్క ఫైల్-స్థాయి కాపీ అస్థిరంగా ఉండవచ్చు. డేటాబేస్ స్వంత టూల్స్ — pg_dump, mysqldump — ఉపయోగించి డంప్ చేయడం మంచిది. సరిగ్గా ఏమి కాపీ చేయాలి చూడండి.
అనుమతులు
బైండ్ మౌంట్లతో అత్యంత సాధారణ తప్పు యజమాని అసమతుల్యత. కంటైనర్ లోపల, ప్రాసెస్ దాని స్వంత UID కింద నడుస్తుంది, మరియు హోస్ట్ root గా సృష్టించిన ఫైల్ దానికి అందుబాటులో ఉండదు.
docker compose exec app id
sudo chown -R 1000:1000 ./data
చాలా ఇమేజ్లు PUID/PGID వేరియబుల్స్ను అంగీకరిస్తాయి — ఇది డైరెక్టరీ యజమానిని మార్చడం కంటే సౌకర్యవంతం.
సాధారణ తప్పులు
- డేటా కంటైనర్ లోపల రాయబడింది. అప్డేట్ సమయంలో మీరు కంటైనర్ను తిరిగి సృష్టించారు — డేటా అదృశ్యమైంది. తనిఖీ చేయండి:
docker diff <container>దాని ఫైల్సిస్టమ్లో ఏమి మారిందో చూపుతుంది; అక్కడ పెద్ద రైట్లు హెచ్చరిక సంకేతం. - ఇమేజ్లోని ఖాళీ కాని పాత్పై మీరు డైరెక్టరీని బైండ్-మౌంట్ చేశారు. ఇమేజ్ యొక్క కంటెంట్ దాచబడుతుంది, మరియు సేవ దాని ఫైల్లను కనుగొనలేదు.
- బైండ్ మౌంట్లో సాపేక్ష పాత్. ఇది ప్రస్తుత దాని నుండి కాకుండా
compose.yamlఉన్న డైరెక్టరీ నుండి పరిష్కరించబడుతుంది. మరొక స్థానం నుండి రన్ చేస్తే కొత్త ఖాళీ డైరెక్టరీ సృష్టించబడుతుంది. - OS పునఃస్థాపన సమయంలో వాల్యూమ్లు మరచిపోయారు. పునఃస్థాపన డిస్క్ను పూర్తిగా తుడిచివేస్తుంది. కాపీ ఈ మెషీన్పై కాదు నిల్వ ఉండాలి.