Làm thế nào để thay đổi thư mục cài đặt hình ảnh docker?


183

Từ những gì tôi có thể nói, hình ảnh docker được cài đặt /var/lib/dockerkhi chúng được kéo. Có cách nào để thay đổi vị trí này, chẳng hạn như âm lượng được gắn như thế /mntnào không?


3
Docker của bạn đang chạy trên hệ điều hành nào?
Thomasleveil

Câu trả lời:


135

Với các phiên bản gần đây của Docker, bạn sẽ đặt giá trị của data-roottham số vào đường dẫn tùy chỉnh của mình, trong /etc/docker/daemon.json (theo https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Với các phiên bản cũ hơn, bạn có thể thay đổi thư mục cơ sở lưu trữ của Docker (nơi chứa container và hình ảnh) bằng cách sử dụng -gtùy chọn khi khởi động trình nền Docker. (kiểm tra docker --help). Bạn có thể áp dụng cài đặt này tự động khi Docker bắt đầu bằng cách thêm nó vào / etc / default / docker


4
Tôi nghĩ giải pháp tốt nhất là thêm -gtùy chọn này vào / etc / defaults / docker thay vì sửa đổi tệp Upstart, xem câu trả lời của tôi.
mbarthelemy

9
Có, thay đổi dòng này thànhDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy

6
Không hoạt động ở Fedora. Xem câu trả lời của tôi nếu bản phân phối của bạn là Fedora
Vitor

3
Bạn có thể cần triển khai giải pháp này cho một lỗi trong một số phiên bản Debian hoặc Ubuntu nếu docker bỏ qua /etc/default/dockertệp của bạn .
nedim

4
Các graphthuộc tính trong daemon.json bị phản đối như của v17.05.0, sử dụng data-rootthay vào đó, cf. stackoverflow.com/a/50217666/743507
dschulten

141

Theo lời khuyên từ các bình luận, tôi sử dụng tài liệu hệ thống Docker để cải thiện câu trả lời này. Dưới đây thủ tục không yêu cầu khởi động lại và sạch hơn nhiều.

Đầu tiên tạo thư mục và tập tin cho cấu hình tùy chỉnh:

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

Đối với phiên bản docker trước khi dán 17,06-ce :

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

Đối với docker sau khi dán 17,06 ce :

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

Phương pháp thay thế thông qua daemon.json

Gần đây tôi đã thử quy trình trên với 17,09 ce trên Fedora 25 và dường như nó không hoạt động. Thay vì sửa đổi đơn giản trong /etc/docker/daemon.jsonthực hiện các mẹo:

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

Mặc dù phương pháp bạn phải tải lại cấu hình và khởi động lại Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Để xác nhận rằng Docker đã được cấu hình lại:

docker info|grep "loop file"

Trong phiên bản gần đây (17.03) lệnh khác nhau được yêu cầu:

docker info|grep "Docker Root Dir"

Đầu ra sẽ trông như thế này:

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

Hoặc là:

 Docker Root Dir: /mnt

Sau đó, bạn có thể xóa bộ lưu trữ Docker cũ một cách an toàn:

rm -rf /var/lib/docker

8
Đó là phương pháp duy nhất giúp tôi trên Ubuntu 16.04!
Vadim

1
Liên kết này docs.docker.com/engine/admin/systemd giải thích cách định cấu hình Docker với systemd, hoạt động cho phân phối linux mới hơn như Ubuntu 16.04.
Joseph Hui

6
Các docker infotuyên bố có lẽ là lỗi thời. Trên Ubuntu 16.04, kiểm tra cấu hình lại là sudo docker info | grep "Docker Root Dir". Nếu không, câu trả lời tốt, nên là câu trả lời được chấp nhận;)
Guillaume Perrot

5
Trong phiên bản mới của Linux (4.10) và Docker (docker-ce 17,06), dòng phải được thay đổi như sau: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini

