डॉकटर छवि संस्थापन निर्देशिका कैसे बदलें?


183

/var/lib/dockerजैसा कि मैं बता सकता हूं, जैसे ही वे खींचे जाते हैं , डॉक चित्र स्थापित होते हैं। क्या इस स्थान को बदलने का कोई तरीका है, जैसे माउंटेड वॉल्यूम जैसे /mnt?


3
आपका ऑपरेटिंग सिस्टम किस पर चल रहा है?
थॉमसलेविल

जवाबों:


135

डॉकर के हालिया संस्करणों के साथ, आप data-rootपैरामीटर का मान अपने कस्टम पथ में, /etc/docker/daemon.json ( https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration/file के अनुसार ) सेट करेंगे।

पुराने संस्करणों के साथ, आप -gडॉकर डेमन शुरू करते समय विकल्प का उपयोग करके डॉकर्स के स्टोरेज बेस डायरेक्टरी (जहां कंटेनर और इमेजेज जाते हैं) को बदल सकते हैं । (check docker --help) करें। आपके पास यह सेटिंग स्वचालित रूप से लागू हो सकती है जब डॉकर इसे / etc / default / docker में जोड़कर शुरू होता है


4
मुझे लगता है कि सबसे अच्छा उपाय यह है -gकि उपस्टार्ट फ़ाइल को संशोधित करने के बजाय / etc / defaults / docker में इस विकल्प को जोड़ें , इसका उत्तर देखें।
mbarthelemy

9
हां, इस लाइन को बदल देंDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy

6
फेडोरा में काम नहीं करता है। यदि आपका डिस्ट्रो फेडोरा है तो मेरा जवाब देखिए
Vitor

3
अगर आपको डॉकटर आपकी फ़ाइल को अनदेखा करता है, तो आपको इस समाधान को डेबियन या उबंटू के कुछ संस्करणों में बग पर लागू करने की आवश्यकता हो सकती है /etc/default/docker
nedim

4
graphDaemon.json में विशेषता v17.05.0 के रूप में हटा दिया गया है, का उपयोग data-rootकरने के बजाय, cf stackoverflow.com/a/50217666/743507
dschulten

141

टिप्पणियों से सलाह के बाद मैं इस उत्तर को बेहतर बनाने के लिए डॉकर सिस्टमड प्रलेखन का उपयोग करता हूं । नीचे की प्रक्रिया में रिबूट की आवश्यकता नहीं होती है और यह बहुत अधिक साफ होता है।

पहले कस्टम कॉन्फ़िगरेशन के लिए निर्देशिका और फ़ाइल बनाएँ:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

17.06-CE पेस्ट से पहले डॉक वर्जन के लिए :

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

17.06-CE पेस्ट के बाद docker के लिए :

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

के माध्यम से वैकल्पिक विधि daemon.json

मैंने हाल ही में फेडोरा 25 पर 17.09-सीई के साथ उपरोक्त प्रक्रिया की कोशिश की और यह काम नहीं करता है। /etc/docker/daemon.jsonचाल में उस सरल संशोधन के बजाय :

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

विधि के बावजूद आपको कॉन्फ़िगरेशन को फिर से लोड करना होगा और डॉकर को पुनरारंभ करना होगा:

sudo systemctl daemon-reload
sudo systemctl restart docker

यह पुष्टि करने के लिए कि डॉकर को फिर से जोड़ा गया था:

docker info|grep "loop file"

हाल के संस्करण (17.03) में अलग-अलग कमांड की आवश्यकता है:

docker info|grep "Docker Root Dir"

आउटपुट इस तरह दिखना चाहिए:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

या:

 Docker Root Dir: /mnt

तब आप पुराने डॉकरों के भंडारण को सुरक्षित रूप से हटा सकते हैं:

rm -rf /var/lib/docker

8
यह केवल एक विधि है जिसने मुझे Ubuntu 16.04 पर मदद की!
वादिम

