2016-12-15 4 views
5

में MySQL डेटा को रोकना मैं डॉकर के लिए नया हूं। मैं सफलतापूर्वक निम्नलिखित Dockerfile के साथ एक डोकर छवि बनाया है:डॉकर

From alpine:3.4 
MAINTAINER SomeName - domain.tld 

# Timezone 
ENV TIMEZONE Asia/Kolkata 

# RUN sed -i 's#dl-cdn\.alpinelinux\.org#mirrors\.aliyun\.com#' /etc/apk/repositories 

# install mysql, apache and php and php extensions, tzdata, wget 
RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \ 
    apk add --update \ 
    mysql mysql-client \ 
    apache2 \ 
    curl wget \ 
    tzdata \ 
    php5-apache2 \ 
    php5-cli \ 
    php5-phar \ 
    php5-zlib \ 
    php5-zip \ 
    php5-bz2 \ 
    php5-ctype \ 
    php5-mysqli \ 
    php5-mysql \ 
    php5-pdo_mysql \ 
    php5-opcache \ 
    php5-pdo \ 
    php5-json \ 
    php5-curl \ 
    php5-gd \ 
    php5-gmp \ 
    php5-mcrypt \ 
    php5-openssl \ 
    php5-dom \ 
    php5-xml \ 
    php5-iconv \ 
    [email protected] 

RUN curl -sS https://getcomposer.org/installer | \ 
    php -- --install-dir=/usr/bin --filename=composer 

# configure timezone, mysql, apache 
RUN cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \ 
    echo "${TIMEZONE}" > /etc/timezone && \ 
    mkdir -p /run/mysqld && chown -R mysql:mysql /run/mysqld /var/lib/mysql && \ 
    mysql_install_db --user=mysql --verbose=1 --basedir=/usr --datadir=/var/lib/mysql --rpm > /dev/null && \ 
    mkdir -p /run/apache2 && chown -R apache:apache /run/apache2 && chown -R apache:apache /var/www/localhost/htdocs/ && \ 
    sed -i 's#AllowOverride none#AllowOverride All#' /etc/apache2/httpd.conf && \ 
    sed -i 's#ServerName www.example.com:80#\nServerName localhost:80#' /etc/apache2/httpd.conf && \ 
    sed -i '/skip-external-locking/a log_error = \/var\/lib\/mysql\/error.log' /etc/mysql/my.cnf && \ 
    sed -i '/skip-external-locking/a general_log = ON' /etc/mysql/my.cnf && \ 
    sed -i '/skip-external-locking/a general_log_file = \/var\/lib\/mysql\/query.log' /etc/mysql/my.cnf 

# Configure xdebug 
RUN echo "zend_extension=xdebug.so" > /etc/php5/conf.d/xdebug.ini && \ 
    echo -e "\n[XDEBUG]" >> /etc/php5/conf.d/xdebug.ini && \ 
    echo "xdebug.remote_enable=1" >> /etc/php5/conf.d/xdebug.ini && \ 
    echo "xdebug.remote_connect_back=1" >> /etc/php5/conf.d/xdebug.ini && \ 
    echo "xdebug.idekey=PHPSTORM" >> /etc/php5/conf.d/xdebug.ini && \ 
    echo "xdebug.remote_log=\"/tmp/xdebug.log\"" >> /etc/php5/conf.d/xdebug.ini 

#start apache 
RUN echo "#!/bin/sh" > /start.sh && \ 
    echo "httpd" >> /start.sh && \ 
    echo "nohup mysqld --skip-grant-tables --bind-address 0.0.0.0 --user mysql > /dev/null 2>&1 &" >> /start.sh && \ 
    echo "sleep 3 && mysql -uroot -e \"create database db;\"" >> /start.sh && \ 
    echo "tail -f /var/log/apache2/access.log" >> /start.sh && \ 
    chmod u+x /start.sh 

WORKDIR /var/www/localhost/htdocs/ 

EXPOSE 80 
EXPOSE 3306 

#VOLUME ["/var/www/localhost/htdocs","/var/lib/mysql","/etc/mysql/"] 
ENTRYPOINT ["/start.sh"] 

आदर्श रूप में मैं डोकर छवि अपाचे, PHP और MySQL शामिल करना चाहते हैं - एक छवि में सभी। मैं चाहता हूं कि छवि यथासंभव पोर्टेबल हो। इसलिए जब भी मुझे एक नई परियोजना शुरू करने की आवश्यकता होती है, तो मैं सिर्फ एक नया कंटेनर बना सकता हूं और वॉल्यूम माउंट कर सकता हूं और आगे बढ़ सकता हूं।

