2016-08-05 19 views
11

मैं डॉकर के लिए नया हूं और डॉकर कंपोज़ का उपयोग करके एक प्रोजेक्ट विकसित करना चाहता हूं। प्रलेखन से मैंने सीखा है कि डेटा को लगातार रखने के लिए मुझे डेटा केवल कंटेनर का उपयोग करना चाहिए, लेकिन मैं डॉकर-कंपोज़ का उपयोग करके ऐसा करने में असमर्थ हूं। जब भी मैं docker-compose down करता हूं तो यह डेटा को डीबी से हटा देता है लेकिन docker-compose stop करके डेटा हटाया नहीं जाता है। ऐसा इसलिए हो सकता है क्योंकि मैं नामित डेटा वॉल्यूम नहीं बना रहा हूं और docker-compose down सभी कंटेनरों को शायद ही हटा देता है। इसलिए मैंने कंटेनर नामकरण करने की कोशिश की लेकिन उसने मुझे त्रुटियों को फेंक दिया। कृपया मेरे yml फ़ाइल पर एक नजर है:डॉकर लिखें - डेटाबेस डेटा कैसे स्टोर करें?

version: '2' 
services: 
    data_container: 
    build: ./data 
    #volumes: 
    # - dataVolume:/data 
    db: 
    build: ./db 
    ports: 
     - "5445:5432" 
    environment: 
     - POSTGRES_USER=postgres 
     - POSTGRES_DB=postgres 
    # - PGDATA=/var/lib/postgresql/data/pgdata 
    volumes_from: 
    # - container:db_bus 
     - data_container 
    geoserver: 
    build: ./geoserver 
    depends_on: 
     - db 
    ports: 
     - "8004:8080" 
    volumes: 
     - ./geoserver/data:/opt/geoserverdata_dir 

    web: 
    build: ./web 
    volumes: 
     - ./web:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
    command: python manage.py runserver 0.0.0.0:8000 

    nginx: 
    build: ./nginx 
    ports: 
     - "83:80" 
    depends_on: 
     - web 

डोकर data_container के लिए फ़ाइल है:

FROM stackbrew/busybox:latest 
MAINTAINER Tom Offermann <[email protected]> 

# Create data directory 
RUN mkdir /data 

# Create /data volume 
VOLUME /data 

मैं इस कोशिश की, लेकिन ऐसा करके डोकर-रचना नीचे, डेटा खो दिया है।

ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section. 

तो अभी मैं क्या कर रहा हूँ है मैं योग्य स्वतंत्र डेटा केवल कंटेनर नाम बनाया और डाल कि volumes_from मूल्य में: मैं data_container नामकरण के रूप में आप टिप्पणी की लाइन देख सकते हैं की कोशिश की, यह मुझे इस त्रुटि फेंक दिया डीबी के। यह ठीक काम करता है और docker-compose down करने के बाद भी कोई डेटा नहीं हटाता है।

मेरे प्रश्नों:

  • सबसे अच्छा तरीका कंटेनरों कि docker-compose और उन्हें ठीक से उपयोग करने का उपयोग कर डेटाबेस के डेटा स्टोर कर सकते हैं बनाने के लिए क्या है?

  • मेरा सचेतक मेरे द्वारा चुने गए दृष्टिकोण पर मुझसे सहमत नहीं है, एक स्टैंड स्टैंड अकेले डेटा कंटेनर बनाकर। कोई विचार?

+1

वहाँ एक कारण है कि आप 'संस्करणों की तरह, अपने डेटा के लिए नामित किया गया मात्रा का उपयोग नहीं करना चाहते है:

आप डोकर-लिखें फ़ाइल संदर्भ यहाँ के साथ और अधिक जानकारी हो सकती है mydata:/var/lib/postgresql/data/pgdata' जो डाटा कंटेनर वॉल्यूम्स पर पसंदीदा तरीका है। – ldg

+0

मैंने ऐसा करने की कोशिश की है और यह मुझे त्रुटि फेंकता है: 'त्रुटि: नामित वॉल्यूम "डेटा वॉल्यूम:/डेटा: आरडब्ल्यू" सेवा "डेटा_कॉन्टेनर" में प्रयोग किया जाता है लेकिन खंड खंड में कोई घोषणा नहीं मिली।' मैं डेटा पोर्टेबिलिटी के बारे में भी उत्सुक हूं इस दृष्टिकोण का उपयोग कर। –

उत्तर

11

docker-compose down

निम्नलिखित

Stops containers and removes containers, networks, volumes, and images created by up

तो आपके द्वारा अपेक्षित व्यवहार है का सामना कर रहे है।

डॉकर-कंपोज़ फ़ाइल के साथ बनाए गए कंटेनर को बंद करने के लिए docker-compose stop का उपयोग करें, लेकिन उनके वॉल्यूम को न हटाएं।

दूसरी बात आपको डॉकर कंपोज़ के संस्करण 2 में data-container पैटर्न की आवश्यकता नहीं है। ताकि हटाने और बस का उपयोग

db: 
    ... 
    volumes: 
     - /var/lib/postgresql/data 
+0

मैं इस दृष्टिकोण का उपयोग कर डेटा बैकअप कैसे कर सकता हूं या पोर्टेबल बना सकता हूं? –

+1

यह पहले से ही वॉल्यूम में डॉकर होस्ट पर है। आपको उस वॉल्यूम को उस उपकरण से एक्सेस करने की आवश्यकता है जो डेटा को डंप कर सकता है। जैसे '' डॉकर-रचना निष्पादित POSTGRES_CONTAINER pg_dump | bzip2> पथ/चालू/मेजबान/mydb-dump-'date "+% वाई% एम% डी% एच% एम% एस" '.sql.bz2''' –

+0

इससे बहुत मदद मिली। एक त्रुटि है जब मैंने डेटा का बैक अप लेने का प्रयास किया है: 'pg_dump: [archiver (db)] डेटाबेस" रूट "से कनेक्शन विफल: विफल: भूमिका" रूट "मौजूद नहीं है क्या आप इससे मेरी सहायता कर सकते हैं ? –

5

डोकर-रचना नीचे कंटेनर बंद हो जाता है, लेकिन यह भी उन्हें निकालता है (सब कुछ के साथ: नेटवर्क, ...)।

डॉकर-कंपोज़ स्टॉप का उपयोग करें।

मुझे लगता है कि सबसे अच्छा तरीका कंटेनरों कि डोकर-लिखें सुविधा के साथ डेटाबेस के डेटा स्टोर कर सकते हैं बनाने के लिए नामित की मात्रा का उपयोग करना है:

version: '2' 
services: 

    db: #https://hub.docker.com/_/mysql/ 
    image: mysql 
    volumes: 
     - "wp-db:/var/lib/mysql:rw" 
    env_file: 
     - "./conf/db/mysql.env" 

volumes: 
    wp-db: {} 

यहाँ, यह "WP-db" नामक एक नामित मात्रा पैदा करेगा (यदि यह अस्तित्व में नहीं है) और इसे/var/lib/mysql में माउंट करें (रीड-राइट मोड में, डिफ़ॉल्ट)। यह वह जगह है जहां डेटाबेस अपना डेटा संग्रहीत करता है (mysql छवि के लिए)।

यदि नामित वॉल्यूम पहले से मौजूद है, तो इसका उपयोग किए बिना इसका उपयोग किया जाएगा।

प्रारंभ करते समय, mysql छवि को देखने के लिए/var/lib/mysql (आपकी मात्रा) में डेटाबेस हैं या नहीं।/डेटा/- : https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

संबंधित मुद्दे