วิธีการเปลี่ยนไดเรกทอรีการติดตั้งอิมเมจสำหรับนักเทียบท่า?


183

จากสิ่งที่ฉันสามารถบอกได้ภาพนักเทียบท่าจะถูกติดตั้งไว้/var/lib/dockerตามที่ดึงออกมา มีวิธีในการเปลี่ยนตำแหน่งนี้เช่นไปยังไดรฟ์ข้อมูลที่ติดตั้งเป็น/mntอย่างไร


3
ระบบปฏิบัติการใดที่นักเทียบท่าของคุณกำลังทำงานอยู่
Thomasleveil

คำตอบ:


135

ด้วย Docker เวอร์ชันล่าสุดคุณจะต้องตั้งค่าdata-rootพารามิเตอร์เป็นพา ธ ที่กำหนดเองของคุณใน/etc/docker/daemon.json (ตามhttps://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file )

ด้วยเวอร์ชันที่เก่ากว่าคุณสามารถเปลี่ยนไดเรกทอรีฐานของที่เก็บข้อมูลของ Dock (ที่ที่เก็บและรูปภาพไป) โดยใช้-gตัวเลือกเมื่อเริ่มต้น Docker daemon (ตรวจสอบ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
ไม่ทำงานใน Fedora ดูคำตอบของฉันถ้าดิสโกของคุณคือ Fedora
Vitor

3
คุณอาจจำเป็นต้องใช้โซลูชันนี้เพื่อแก้ไขข้อบกพร่องใน Debian หรือ Ubuntu บางรุ่นหากนักเทียบท่าไม่สนใจ/etc/default/dockerไฟล์ของคุณ
nedim

4
graphแอตทริบิวต์ใน daemon.json จะเลิกเป็นของ v17.05.0 ใช้data-rootแทน cf เลย stackoverflow.com/a/50217666/743507
dschulten

141

คำแนะนำต่อไปนี้จากความคิดเห็นที่ฉันใช้เอกสาร Docker systemdเพื่อปรับปรุงคำตอบนี้ ขั้นตอนด้านล่างไม่จำเป็นต้องรีบูตและสะอาดกว่ามาก

ขั้นแรกสร้างไดเรกทอรีและไฟล์สำหรับการกำหนดค่าแบบกำหนดเอง:

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

สำหรับนักเทียบท่าเวอร์ชันก่อน 17.06-ce paste:

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

สำหรับนักเทียบท่าหลังจากวาง17.06-ce :

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

ทางเลือกวิธีการผ่าน daemon.json

ฉันเพิ่งลองขั้นตอนข้างต้นด้วย17.09-ceใน Fedora 25 และดูเหมือนจะไม่ทำงาน แทนการปรับเปลี่ยนอย่างง่ายในการ/etc/docker/daemon.jsonทำเคล็ดลับ:

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

แม้จะมีวิธีที่คุณต้องโหลดการกำหนดค่าและรีสตาร์ท Docker:

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

จากนั้นคุณสามารถลบที่เก็บข้อมูล Docker เก่าได้อย่างปลอดภัย:

rm -rf /var/lib/docker

8
เป็นวิธีเดียวที่ช่วยฉันใน Ubuntu 16.04!
Vadim

1
ลิงค์นี้docs.docker.com/engine/admin/systemdอธิบายถึงวิธีการตั้งค่า Docker ด้วย systemd ซึ่งใช้งานได้กับลินุกซ์รุ่นใหม่เช่น Ubuntu 16.04
โจเซฟฮุ่ย

6
docker infoคำสั่งอาจจะล้าสมัย บน Ubuntu 16.04 sudo docker info | grep "Docker Root Dir"การตรวจสอบสำหรับการกำหนดค่าใหม่เป็น มิฉะนั้นคำตอบที่ดีควรเป็นคำตอบที่ยอมรับได้)
Guillaume Perrot

5
ในเวอร์ชันใหม่ของ Linux (4.10) และ Docker (docker-ce 17.06) บรรทัดต้องเปลี่ยนดังนี้: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini

2
หากคุณเห็นDocker Root Dir: /"/mnt"เมื่อคุณเรียกใช้docker info|grep "Docker Root Dir"คุณจะต้องแทนที่--data-root="/mnt"ลง--data-root=/mntในไฟล์docker-storage.conf
Ser

62

สำหรับนักเทียบท่ารุ่นใหม่ที่เราต้องใช้data-rootตามที่graphถูกคัดค้านใน v17.05.0: เอกสารที่เลิกใช้แล้วอย่างเป็นทางการ

แก้ไข/etc/docker/daemon.json(หากไม่มีอยู่ให้สร้างขึ้นมา) และรวมถึง:

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

จากนั้นรีสตาร์ท Docker ด้วย:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • คำอธิบายอย่างละเอียดทีละขั้นตอน (รวมถึงการย้ายข้อมูล) โดยใช้ Docker Storage พร้อมdata-rootสามารถดูได้ที่: Blog post
  • ในกรณีของ Windows โพสต์ที่คล้ายกันเฉพาะของ Windows

ความคิดเห็นของคุณช่วยฉันค้นหาหน้านี้: adriel.co.nz/blog/2018/01/25/… ขอบคุณ!
nasatome

8
ฉันคิดว่าถึงเวลาที่จะให้คำตอบนี้ธง "ยอมรับ" เพราะมันทำงานในรุ่นปัจจุบัน
Bndr

ฉันแสดงความคิดเห็นที่นี่เพื่อให้ผู้คนทราบว่าเวอร์ชันใดที่สามารถใช้สิ่งนี้ได้หลังจากที่github.com/docker/docker.github.io/pull/5978ปล่อยมันเปลี่ยนเว็บไซต์สำนักงาน
zhongjiajie

สิ่งนี้ใช้ได้กับฉันเช่นกันขอบคุณ :)
Aashay Amballi