जब मैं एक नया कंटेनर शुरू करता हूं, तो मुझे सबकुछ अपेक्षित मिलता है। लेकिन mysql डेटा आरोहित नहीं किया जा सकता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि बढ़ते एक तरफ है (या यह है?) यदि मैं एक नया कंटेनर शुरू करते समय -v /project_dir/data:/var/lib/mysql जोड़ता हूं, तो MySQL चालू नहीं होता है क्योंकि project_dir/data खाली है। मेरे प्रश्न हैं:

  1. कैसे मेरी project_dir को /var/lib/mysql कंटेनर के अंदर से डेटा माउंट करने के लिए?
  2. मैं अलग-अलग कंटेनरों में अलग-अलग mysql पासवर्ड कैसे सेट कर सकता हूं?

संपादित करें: मैं अपने स्थानीय मात्रा (यानी project_dir/data) माउंट नहीं है और कंटेनर शुरू करते हैं, एक खोल tty मिलता है, मुझे लगता है कि /var/lib/mysql कई फ़ाइलें, जो मैं mysql चलाने के लिए की जरूरत है मान लेते हैं और है इसके प्रारंभिक डेटाबेस। लेकिन अगर मैं /var/lib/mysql (कंटेनर के अंदर) के अंदर अपना स्थानीय वॉल्यूम और ls माउंट करता हूं, तो यह खाली है। यही कारण है कि MySQL शुरू नहीं हो रहा है और मैं कंटेनर के बाहर से डेटा जारी नहीं रख सकता। मेरा सवाल है: मैं इसे कैसे चला सकता हूं और स्थानीय निर्देशिका से डेटा बना सकता हूं।

+2

छवि अपने स्थानीय पर्यावरण पर स्वतंत्र माना जाता है। निर्देशिका को चिह्नित करने के लिए आपको वॉल्यूम का उपयोग करना होगा जिसे बाहर से रखा जाएगा। और जब आप डॉकर में छवि चलाते हैं तो आप इसे '-v' पैरामीटर का उपयोग करके अपने स्थानीय वातावरण से कनेक्ट करते हैं। इस तरह यह कुबर्नेट्स पर भी काम करता है। – JosMac

+0

इस उपयोग के मामले के लिए डॉकर का उपयोग न करें। डॉकर एक एप्लीकेशन कंटेनर तकनीक है। आप एक ओएस कंटेनर/गोल्डन छवि बना रहे हैं। एक वीएम का प्रयोग करें या यदि आप ठंडा होने के लिए कंटेनर का उपयोग करने पर जोर देते हैं, तो ओएस कंटेनर (उदा। ओपनवीजेड) का उपयोग करें। आप अपने वर्तमान दृष्टिकोण के साथ कई समस्याओं में भाग लेंगे। – bartimar

उत्तर

4

समस्या:

यहाँ क्या हो रहा है कि आप एक खाली डेटाबेस जबकि डोकर छवि बनाया जा रहा है बनाने के है:

mysql_install_db --user=mysql --verbose=1 --basedir=/usr --datadir=/var/lib/mysql --rpm > /dev/null && \ 

लेकिन जब आप इस छवि से एक कंटेनर बनाने, आप /var/lib/mysql फ़ोल्डर पर वॉल्यूम माउंट करें। यह आपके होस्ट के फ़ोल्डर को बेनकाब करने के लिए आपके कंटेनर डेटा को छुपाता है। इस प्रकार, आप एक खाली फ़ोल्डर देख रहे हैं।

समाधान:

आप https://hub.docker.com/_/mysql/ पर एक नज़र डालें, तो आप कि इस समस्या डेटाबेस बनाने के द्वारा संबोधित किया जाता है जब कंटेनर वास्तव में, शुरू होता है जब नहीं छवि बनाई गई है देखेंगे। यह दोनों अपने सवालों के जवाब:

  1. आप अपने घुड़सवार मात्रा है, तो डेटाबेस init, बाद में निष्पादित किया जाएगा के साथ अपने कंटेनर शुरू करने और अपने डेटा वास्तव में अपने मेजबान के एफएस
  2. में लिखा जाएगा, तो आप उन पारित करने के लिए है एनवी वैरिएबल के रूप में जानकारी

दूसरे शब्दों में, सीधे अपनी छवि के बजाय ENTRYPOINT में एक स्क्रिप्ट के साथ अपने डीबी को डालें।

चेतावनी:

कुछ चेतावनी है, हालांकि। जिस तरह से आपने अपनी छवि की तरह वास्तव में सिफारिश नहीं की है, क्योंकि डॉकर का दर्शन "प्रति कंटेनर एक प्रक्रिया" है। कठिनाई तुम यहाँ है कि आप एक ही कंटेनर (अपाचे, MySQL, आदि) पर कई सेवाओं के शुरू करने के लिए होगा, ताकि आप अपने entrypoint, जो भ्रामक है में दोनों पर काम करने के लिए हो सकता है। साथ ही, एक सेवा विफल हो जाती है, आपका कंटेनर अभी भी ऊपर होगा, लेकिन उम्मीद के अनुसार काम नहीं कर रहा है।

