Jak zmienić katalog instalacyjny obrazu dokera?

183

Z tego, co mogę powiedzieć, obrazy dokerów są instalowane w /var/lib/dockermiarę ich pobierania. Czy istnieje sposób na zmianę tej lokalizacji, na przykład na zamontowany wolumin /mnt?

Michael Barton
źródło
3
na jakim systemie operacyjnym działa dokuer?
Thomasleveil,

Odpowiedzi:

135

W najnowszych wersjach Dockera ustawisz wartość data-rootparametru na ścieżkę niestandardową w /etc/docker/daemon.json (zgodnie z https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

W starszych wersjach możesz zmienić katalog podstawowy pamięci Dockera (tam, gdzie idą kontener i obrazy), używając -gopcji podczas uruchamiania demona Docker. (sprawdź docker --help). Możesz ustawić to ustawienie automatycznie, gdy Docker rozpocznie pracę, dodając je do / etc / default / docker

mbarthelemy
źródło
4
Myślę, że najlepszym rozwiązaniem jest dodanie tej -gopcji do / etc / defaults / docker zamiast modyfikowania pliku Upstart, zobacz moją odpowiedź.
mbarthelemy
9
Tak, zmień ten wiersz naDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Nie działa w Fedorze. Zobacz moją odpowiedź, jeśli twoją dystrybucją jest Fedora
Vitor
3
Może być konieczne zaimplementowanie tego rozwiązania błędu w niektórych wersjach Debiana lub Ubuntu, jeśli docker zignoruje twój /etc/default/dockerplik.
nedim
4
graphAtrybut w daemon.json jest przestarzała od v17.05.0, użyj data-rootzamiast, cf. stackoverflow.com/a/50217666/743507
dschulten
141

Zgodnie z radą zawartą w komentarzach korzystam z dokumentacji systemowej Docker, aby poprawić tę odpowiedź. Poniższa procedura nie wymaga ponownego uruchomienia i jest znacznie czystsza.

Najpierw utwórz katalog i plik do niestandardowej konfiguracji:

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

W przypadku wersji dokowanej przed wklejeniem 17.06-ce :

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

W przypadku dokera po wklejeniu 17.06-ce :

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

Alternatywna metoda poprzez daemon.json

Niedawno wypróbowałem powyższą procedurę z 17.09-ce na Fedorze 25 i wydaje się, że nie działa. Zamiast tej prostej modyfikacji /etc/docker/daemon.jsonwykonaj lewę:

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

Pomimo metody musisz ponownie załadować konfigurację i ponownie uruchomić Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Aby potwierdzić, że Docker został ponownie skonfigurowany:

docker info|grep "loop file"

W najnowszej wersji (17.03) wymagana jest inna komenda:

docker info|grep "Docker Root Dir"

Dane wyjściowe powinny wyglądać następująco:

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

Lub:

 Docker Root Dir: /mnt

Następnie możesz bezpiecznie usunąć starą pamięć Docker:

rm -rf /var/lib/docker
Piotr Król
źródło
8
To jedyna metoda, która pomogła mi w Ubuntu 16.04!
Vadim,
1
Ten link docs.docker.com/engine/admin/systemd wyjaśnia, jak skonfigurować Docker za pomocą systemd, który działa dla nowszej dystrybucji Linuksa, takiej jak Ubuntu 16.04.
Joseph Hui
6
docker infoStwierdzenie jest prawdopodobnie nieaktualne. W systemie Ubuntu 16.04 sprawdzanie ponownej konfiguracji to sudo docker info | grep "Docker Root Dir". W przeciwnym razie dobrą odpowiedzią powinna być odpowiedź zaakceptowana;)
Guillaume Perrot
5
W nowej wersji systemu Linux (4.10) i Docker (docker-ce 17.06) należy zmienić wiersz w następujący sposób: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Jeśli widzisz, Docker Root Dir: /"/mnt"kiedy uruchamiasz docker info|grep "Docker Root Dir", musisz zamienić --data-root="/mnt"na --data-root=/mntwewnątrz plikudocker-storage.conf
Ser
62

W przypadku nowych wersji dokera musimy użyć tego, data-rootco graphjest przestarzałe w wersji 17.05.0: oficjalne przestarzałe dokumenty

Edytuj /etc/docker/daemon.json(jeśli nie istnieje, utwórz go) i dołącz:

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

Następnie uruchom ponownie Docker za pomocą:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Bardziej szczegółowe wyjaśnienie krok po kroku (w tym przenoszenie danych) za pomocą Docker Storage z rootowaniem danych można znaleźć w: Blog post
  • W przypadku systemu Windows podobny post specyficzny dla systemu Windows
