Z tego, co mogę powiedzieć, obrazy dokerów są instalowane w /var/lib/docker
miarę ich pobierania. Czy istnieje sposób na zmianę tej lokalizacji, na przykład na zamontowany wolumin /mnt
?
Z tego, co mogę powiedzieć, obrazy dokerów są instalowane w /var/lib/docker
miarę ich pobierania. Czy istnieje sposób na zmianę tej lokalizacji, na przykład na zamontowany wolumin /mnt
?
Odpowiedzi:
W najnowszych wersjach Dockera ustawisz wartość data-root
parametru 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 -g
opcji podczas uruchamiania demona Docker. (sprawdź docker --help
). Możesz ustawić to ustawienie automatycznie, gdy Docker rozpocznie pracę, dodając je do / etc / default / docker
-g
opcji do / etc / defaults / docker zamiast modyfikowania pliku Upstart, zobacz moją odpowiedź.
DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
/etc/default/docker
plik.
graph
Atrybut w daemon.json jest przestarzała od v17.05.0, użyj data-root
zamiast, cf. stackoverflow.com/a/50217666/743507
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"
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.json
wykonaj 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
docker info
Stwierdzenie 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;)
Docker Root Dir: /"/mnt"
kiedy uruchamiasz docker info|grep "Docker Root Dir"
, musisz zamienić --data-root="/mnt"
na --data-root=/mnt
wewnątrz plikudocker-storage.conf
W przypadku nowych wersji dokera musimy użyć tego, data-root
co graph
jest 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
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
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 / "
docker rm
podczas korzystania z dowiązania symbolicznego?
Ubuntu 16.04
stackoverflow.com/a/30219552/977622, aby to zadziałało
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
sudo ln -s /path/to/new/docker/ /var/lib/docker
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ź tę odpowiedź.
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 LTS
w oknie dokowanym1.12.6
graph
Atrybut w daemon.json jest przestarzała od v17.05.0, użyj data-root
zamiast, cf. stackoverflow.com/a/50217666/743507
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
W przypadku Debiana / Ubuntu lub Fedory prawdopodobnie możesz użyć innych odpowiedzi. Ale jeśli nie masz plików pod /etc/default/docker
lub /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.service
plik
Jeśli tak, edytować go tak, że usługa Docker używa zwykle /etc/default/docker
jako plik środowiska: EnvironmentFile=-/etc/default/docker
.
W /etc/default/docker
pliku 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 .
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.
Zgodnie z zaleceniami @mbarthelemy można to zrobić za pomocą -g
opcji podczas bezpośredniego uruchamiania demona dokera .
Jeśli jednak doker jest uruchamiany jako usługa systemowa, nie zaleca się modyfikowania /etc/default/docker
pliku. Jest to wskazówka znajduje się tutaj .
Prawidłowe podejście polega na utworzeniu /etc/docker/daemon.json
pliku w systemach Linux (lub Mac) lub %programdata%\docker\config\daemon.json
Windows. 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
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
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.
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
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.