मैं तो क्या आप इस प्रक्रिया के प्रति 1 छवि के रूप में में किया था विभाजित है, तो या तो उन्हें सभी कच्चे डोकर, या docker-compose तरह उपयोगकर्ता कुछ के साथ शुरू करने के लिए सुझाव है।

इसके अलावा, इससे आपको लाभ होगा कि आप डॉकर हब: https://hub.docker.com से पहले से ही मौजूदा और अत्यधिक कॉन्फ़िगर करने योग्य छवियों का उपयोग करने में सक्षम होंगे। आपके लिए कम नौकरी और कम त्रुटि प्रवण।

+0

धन्यवाद। इसमें काफी सार्थकता है। हालांकि, मैं डॉकर के लिए वास्तव में नया हूं। क्या आप 'ENTRYPOINT' में एक स्क्रिप्ट जोड़ने के बारे में कुछ और बता सकते हैं? डॉकरफाइल के अंदर इस्तेमाल किया गया 'एंटरपॉइंट' नहीं है? यदि हां, तो छवि को निर्मित होने पर स्क्रिप्ट को धुंधला करने और कंटेनर प्रारंभ होने पर स्क्रिप्ट को धुंधला करने के बीच क्या अंतर है? क्या डॉकरफाइल केवल छवि बनाने के लिए उपयोग नहीं किया जाता है? – abhisek

+0

https://github.com/docker-library/mysql/tree/10eb5eab8d3d793c49a701ed7a42e1e5d1c9bb59/8.0 पर एक नजर डालें। इस प्रकार MySQL छवि पूरी की जाती है। एक बार फिर, मैं आपको इसका उपयोग करने के लिए प्रोत्साहित करता हूं (हालांकि, आपको आवश्यक MySQL संस्करण चुनें)। अब अपने सवालों के जवाब देने के लिए: 'ENTRYPOINT' एक कमांड है जिसे कंटेनर शुरू होने पर निष्पादित किया जाना है। ऐसा करने के लिए, आपको इसे डॉकरफ़ाइल में परिभाषित करना होगा। तो हां, डॉकरफाइल का उपयोग छवि बनाने के लिए किया जाता है, लेकिन जब आप इसे कंटेनर बनाते हैं तो क्या करना है इसके बारे में निर्देश भी दिए गए हैं। उदाहरण के लिए, एक प्रक्रिया को कॉन्फ़िगर और प्रारंभ करें। –

-1

जब आपके पास डॉकर कंटेनर में डेटाबेस होता है, तो वॉल्यूम का उपयोग करने का एकमात्र तरीका है। शायद हमें यह कहना चाहिए कि "आपके कंटेनर के अंदर डेटाबेस" का मतलब है कि वॉल्यूम का उपयोग नहीं करना और मानक 10 जीबी में डेटा रखना (या डिफ़ॉल्ट आकार में बड़ा होना संशोधित किया गया है) और वॉल्यूम में डेटाबेस का मतलब है docker run -v myvolume...

डॉक्टर डॉक्स। docker.com/engine/tutorials/dockervolumes एक देखना चाहिए

मैं पूरी तरह से अलेक्जेंड्रे के उत्तर से सहमत हूं, लेकिन मुझे लगता है कि आपके डेटाबेस को अपने कंटेनर के अंदर भी किसी अन्य कारण से रखना गलत है। डिफ़ॉल्ट रूप से, किसी छवि का आकार (इसलिए जब आप इसे चलाते हैं तो कंटेनर) 10 जीबी है। यह कुछ निष्पादन योग्य, पुस्तकालयों और विन्यास फाइलों के लिए काफी आरामदायक होना चाहिए। आप इस डिफ़ॉल्ट को संशोधित कर सकते हैं, और अपनी छवि बनाते समय एक बड़ा मूल्य डाल सकते हैं। लेकिन जब आप इस नई सीमा को दबाते हैं तो क्या होता है? मान लीजिए कि आपको लगता है कि आपका डेटाबेस 100 जीबी होगा, और वास्तव में, आप योजनाबद्ध से अधिक डेटा डालते हैं, और अंततः आपको 5 या 20 गुना अधिक की आवश्यकता होती है? एक वॉल्यूम एक SAN पर हो सकती है और यदि आवश्यक हो तो विस्तारित हो सकती है।

+0

आपका क्या मतलब है: "अपना डेटाबेस अपने कंटेनर के अंदर रखें"? आप वॉल्यूम का उपयोग नहीं कर रहे हैं? –

+0

नहीं, मेरा मतलब है कि वॉल्यूम का उपयोग डेटाबेस – user2915097

+0

डेटाबेस को संग्रहीत करने का एकमात्र तरीका है, तो मेरा उत्तर पर्याप्त स्पष्ट नहीं हो सकता है, क्योंकि यह वही है जो मैं सलाह देता हूं :)। क्या आप देखते हैं कि मैं इसे कैसे सुधार सकता हूं? –