39

เนื่องจากฉันไม่พบคำแนะนำที่ถูกต้องสำหรับการทำเช่นนี้ใน Fedora (แก้ไข: ผู้คนชี้ความเห็นว่าควรใช้ CentOS และ Suse ด้วย) (/ etc / default / docker ไม่ได้ใช้ที่นั่น) ฉันจึงเพิ่ม ตอบที่นี่:

คุณต้องแก้ไข/ etc / sysconfig / dockerและเพิ่มตัวเลือก -g ในตัวแปร OPTIONS หากมีมากกว่าหนึ่งตัวเลือกตรวจสอบให้แน่ใจว่าคุณใส่ไว้ใน "" ในกรณีของฉันไฟล์นั้นมี:

OPTIONS=--selinux-enabled

ดังนั้นมันจะกลายเป็น

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

หลังจากรีสตาร์ท ( systemctl restart docker) แล้ว Docker ควรใช้ไดเรกทอรีใหม่


บน CentOS 6.5 / 6.6 และอาจ 7 คุณใช้ไฟล์ / etc / sysconfig / docker เดียวกัน แต่คุณเพิ่มอาร์กิวเมนต์ไปยังชื่อตัวแปร other_args
dlaidlaw

ตัวเลือกนี้มีชื่อว่า DOCKER_OPTS ทันที (ตัวเทียบรุ่น 1.7.0)
nedim

6
ตั้งแต่เวอร์ชัน 1.8 ของ Docker เป็นต้นไปการใช้ไฟล์กำหนดค่า Docker ใน / etc / sysconfig จะถูกคัดค้าน แต่คุณควรใช้ไฟล์การกำหนดค่าแบบดรอปดาวน์ systemd ใน etc / systemd / system / docker.service.d หลังจากเพิ่มหรือแก้ไขไฟล์ดร็อปดาวน์ขณะที่เซอร์วิสตัวเชื่อมต่อกำลังรันอยู่ให้รันคำสั่ง systemctl daemon-reload เพื่อบอก systemd เพื่อโหลดการกำหนดค่าสำหรับเซอร์วิส docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia

และใช้ไฟล์แบบหล่นในdocs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia

23

อย่าใช้ลิงก์สัญลักษณ์เพื่อย้ายโฟลเดอร์นักเทียบท่าไปที่ / mnt (ตัวอย่าง) สิ่งนี้อาจทำให้เกิดปัญหากับคำสั่งdocker rm

ควรใช้ตัวเลือก -g สำหรับนักเทียบท่า บน Ubuntu คุณสามารถตั้งค่าอย่างถาวรใน /etc/default/docker.io ปรับปรุงหรือแทนที่บรรทัด DOCKER_OPTS