1
यह लिंक docs.docker.com/engine/admin/systemd बताता है कि डॉक को सिस्टेम के साथ कैसे कॉन्फ़िगर किया जाए, जो नए लिनक्स वितरण जैसे कि Ubuntu 16.04 के लिए काम करता है।
जोसेफ हुई

6
docker infoबयान शायद पुरानी है। Ubuntu 16.04 पर, पुन: कॉन्फ़िगर किए गए के लिए चेक है sudo docker info | grep "Docker Root Dir"। अन्यथा, अच्छा जवाब, स्वीकार किया जाना चाहिए;)
गुइल्यूम पेरोट

5
लिनक्स के नए संस्करण (4.10) और डॉकर (docker-CE 17.06) में लाइन को इस प्रकार बदलना होगा: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
लॉरेनज़ो-बेटिनी

2
यदि आप देखते हैं Docker Root Dir: /"/mnt"जब आप चलाता है docker info|grep "Docker Root Dir", तो आप को बदलने के लिए --data-root="/mnt"में --data-root=/mntफाइल के अंदरdocker-storage.conf
सेर

62

नई डोकर संस्करणों हम उपयोग करने की आवश्यकता है के लिए data-rootके रूप में graph: v17.05.0 में पदावनत किया गया है आधिकारिक पदावनत डॉक्स

संपादित करें /etc/docker/daemon.json(यदि यह मौजूद नहीं है, तो इसे बनाएं) और शामिल करें:

{
  "data-root": "/new/path/to/docker-data"
}

इसके बाद डॉकर को पुनः आरंभ करें:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • डेटा-रूट के साथ डॉकर स्टोरेज का उपयोग करके एक अधिक विस्तृत चरण-दर-चरण स्पष्टीकरण (मूविंग डेटा सहित) इसमें पाया जा सकता है: ब्लॉग पोस्ट
  • विंडोज के मामले में एक समान पोस्ट विंडोज विशिष्ट है

आपकी टिप्पणी ने मुझे यह पृष्ठ खोजने में मदद की: adriel.co.nz/blog/2018/01/25/… धन्यवाद!
नासाटोम

8
मुझे लगता है कि इस उत्तर को "स्वीकृत" ध्वज देने का समय है, क्योंकि यह वर्तमान संस्करण में काम कर रहा है।
द बंड्र

मैं यहां लोगों को यह बताने के लिए टिप्पणी करता हूं कि github.com/docker/docker.github.io/pull/5978 रिलीज होने के बाद कौन सा संस्करण इसका उपयोग कर सकता है , यह ऑफिशियल वेबसाइट को बदल देता है।
१ong

इसने मेरे लिए भी काम किया, थैंक
यू

39

चूंकि मुझे फेडोरा (EDIT) में ऐसा करने के लिए सही निर्देश नहीं मिला है: लोगों ने टिप्पणियों में बताया कि यह CentOS और Suse पर भी काम करना चाहिए) (/ etc / default / docker का उपयोग वहाँ नहीं किया जाता है), मैं अपना जोड़ रहा हूँ यहाँ उत्तर दें:

आपको / etc / sysconfig / docker को संपादित करना होगा , और विकल्प चर में -g विकल्प जोड़ना होगा। यदि एक से अधिक विकल्प हैं, तो सुनिश्चित करें कि आप उन्हें "" में संलग्न करेंगे। मेरे मामले में, वह फ़ाइल समाहित थी:

OPTIONS=--selinux-enabled

तो यह बन जाएगा

OPTIONS="--selinux-enabled -g /mnt"

पुनरारंभ ( systemctl restart docker) के बाद , डॉकर को नई निर्देशिका का उपयोग करना चाहिए


CentOS 6.5 / 6.6 और शायद 7 पर, आप उसी / etc / sysconfig / docker फ़ाइल का उपयोग करते हैं, लेकिन आप चर नाम other_args के तर्क जोड़ते हैं।
dlaidlaw