2
Nếu bạn thấy Docker Root Dir: /"/mnt"khi bạn chạy docker info|grep "Docker Root Dir", bạn phải thay thế --data-root="/mnt"vào --data-root=/mntbên trong tệpdocker-storage.conf
Ser

62

Đối với các phiên bản docker mới, chúng tôi cần sử dụng data-rootnhư graphkhông dùng nữa trong v17.05.0: tài liệu không dùng chính thức

Chỉnh sửa /etc/docker/daemon.json(nếu nó không tồn tại, tạo nó) và bao gồm:

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

Sau đó khởi động lại Docker với:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Một lời giải thích chi tiết hơn bước-by-step (bao gồm cả việc chuyển dữ liệu) sử dụng Docker lưu trữ với dữ liệu gốc có thể được tìm thấy trong: Blog bài
  • Trong trường hợp Windows một bài tương tự Windows cụ thể

bình luận của bạn đã giúp tôi tìm thấy trang này: adriel.co.nz/blog/2018/01/25/ cảm ơn!
Nasatome

8
Tôi nghĩ rằng đã đến lúc đưa ra câu trả lời này cho cờ "được chấp nhận", bởi vì nó hoạt động trong phiên bản hiện tại.
Bndr

Tôi nhận xét ở đây để cho mọi người biết phiên bản nào có thể sử dụng phiên bản này, sau khi github.com/docker/docker.github.io/pull/5978 phát hành, Nó thay đổi trang web của docail.
zhongjiajie

Điều này cũng có hiệu quả với tôi, Cảm ơn bạn :)
Aashay Amballi

39

Vì tôi không tìm thấy hướng dẫn chính xác để thực hiện việc này trong Fedora (EDIT: mọi người đã nhận xét rằng điều này cũng sẽ hoạt động trên CentOS và Suse) (/ etc / default / docker không được sử dụng ở đó), tôi thêm vào trả lời ở đây:

Bạn phải chỉnh sửa / etc / sysconfig / docker và thêm tùy chọn -g trong biến TÙY CHỌN. Nếu có nhiều hơn một tùy chọn, hãy đảm bảo bạn gửi chúng vào "". Trong trường hợp của tôi, tập tin đó chứa:

OPTIONS=--selinux-enabled

vì vậy nó sẽ trở thành

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

Sau khi khởi động lại ( systemctl restart docker), Docker nên sử dụng thư mục mới


Trên CentOS 6.5 / 6.6 và có lẽ là 7, bạn sử dụng cùng tệp / etc / sysconfig / docker, nhưng bạn thêm các đối số vào tên biến other_args.
dlaidlaw

Tùy chọn này được gọi là DOCKER_OPTS ngay bây giờ (phiên bản docker 1.7.0).
nedim

6
Từ phiên bản 1.8 của Docker trở đi, việc sử dụng các tệp cấu hình Docker trong / etc / sysconfig không được chấp nhận. Thay vào đó, bạn nên sử dụng các tệp cấu hình thả vào systemd trong etc / systemd / system / docker.service.d. Sau khi thêm hoặc sửa đổi tệp thả trong khi dịch vụ docker đang chạy, hãy chạy lệnh systemctl daemon-reload để báo cho systemd tải lại cấu hình cho dịch vụ. docs.oracle.com/cd/E52668_01/E54669/html/ chì
Pablo Marin-Garcia

và sử dụng các tập tin thả xuống docs.docker.com/engine/articles/systemd/ Kẻ
Pablo Marin-Garcia

23

Không sử dụng Liên kết tượng trưng để di chuyển thư mục docker sang / mnt (ví dụ). Điều này có thể gây rắc rối với lệnh docker rm .

Sử dụng tốt hơn Tùy chọn -g cho docker. Trên Ubuntu, bạn có thể đặt nó vĩnh viễn trong /etc/default/docker.io. Tăng cường hoặc thay thế Dòng DOCKER_OPTS.