นี่คือตัวอย่าง: `DOCKER_OPTS =" - g / mnt / ที่ไหนสักแห่ง / อื่น / นักเทียบท่า / "


ในกรณีของฉันฉันต้องรีสตาร์ท
psychok7

1
ฉันต้องคาดหวังปัญหาอะไรdocker rmเมื่อใช้ symlink
bjhend

1
ฉันยังมีการทำเช่นนี้ในUbuntu 16.04 stackoverflow.com/a/30219552/977622จะได้รับมันในการทำงาน
psychok7

21

วิธีที่ง่ายกว่ามากในการทำเช่นนั้น:

หยุดบริการนักเทียบท่า

sudo systemctl stop docker

ย้ายไดเร็กทอรีนักเทียบท่าที่มีอยู่ไปยังตำแหน่งใหม่

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

สร้างลิงค์สัญลักษณ์

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

เริ่มบริการนักเทียบท่า

sudo systemctl start docker

2
นี่คือ IMO ที่ถูกต้องและเป็นวิธีที่ตรงไปตรงมาที่สุด - ใช้ได้สำหรับฉัน
Martin Dvorak

2
ทำงานเหมือนคาถาสำหรับฉัน แต่ไม่มีเครื่องหมายทับต่อท้ายสำหรับคำสั่งลิงก์สัญลักษณ์:sudo ln -s /path/to/new/docker/ /var/lib/docker
714

นี่คือสิ่งที่ฟอรัมนักเทียบท่าแนะนำ: forums.docker.com/t/…
headdab

นี่เป็นทางออกที่ยอดเยี่ยมที่ช่วยชีวิตฉัน :)
Niketh Sudhakaran

ฉันได้ดำเนินการด้านบนและนักเทียบท่าทำงานแล้ว แต่ฉันไม่พบภาพนักเทียบท่าของฉันอยู่แล้ว ข้อเสนอแนะใด ๆ
Thilina Viraj

13

วิธีนี้ใช้ได้กับRed Hat 7.2 & Docker 1.12.0

แก้ไขไฟล์ /lib/systemd/system/docker.serviceในเท็กซ์เอดิเตอร์ของคุณ

เพิ่ม-g / path / to / docker /ท้ายคำสั่งExecStart บรรทัดที่สมบูรณ์ควรมีลักษณะเช่นนี้

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

ดำเนินการคำสั่งด้านล่าง

systemctl daemon-reload
systemctl restart docker

ดำเนินการคำสั่งเพื่อตรวจสอบไดเร็กทอรีนักเทียบท่า

docker info | grep "loop file\|Dir"

ถ้าคุณมีetc / sysconfig / นักเทียบท่า /แฟ้มในหมวกสีแดงหรือนักเทียบท่า 1.7.1 ตรวจสอบนี้คำตอบ


เคสของฉัน: centos7, นักเทียบท่าล่าสุด; ฉันต้องเรียก "systemctl status docker" เพื่อหาไฟล์ "docker.service" และเพิ่มตัวเลือก "-g" เหมือนในคำตอบ ขอบคุณ
datdinhquoc

13

คำตอบผู้ชนะเวอร์ชันคัดลอกและวาง :)

สร้างไฟล์นี้ด้วยเนื้อหานี้เท่านั้น:

$ sudo vi /etc/docker/daemon.json

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

ทดสอบUbuntu 16.04.2 LTSในตัวเทียบท่า1.12.6


1
graphแอตทริบิวต์ใน daemon.json จะเลิกเป็นของ v17.05.0 ใช้data-rootแทน cf เลย stackoverflow.com/a/50217666/743507
dschulten

12

ใน CentOS 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

สำหรับ Debian / Ubuntu หรือ Fedora คุณอาจใช้คำตอบอื่น ๆ ได้ แต่ถ้าคุณไม่ได้มีไฟล์ภายใต้/etc/default/dockerหรือ/etc/sysconfig/dockerและระบบของคุณทำงาน systemd คุณอาจต้องการที่จะปฏิบัติตามคำตอบนี้โดย h3nrik ฉันใช้ Arch และมันใช้งานได้สำหรับฉัน

โดยทั่วไปคุณต้องกำหนดค่า systemd เพื่ออ่านตำแหน่งรูปภาพของนักเทียบท่าใหม่เป็นตัวแปรสภาพแวดล้อมและส่งผ่านตัวแปรสภาพแวดล้อมนั้นไปยังสคริปต์การเรียกใช้งาน Docker daemon

เพื่อความสมบูรณ์นี่คือคำตอบของ h3nrick:


คุณมี/lib/systemd/system/docker.serviceไฟล์ไหม

ถ้าเป็นเช่นนั้นการแก้ไขเพื่อให้บริการเทียบท่าที่ใช้ปกติเป็นไฟล์สภาพแวดล้อม:/etc/default/dockerEnvironmentFile=-/etc/default/docker

ในไฟล์แล้วเพิ่ม/etc/default/dockerDOCKER_OPTS="-g /home/rseixas/Programs/Docker/images"

systemctl daemon-reload && systemctl restart dockerในตอนท้ายเพียงทำ

สำหรับข้อมูลเพิ่มเติมโปรดดูที่เป็นเอกสาร


หากคุณทำตามคำแนะนำในการติดตั้งนักเทียบท่าปัจจุบันสำหรับ Debian คุณจะได้รับสคริปต์ SysVinit แต่ไม่ได้ใช้ ดูgithub.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside

4

วิธีแก้ปัญหาที่ง่ายกว่าคือการสร้างจุดเชื่อมโยงที่อ่อนนุ่มให้กับสิ่งที่คุณต้องการเช่น

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

มันใช้งานได้สำหรับฉันบนเซิร์ฟเวอร์ CentOS 6.5 ของฉัน


6
อย่าสร้างซอฟต์ลิงค์ เหตุผลที่เห็นความคิดเห็นของฉันฉันโพสต์ก่อน ... คุณอาจมีปัญหากับคำสั่ง 'นักเทียบท่า rm'!
suther

2
@suther: อาจ ตอนนี้มีสถานการณ์ที่คุณประสบปัญหาหรือไม่? อาจเป็นเรื่องที่ไม่แน่ชัดสำหรับเอกสารทางเทคนิคถ้าฉันพบปัญหาแล้วฉันต้องการที่จะเรียนรู้เมื่อสิ่งนั้นเกิดขึ้นอย่างแน่นอนว่าปัญหานั้นเกิดขึ้นได้อย่างไรและผลลัพธ์จะเป็นอย่างไร
hakre

4

ตามที่ถูกแนะนำโดย @mbarthelemy สิ่งนี้สามารถทำได้ผ่าน-gตัวเลือกเมื่อเริ่มต้นนักเทียบท่า daemon โดยตรง

อย่างไรก็ตามหากนักเทียบท่ากำลังเริ่มบริการระบบไม่แนะนำให้แก้ไข/etc/default/dockerไฟล์ มีแนวทางในการนี้อยู่คือที่นี่

แนวทางที่ถูกต้องคือการสร้าง/etc/docker/daemon.jsonไฟล์บนระบบ Linux (หรือ Mac) หรือ%programdata%\docker\config\daemon.jsonบน Windows หากไม่ได้ใช้ไฟล์นี้เพื่อสิ่งอื่นใดฟิลด์ต่อไปนี้ควรพอเพียง:

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

นี่คือการสมมติว่าตำแหน่งใหม่ที่คุณต้องการให้นักเทียบท่ายืนยันข้อมูลอยู่ /docker/daemon_files


2

บน openSUSE Leap 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 ว่างเปล่าในตอนแรกและทั้งหมดที่ฉันทำคือเพิ่มในอาร์กิวเมนต์เพื่อให้นักเทียบท่าใช้ไดเรกทอรีใหม่ของฉัน


2

ใน Fedora 26 และรุ่นอื่น ๆ อีกมากมายคุณอาจพบข้อผิดพลาดหลังจากย้ายตำแหน่งโฟลเดอร์พื้นฐานตามที่อธิบายไว้ข้างต้น นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งหากคุณย้ายไปที่ใดที่หนึ่งภายใต้ / บ้าน นี่เป็นเพราะ SeLinux เริ่มทำงานและป้องกันไม่ให้นักเทียบท่าคอนเทนเนอร์ทำงานหลาย ๆ โปรแกรมภายใต้ตำแหน่งนี้

ทางออกสั้น ๆ คือการลบตัวเลือก --enable-selinux เมื่อคุณเพิ่มพารามิเตอร์ -g


ห้องนั้นจะไม่เปิดให้โจมตีหรือไม่
yuriploc

1

บน AWS Ubuntu 16.04 Server ฉันใส่อิมเมจ Docker ใน EBS แยกต่างหากติดตั้งบน / home / ubuntu / kaggle / ภายใต้ dir docker

ตัวอย่างของสคริปต์การเริ่มต้นของฉันนี้ทำงานอย่างถูกต้อง

# 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

สำหรับผู้ใช้ Mac ในเวอร์ชั่น 17.06.0-ce-mac19 คุณสามารถย้ายตำแหน่งของอิมเมจดิสก์จากส่วนต่อประสานผู้ใช้ในตัวเลือกการตั้งค่าเพียงแค่เปลี่ยนตำแหน่งของอิมเมจของดิสก์และมันจะทำงาน (โดยการคลิกย้ายดิสก์อิมเมจ ) และรีสตาร์ท นักเทียบท่า การใช้วิธีการนี้ทำให้ฉันสามารถใช้ฮาร์ดดิสก์ภายนอกของฉันเพื่อจัดเก็บภาพนักเทียบท่า


แล้วไฟล์เทียบท่าที่มีอยู่ล่ะ? เราควรจะย้ายมันด้วยตัวเองเหรอ?
gustav

คุณสามารถลองติดตั้ง docker อีกครั้งในตำแหน่งที่คุณต้องการ ไฟล์รูปภาพและนักเทียบท่าเป็นอิสระ
sahu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.