विकल्प को अब DOCKER_OPTS कहा जाता है (docker संस्करण 1.7.0)।
nedim

6
Docker के संस्करण 1.8 से आगे, Docker कॉन्फ़िगरेशन फ़ाइलों का उपयोग करके / etc / sysconfig को हटा दिया जाता है। इसके बजाय, आपको etc / systemd / system / docker.service.d में systemd ड्रॉप-इन कॉन्फ़िगरेशन फ़ाइलों का उपयोग करना चाहिए। Docker सेवा के चलने के दौरान ड्रॉप-इन फ़ाइल को जोड़ने या संशोधित करने के बाद, systemd को सेवा के लिए कॉन्फ़िगरेशन को फिर से लोड करने के लिए कहने के लिए कमांड systemctl डेमन-रीलोड चलाएँ। docs.oracle.com/cd/E52668_01/E54669/html/…
पाब्लो मारिन-गार्सिया

और ड्रॉप-इन फ़ाइलों का उपयोग करें docs.docker.com/engine/articles/systemd/…
पाब्लो मारिन-गार्सिया

23

डॉक फ़ोल्डर को / mnt (उदाहरण के लिए) ले जाने के लिए एक प्रतीकात्मक लिंक का उपयोग न करें। यह docker rm कमांड से परेशानी का कारण बन सकता है ।

डॉकटर के लिए -g विकल्प का बेहतर उपयोग करें। उबंटू पर आप इसे स्थायी रूप से /etc/default/docker.io में सेट कर सकते हैं। DOCKER_OPTS लाइन को बढ़ाएँ या बदलें।