Dưới đây là một ví dụ: `DOCKER_OPTS =" - g / mnt / ở đâu đó / khác / docker / "


trong trường hợp của tôi, tôi đã phải khởi động lại
psychok7

1
Tôi gặp phải rắc rối gì docker rmkhi sử dụng symlink?
bjhend

1
Tôi cũng đã phải làm điều này trong Ubuntu 16.04 stackoverflow.com/a/30219552/977622 để làm cho nó hoạt động
psychok7

21

Cách dễ dàng hơn nhiều để làm như vậy:

Dừng dịch vụ cập cảng

sudo systemctl stop docker

Di chuyển thư mục docker hiện tại đến vị trí mới

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

Tạo liên kết tượng trưng

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

Bắt đầu dịch vụ cập cảng

sudo systemctl start docker

2
Đây là IMO là giải pháp đúng đắn và đơn giản nhất - đã làm việc cho tôi.
Martin Dvorak

2
làm việc như một cơ duyên đối với tôi nhưng không có dấu gạch chéo cho lệnh liên kết tượng trưng:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

Đây là những gì các diễn đàn Docker đề nghị: forums.docker.com/t/...
headdab

Đây là một giải pháp tuyệt vời đã cứu sống tôi. :)
Niketh Sudhakaran

Tôi đã thực hiện ở trên và docker đã hoạt động. Nhưng tôi không thể tìm thấy hình ảnh docker của tôi đã tồn tại. Bất kỳ đề xuất?
Thilina Viraj

13

Giải pháp này hoạt động trên Red Hat 7.2 & Docker 1.12.0

Chỉnh sửa tệp /lib/systemd/system/docker.service trong trình soạn thảo văn bản của bạn.

thêm -g / path / to / docker / vào cuối lệnh ExecStart . Dòng hoàn chỉnh sẽ trông như thế này.

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

Thực hiện lệnh dưới đây

systemctl daemon-reload
systemctl restart docker

Thực hiện lệnh để kiểm tra thư mục docker

docker info | grep "loop file\|Dir"

Nếu bạn có tệp / etc / sysconfig / docker trong Red Hat hoặc docker 1.7.1, hãy kiểm tra câu trả lời này .


trường hợp của tôi: centos7, docker mới nhất; tôi đã phải gọi "systemctl status docker" để tìm tập tin "docker.service" và thêm tùy chọn "-g" như trong câu trả lời. Cảm ơn
datdinhquoc

13

Phiên bản sao chép và dán của câu trả lời người chiến thắng :)

Tạo tệp này chỉ với nội dung này:

$ sudo vi /etc/docker/daemon.json

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

Đã thử nghiệm trên Ubuntu 16.04.2 LTSdocker1.12.6


1
Các graphthuộc tính trong daemon.json bị phản đối như của v17.05.0, sử dụng data-rootthay vào đó, cf. stackoverflow.com/a/50217666/743507
dschulten

12

Trong CentOS 6.5

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

thêm dòng sau

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

sau đó lưu tệp và bắt đầu lại docker

service docker start

và sẽ tạo tệp lưu trữ trong /data/docker


6

Đối với Debian / Ubuntu hoặc Fedora, bạn có thể sử dụng các câu trả lời khác. Nhưng nếu bạn không có tệp dưới /etc/default/dockerhoặc /etc/sysconfig/dockervà hệ thống của bạn đang chạy systemd, bạn có thể muốn làm theo câu trả lời này của h3nrik . Tôi đang sử dụng Arch, và điều này làm việc cho tôi.

Về cơ bản, bạn cần cấu hình systemd để đọc vị trí hình ảnh docker mới dưới dạng biến môi trường và chuyển biến môi trường đó vào tập lệnh thực thi Docker daemon.

Để đầy đủ, đây là câu trả lời của h3nrick:


Bạn có /lib/systemd/system/docker.service tập tin?

Nếu vậy, hãy chỉnh sửa nó để dịch vụ Docker sử dụng thông thường /etc/default/dockernhư một tệp môi trường:EnvironmentFile=-/etc/default/docker .

Trong /etc/default/dockertập tin sau đó thêmDOCKER_OPTS="-g /home/rseixas/Programs/Docker/images" .

Cuối cùng chỉ cần làm một systemctl daemon-reload && systemctl restart docker .

Để biết thêm thông tin xin vui lòng xem tài liệu .


Nếu bạn làm theo hướng dẫn cài đặt docker hiện tại cho Debian, bạn sẽ nhận được các tập lệnh SysVinit nhưng chúng không được sử dụng. Xem github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside

4

Một giải pháp đơn giản hơn nhiều là tạo một điểm liên kết mềm tới bất cứ thứ gì bạn muốn, chẳng hạn như

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

Nó hoạt động với tôi trên máy chủ CentOS 6.5 của tôi.


6
Đừng tạo một liên kết mềm. Lý do thấy bình luận của tôi tôi đăng trước đây ... Bạn có thể gặp rắc rối với các lệnh 'docker rm'!
suther 30/03/2015

2
@suther: Có thể? Bây giờ có tình huống bạn gặp rắc rối hay không? Có thể là một chút không chính xác cho tài liệu kỹ thuật, nếu tôi gặp phải một vấn đề thì tôi muốn tìm hiểu chính xác khi nào điều đó xảy ra, vấn đề đó được gây ra như thế nào và kết quả sẽ như thế nào.
hakre

4

Theo khuyến nghị của @mbarthelemy, điều này có thể được thực hiện thông qua -gtùy chọn khi khởi động trực tiếp trình nền của docker .

Tuy nhiên, nếu docker đang được khởi động như một dịch vụ hệ thống, thì không nên sửa đổi /etc/default/dockertệp. Có một hướng dẫn này nằm ở đây .

Cách tiếp cận đúng là tạo một /etc/docker/daemon.jsontệp trên các hệ thống Linux (hoặc Mac) hoặc %programdata%\docker\config\daemon.jsontrên Windows. Nếu tệp này không được sử dụng cho bất cứ điều gì khác, các trường sau sẽ đủ:

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

Đây là giả định vị trí mới mà bạn muốn có docker duy trì dữ liệu của nó là /docker/daemon_files


2

Trên 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"

Lưu ý rằng DOCKER_OPTS ban đầu trống và tất cả những gì tôi đã làm là thêm vào đối số để làm cho docker sử dụng thư mục mới của tôi


2

Trên Fedora 26 và có thể nhiều phiên bản khác, bạn có thể gặp lỗi sau khi di chuyển vị trí thư mục cơ sở của mình như được mô tả ở trên. Điều này đặc biệt đúng nếu bạn đang di chuyển nó đến một nơi nào đó dưới / nhà. Điều này là do SeLinux khởi động và ngăn chặn container docker chạy nhiều chương trình của nó từ dưới vị trí này.

Giải pháp ngắn gọn là loại bỏ tùy chọn --enable-selinux khi bạn thêm tham số -g.


Đó sẽ không mở phòng cho các cuộc tấn công?
yuriploc

1

Trên máy chủ AWS Ubuntu 16.04, tôi đặt các hình ảnh Docker trên một EBS riêng biệt, được gắn trên / home / ubfox / kaggle /, dưới thư mục docker

Đoạn mã kịch bản khởi tạo của tôi hoạt động chính xác

# 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

Đối với người dùng Mac ở phiên bản 17,06-ce-mac19, bạn chỉ cần di chuyển vị trí Đĩa ảnh từ giao diện người dùng trong tùy chọn tùy chọn Chỉ cần thay đổi vị trí của ảnh đĩa và nó sẽ hoạt động (bằng cách nhấp vào Di chuyển hình ảnh đĩa ) và khởi động lại bến tàu. Sử dụng phương pháp này tôi đã có thể sử dụng ổ cứng ngoài để lưu trữ hình ảnh docker.


Làm thế nào về các tập tin hiện có của docker? chúng ta nên di chuyển nó bằng tay?
gavav

Bạn có thể thử cài đặt lại docker ở vị trí ưu tiên của bạn. Các tập tin hình ảnh và docker là độc lập.
Sahu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.