andreas-supersmart
źródło
Twój komentarz pomógł mi znaleźć tę stronę: adriel.co.nz/blog/2018/01/25/… dzięki!
nasatome
8
Myślę, że nadszedł czas, aby nadać tej odpowiedzi flagę „zaakceptowano”, ponieważ działa ona w bieżącej wersji.
The Bndr
I komentarz tutaj, aby ludzie wiedzieli, która wersja może korzystać z tego, po github.com/docker/docker.github.io/pull/5978 wydaniu, to zmienić officail internetowej.
zhongjiajie
To również zadziałało, dziękuję :)
Aashay Amballi
39

Ponieważ nie znalazłem poprawnych instrukcji do zrobienia tego w Fedorze (EDYCJA: ludzie wskazali w komentarzach, że powinno to również działać na CentOS i Suse) (/ etc / default / docker nie jest tam używany), dodaję mój odpowiedz tutaj:

Musisz edytować / etc / sysconfig / docker i dodać opcję -g w zmiennej OPTIONS. Jeśli jest więcej niż jedna opcja, upewnij się, że umieścisz je w „”. W moim przypadku plik ten zawierał:

OPTIONS=--selinux-enabled

tak by się stało

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

Po restarcie ( systemctl restart docker) Docker powinien użyć nowego katalogu

Vitor
źródło
W CentOS 6.5 / 6.6 i prawdopodobnie 7 używasz tego samego pliku / etc / sysconfig / docker, ale dodajesz argumenty do nazwy zmiennej other_args.
dlaidlaw
Ta opcja nazywa się teraz DOCKER_OPTS (wersja dokująca 1.7.0).
nedim
6
Począwszy od wersji 1.8 Dockera, używanie plików konfiguracyjnych Docker w / etc / sysconfig jest przestarzałe. Zamiast tego należy użyć systemowych plików konfiguracyjnych drop-in w etc / systemd / system / docker.service.d. Po dodaniu lub zmodyfikowaniu pliku listy rozwijanej podczas działania usługi dokowania uruchom komendę systemctl daemon-reload, aby poinformować systemd o ponownym załadowaniu konfiguracji usługi. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia
i użyj plików drop-in docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia
23

Nie używaj dowiązania symbolicznego, aby przenieść folder dokera do / mnt (na przykład). Może to powodować problemy z poleceniem docker rm .

Lepiej użyj opcji -g dla dokera. W Ubuntu możesz ustawić go na stałe w /etc/default/docker.io. Ulepsz lub zamień linię DOCKER_OPTS.