यहाँ एक उदाहरण: `DOCKER_OPTS =" - g / mnt / कहीं / / / docker / "


मेरे मामले में मुझे पुनः आरंभ करना पड़ा
psychok7

1
docker rmसीलिंक का उपयोग करते समय मुझे किस तरह की परेशानी की उम्मीद है ?
16

1
मुझे यह भी करना था Ubuntu 16.04 stackoverflow.com/a/30219552/977622 इसे काम पर लाने के लिए
मनोवैज्ञानिक

21

ऐसा करने का बहुत आसान तरीका:

कर्ता सेवा बंद करो

sudo systemctl stop docker

मौजूदा डॉक निर्देशिका को नए स्थान पर ले जाएं

sudo mv /var/lib/docker/ /path/to/new/docker/

प्रतीकात्मक लिंक बनाएँ

sudo ln -s /path/to/new/docker/ /var/lib/docker

Docker सेवा प्रारंभ करें

sudo systemctl start docker

2
यह IMO सही और सबसे सरल समाधान है - मेरे लिए काम किया।
मार्टिन ड्वोरक

2
मेरे लिए एक आकर्षण की तरह काम किया है लेकिन प्रतीकात्मक लिंक कमांड के लिए अनुगामी स्लैश के बिना:sudo ln -s /path/to/new/docker/ /var/lib/docker
डैमियो

यह वही है जो डोकर फ़ोरम सुझाता है: फ़ोरम .ocker.com
t

यह एक भयानक समाधान है जिसने मेरी जान बचाई। :)
निकेत सुधाकरन

मैंने ऊपर निष्पादित किया है और डॉकटर ऊपर और चल रहा था। लेकिन मैं अपने docker के चित्र पहले से मौजूद नहीं पा सकता हूँ। कोई सुझाव?
थिलिना विराज

13

यह समाधान Red Hat 7.2 और Docker 1.12.0 पर काम करता है

अपने पाठ संपादक में फ़ाइल /lib/systemd/system/docker.service संपादित करें ।

add -g / path / to / docker / ExecStart निर्देश के अंत में । पूरी लाइन इस तरह दिखनी चाहिए।

ExecStart=/usr/bin/dockerd -g /path/to/docker/

नीचे दिए गए आदेश को निष्पादित करें

systemctl daemon-reload
systemctl restart docker

Docker निर्देशिका की जाँच करने के लिए कमांड निष्पादित करें

docker info | grep "loop file\|Dir"

यदि आपके पास Red Hat में डू / फाइल / sysconfig / docker फाइल है या 1.7.1 इस उत्तर को जांचें ।


मेरा मामला: सेंटोस 7, नवीनतम डॉकटर; मुझे "docker.service" फ़ाइल को खोजने के लिए "systemctl स्टेटस डॉकटर" को कॉल करना था और उत्तर में "-g" विकल्प जोड़ा। धन्यवाद
datdinhquoc

13

विजेता उत्तर की कॉपी-और-पेस्ट संस्करण :)

केवल इस सामग्री के साथ यह फ़ाइल बनाएं:

$ सुडो vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

डॉकटर Ubuntu 16.04.2 LTSमें परीक्षण किया गया1.12.6


1
graphDaemon.json में विशेषता v17.05.0 के रूप में हटा दिया गया है, का उपयोग data-rootकरने के बजाय, cf stackoverflow.com/a/50217666/743507
dschulten

12

सेंटोस 6.5 में

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

निम्नलिखित पंक्ति जोड़ें

other_args=" -g /data/docker -p /var/run/docker.pid"

फिर फ़ाइल को सहेजें और फिर से डॉक करें

service docker start

और में रिपॉजिटरी फ़ाइल बना देगा /data/docker


6

डेबियन / उबंटू या फेडोरा के लिए, आप शायद अन्य उत्तरों का उपयोग कर सकते हैं। लेकिन अगर आपके पास /etc/default/dockerया उसके नीचे फाइलें नहीं हैं /etc/sysconfig/docker, और आपका सिस्टम सिस्टमड चल रहा है, तो आप h3nrik द्वारा इस उत्तर का पालन करना चाह सकते हैं । मैं आर्क का उपयोग कर रहा हूं, और यह मेरे लिए काम करता है।

मूल रूप से, आपको नए डॉकटर छवि स्थान को पर्यावरण चर के रूप में पढ़ने के लिए सिस्टमड को कॉन्फ़िगर करने की आवश्यकता है, और उस पर्यावरण चर को डॉकर डेमन निष्पादन स्क्रिप्ट में पास करें।

पूर्णता के लिए, यहाँ h3nrick का उत्तर है:


क्या आपके पास कोई /lib/systemd/system/docker.serviceफाइल है?

यदि हां, तो इसे संपादित करें ताकि डॉकर सेवा सामान्य /etc/default/dockerरूप से पर्यावरण फ़ाइल का उपयोग करे:EnvironmentFile=-/etc/default/docker :।

में /etc/default/dockerफ़ाइल तो जोड़ने DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images"

अंत में बस a systemctl daemon-reload && systemctl restart docker

अधिक जानकारी के लिए कृपया दस्तावेज़ पर भी नज़र डालें ।


यदि आप डेबियन के लिए वर्तमान डॉकटर इंस्टाल निर्देश का पालन करते हैं, तो आपको SysVinit स्क्रिप्ट मिलती है, लेकिन उनका उपयोग नहीं किया जाता है। देखें github.com/docker/docker/issues/9889#issuecomment-109766580
साइमन वुडसाइड

4

एक सरल उपाय यह है कि आप जो भी चाहते हैं, उसके लिए एक सॉफ्ट लिंक पॉइंट बनाएं

link -s /var/lib/docker /mnt/whatever

यह मेरे लिए मेरे CentOS 6.5 सर्वर पर काम करता है।


6
सॉफ्टलिंक न बनाएं। कारण मेरी टिप्पणी मैं पहले पोस्ट देखें ... आप 'docker rm' कमांड से परेशानी में पड़ सकते हैं!
सुथेर

2
@ सूत्रर: मई? अब ऐसी स्थिति है कि आप मुसीबत में हैं या नहीं? मई तकनीकी प्रलेखन के लिए एक छोटा सा आवेग है, अगर मैं किसी समस्या में भाग लेता हूं तो मैं सीखना चाहता हूं कि जब वास्तव में ऐसा होता है, तो यह समस्या कैसे होती है और परिणाम कैसे होगा।
हक्रे

4

जैसा कि @mbarthelemy द्वारा सुझाया गया है, यह -gविकल्प के माध्यम से किया जा सकता है जब सीधे डॉकर डेमन शुरू करते हैं।

हालाँकि, यदि docker को सिस्टम सेवा के रूप में शुरू किया जा रहा है, तो /etc/default/dockerफ़ाइल को संशोधित करने की अनुशंसा नहीं की जाती है । यहां स्थित इस के लिए एक दिशानिर्देश है

सही दृष्टिकोण /etc/docker/daemon.jsonलिनक्स (या मैक) सिस्टम या %programdata%\docker\config\daemon.jsonविंडोज पर एक फ़ाइल बनाना है । यदि इस फ़ाइल का उपयोग किसी और चीज़ के लिए नहीं किया जा रहा है, तो निम्नलिखित फ़ील्ड को पर्याप्त होना चाहिए:

{
    "graph": "/docker/daemon_files"
}

यह उस नए स्थान को मान रहा है जहाँ आप चाहते हैं कि डॉकटर अपना डेटा बनाए रखे /docker/daemon_files


2

OpenSUSE लीप पर 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

ध्यान दें कि DOCKER_OPTS शुरू में खाली था और मैंने जो भी किया था वह इस तर्क में जोड़ा गया था कि docker को मेरी नई निर्देशिका का उपयोग करना है


2

फेडोरा 26 और शायद कई अन्य संस्करणों पर, ऊपर वर्णित के रूप में आप अपने आधार फ़ोल्डर स्थान को स्थानांतरित करने के बाद एक त्रुटि का सामना कर सकते हैं। यह विशेष रूप से सच है यदि आप इसे कहीं / घर के नीचे स्थानांतरित कर रहे हैं। इसका कारण यह है कि SeLinux में किक करता है और डॉकटर कंटेनर को इस स्थान के नीचे से अपने कई कार्यक्रम चलाने से रोकता है।

जब आप -g पैरामीटर जोड़ते हैं, तो लघु समाधान --enable-selinux विकल्प को हटाने के लिए होता है।


हमलों के लिए वह खुला कमरा नहीं होगा?
युरिप्लोक

1

AWS उबंटू 16.04 सर्वर पर मैंने डॉकरों की छवियों को एक अलग ईबीएस पर रखा, जो कि डॉक के तहत / घर / ubuntu / kaggle / पर मुहिम शुरू की

मेरी इनिशियलाइज़ेशन स्क्रिप्ट के इस स्निपेट ने सही तरीके से काम किया

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see /programming/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them

0

17.06.0-ce-mac19 संस्करण में मैक उपयोगकर्ताओं के लिए आप वरीयताएँ विकल्प में उपयोगकर्ता इंटरफ़ेस से बस डिस्क छवि स्थान को स्थानांतरित कर सकते हैं बस डिस्क छवि के स्थान को बदल दें और यह काम करेगा ( डिस्क को स्थानांतरित करें छवि पर क्लिक करके ) और पुनरारंभ करें कर्ता। इस दृष्टिकोण का उपयोग करते हुए मैं डॉकटर छवियों को संग्रहीत करने के लिए अपने बाहरी हार्डिस्क का उपयोग करने में सक्षम था।


डॉकटर की मौजूदा फाइलों के बारे में कैसे? क्या हमें इसे मैन्युअल रूप से स्थानांतरित करना चाहिए?
गुस्ताव

आप अपनी पसंद के स्थान पर docker को पुनः स्थापित करने का प्रयास कर सकते हैं। छवि और डॉकटर फाइलें स्वतंत्र हैं।
साहू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.