Oto przykład: `DOCKER_OPTS =" - g / mnt / wherewhere / else / docker / "

suther
źródło
w moim przypadku musiałem zrestartować
psychok7
1
Jakiego rodzaju kłopotów muszę się spodziewać docker rmpodczas korzystania z dowiązania symbolicznego?
bjhend
1
Musiałem to również zrobić w Ubuntu 16.04 stackoverflow.com/a/30219552/977622, aby to zadziałało
psychok7
21

Znacznie łatwiejszy sposób to zrobić:

Zatrzymaj usługę dokowania

sudo systemctl stop docker

Przenieś istniejący katalog dokerów do nowej lokalizacji

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

Utwórz łącze symboliczne

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

Uruchom usługę dokowania

sudo systemctl start docker
fnjn
źródło
2
To jest IMO właściwe i najprostsze rozwiązanie - zadziałało dla mnie.
Martin Dvorak
2
działało dla mnie jak urok, ale bez końcowego ukośnika dla polecenia dowiązania symbolicznego:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio
Tak sugerują fora dokerów: forums.docker.com/t/…
headdab
To niesamowite rozwiązanie, które uratowało mi życie. :)
Niketh Sudhakaran
Wykonałem powyżej, a doker był uruchomiony. Ale nie mogę stwierdzić, że moje obrazy dokerów już istnieją. Jakieś sugestie?
Thilina Viraj,
13

To rozwiązanie działa w systemach Red Hat 7.2 i Docker 1.12.0

Edytuj plik /lib/systemd/system/docker.service w edytorze tekstu.

dodaj -g / path / to / docker / na końcu dyrektywy ExecStart . Pełna linia powinna wyglądać następująco.

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

Wykonaj poniższe polecenie

systemctl daemon-reload
systemctl restart docker

Wykonaj polecenie, aby sprawdzić katalog dokera

docker info | grep "loop file\|Dir"

Jeśli masz plik / etc / sysconfig / docker w Red Hat lub docker 1.7.1, sprawdź odpowiedź.

Sudeepta
źródło
moja sprawa: centos7, najnowszy doker; musiałem wywołać „systemctl status docker”, aby znaleźć plik „docker.service” i dodałem opcję „-g” jak w odpowiedzi. Dzięki
datdinhquoc,
13

Skopiuj i wklej wersję odpowiedzi zwycięzcy :)

Utwórz ten plik zawierający tylko tę treść:

$ sudo vi /etc/docker/daemon.json

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

Testowane Ubuntu 16.04.2 LTSw oknie dokowanym1.12.6

Topera
źródło
1
graphAtrybut w daemon.json jest przestarzała od v17.05.0, użyj data-rootzamiast, cf. stackoverflow.com/a/50217666/743507
dschulten
12

W CentOS 6.5

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

dodaj następujący wiersz

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

następnie zapisz plik i uruchom ponownie okno dokowane

service docker start

i utworzy plik repozytorium w /data/docker

Sean Kim
źródło
6

W przypadku Debiana / Ubuntu lub Fedory prawdopodobnie możesz użyć innych odpowiedzi. Ale jeśli nie masz plików pod /etc/default/dockerlub /etc/sysconfig/docker, a system działa systemd, możesz postąpić zgodnie z tą odpowiedzią przez h3nrik . Korzystam z Arch, a to działa dla mnie.

Zasadniczo należy skonfigurować systemd, aby odczytał lokalizację nowego obrazu dokera jako zmienną środowiskową i przekazał tę zmienną środowiskową do skryptu wykonania demona Docker.

Dla kompletności, oto odpowiedź h3nrick:


Czy masz /lib/systemd/system/docker.serviceplik

Jeśli tak, edytować go tak, że usługa Docker używa zwykle /etc/default/dockerjako plik środowiska: EnvironmentFile=-/etc/default/docker.

W /etc/default/dockerpliku następnie dodaj DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Na koniec po prostu zrób systemctl daemon-reload && systemctl restart docker.

Aby uzyskać więcej informacji, zajrzyj również do dokumentacji .

modulitos
źródło
Jeśli postępujesz zgodnie z aktualnymi instrukcjami instalacji dokera dla Debiana, otrzymasz skrypty SysVinit, ale nie są one używane. Zobacz github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Dużo prostszym rozwiązaniem jest utworzenie miękkiego linku do dowolnego elementu, na przykład

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

Działa dla mnie na moim serwerze CentOS 6.5.

Liuyanghejerry
źródło
6
Nie twórz softlink. Powody, dla których zamieszczam mój komentarz, który publikuję wcześniej ... Możesz mieć problemy z poleceniami „docker rm”!
suther
2
@suther: May? Czy jest teraz sytuacja, w której wpadasz w kłopoty? Maj może być nieco nieprecyzyjny w dokumentacji technicznej, jeśli napotkam problem, chcę dowiedzieć się, kiedy dokładnie to się stanie, w jaki sposób ten problem jest spowodowany i jaki byłby wynik.
hakre
4

Zgodnie z zaleceniami @mbarthelemy można to zrobić za pomocą -gopcji podczas bezpośredniego uruchamiania demona dokera .

Jeśli jednak doker jest uruchamiany jako usługa systemowa, nie zaleca się modyfikowania /etc/default/dockerpliku. Jest to wskazówka znajduje się tutaj .

Prawidłowe podejście polega na utworzeniu /etc/docker/daemon.jsonpliku w systemach Linux (lub Mac) lub %programdata%\docker\config\daemon.jsonWindows. Jeśli ten plik nie jest używany do niczego innego, wystarczą następujące pola:

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

Zakłada się, że nowa lokalizacja, w której chcesz, aby doker zachował swoje dane, to /docker/daemon_files

ivandov
źródło
2

W 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"

Zauważ, że DOCKER_OPTS był początkowo pusty i wszystko, co zrobiłem, to dodanie argumentu, aby doker mógł użyć mojego nowego katalogu

Mahlatse Makalancheche
źródło
2

W Fedorze 26 i prawdopodobnie w wielu innych wersjach możesz napotkać błąd po przeniesieniu lokalizacji folderu podstawowego, jak opisano powyżej. Jest to szczególnie prawdziwe, jeśli przenosisz go gdzieś w / home. Wynika to z tego, że SeLinux uruchamia się i uniemożliwia kontenerowi dokera uruchomienie wielu swoich programów z tej lokalizacji.

Krótkim rozwiązaniem jest usunięcie opcji --enable-selinux po dodaniu parametru -g.

Euan
źródło
Czy nie byłoby to otwarte miejsce na ataki?
yuriploc
1

Na serwerze AWS Ubuntu 16.04 umieściłem obrazy Dockera na osobnym systemie EBS, zamontowanym na / home / ubuntu / kaggle /, pod katalogiem dokera

Ten fragment mojego skryptu inicjującego działał poprawnie

# 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
George Fisher
źródło
0

Użytkownicy komputerów Mac w wersji 17.06.0-ce-mac19 mogą po prostu przenieść lokalizację obrazu dysku z interfejsu użytkownika w opcji preferencji. Po prostu zmień lokalizację obrazu dysku, a on zadziała (klikając opcję Przenieś obraz dysku ) i uruchomi się ponownie doker. Dzięki takiemu podejściu mogłem wykorzystać mój zewnętrzny dysk twardy do przechowywania obrazów dokerów.

sahu
źródło
co z istniejącymi plikami dokera? czy powinniśmy to przenieść ręcznie?
gustav
Możesz spróbować ponownie zainstalować okno dokowane w wybranym przez siebie miejscu. Pliki obrazów i dokerów są niezależne.
sahu