Docker görüntü kurulum dizini nasıl değiştirilir?


183

Söyleyebileceğim kadarıyla, docker görüntüleri /var/lib/dockerçekildikçe kurulur . Bu yeri değiştirmenin bir yolu var mı /mnt?


3
liman işçiniz hangi işletim sistemi üzerinde çalışıyor?
Haziran'da Thomasleveil

Yanıtlar:


135

Docker'ın son sürümlerinde, data-rootparametrenin değerini özel yolunuza /etc/docker/daemon.json göre ayarlarsınız ( https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file adresine göre ).

Daha eski sürümlerde, -gDocker arka plan programı başlatılırken seçeneği kullanarak Docker'ın depolama temel dizinini (kapsayıcı ve görüntülerin gittiği yer) değiştirebilirsiniz . (kontrol edin docker --help). Docker başladığında / etc / default / docker'a ekleyerek bu ayarın otomatik olarak uygulanmasını sağlayabilirsiniz.


4
Bence en iyi çözüm bu -gseçeneği Upstart dosyasını değiştirmek yerine / etc / defaults / docker'a eklemektir .
mbarthelemy

9
Evet, bu satırı değiştirinDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy

6
Fedora'da çalışmıyor. Dağıtımınız Fedora
Vitor ise

3
Docker dosyanızı yoksayarsa, bu çözümü Debian veya Ubuntu'nun bazı sürümlerinde bir hataya uygulamanız gerekebilir /etc/default/docker.
nedim

4
graphDaemon.json öznitelik v17.05.0 itibariyle önerilmemektedir kullanımı data-root, bakınız, bunun yerine stackoverflow.com/a/50217666/743507
dschulten

141

Yorumlardan tavsiye alındıktan sonra bu yanıtı geliştirmek için Docker systemd belgelerini kullanıyorum. Aşağıdaki prosedür yeniden başlatma gerektirmez ve çok daha temizdir.

Öncelikle özel yapılandırma için dizin ve dosya oluşturun:

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

17.06-ce macundan önceki liman işçisi sürümü için :

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

17.06-ce hamurdan sonra liman işçisi için :

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

Alternatif yöntem daemon.json

Geçenlerde Fedora 25 üzerinde 17.09-ce ile yukarıdaki prosedürü denedim ve çalışmıyor gibi görünüyor. Bu basit değişiklik yerine /etc/docker/daemon.jsonhile yapın:

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

Yönteme rağmen yapılandırmayı yeniden yüklemeniz ve Docker'ı yeniden başlatmanız gerekir:

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker'ın yeniden yapılandırıldığını onaylamak için:

docker info|grep "loop file"

Son sürümde (17.03) farklı komutlar gereklidir:

docker info|grep "Docker Root Dir"

Çıktı şöyle görünmelidir:

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

Veya:

 Docker Root Dir: /mnt

Ardından eski Docker depolama alanını güvenle kaldırabilirsiniz:

rm -rf /var/lib/docker

8
Ubuntu 16.04'te bana yardımcı olan tek yöntem!
Vadim

1
Bu bağlantı docs.docker.com/engine/admin/systemd , Docker'ın Ubuntu 16.04 gibi daha yeni linux dağıtımı için çalışan systemd ile nasıl yapılandırılacağını açıklar.
Joseph Hui

6
docker infoİfadesi muhtemelen eski. Ubuntu 16.04'te yeniden yapılandırılmış olup olmadığı kontrol edilir sudo docker info | grep "Docker Root Dir". Aksi takdirde, iyi bir cevap kabul edilmelidir;)
Guillaume Perrot

5
Linux (4.10) ve Docker'ın (docker-ce 17.06) yeni sürümünde satır aşağıdaki gibi değiştirilmelidir: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini

2
Eğer görürseniz Docker Root Dir: /"/mnt"size çalıştırdığında docker info|grep "Docker Root Dir", değiştirmek zorunda --data-root="/mnt"içine --data-root=/mntdosyası içindedocker-storage.conf
Ser

62

Yeni docker sürümleri için v17.05.0'da onaylandığı data-rootgibi kullanmamız gerekiyor graph: resmi kullanımdan kaldırılmış dokümanlar

Düzenleyin /etc/docker/daemon.json(yoksa, oluşturun) ve şunları ekleyin:

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

Ardından Docker'ı aşağıdakilerle yeniden başlatın:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Veri köküne sahip Docker Storage'ı kullanarak daha ayrıntılı bir adım adım açıklama (veri taşıma dahil) şu adreste bulunabilir: Blog yayını
  • Windows'un benzer sonrası durumunda Windows'a özel

yorumunuz bu sayfayı bulmama yardımcı oldu: adriel.co.nz/blog/2018/01/25/… teşekkürler!
nasatome

8
Sanırım bu cevaba "kabul edilmiş" bayrağı vermenin zamanı geldi, çünkü mevcut versiyonda çalışıyor.
The Bndr

Burada, github.com/docker/docker.github.io/pull/5978 yayınlandıktan sonra, hangi sürümün bunu kullanabileceğini bildirmek için yorum yapıyorum , Officail web sitesini değiştirir.
zhongjiajie

Bu benim için de çalıştı, teşekkür ederim :)
Aashay Amballi

39

Fedora'da bunu yapmak için doğru talimatları bulamadığım için (EDIT: insanlar bunun CentOS ve Suse üzerinde de çalışması gerektiğini belirtti) (/ etc / default / docker orada kullanılmıyor), buraya cevap ver:

/ Etc / sysconfig / docker öğesini düzenlemeniz ve OPTIONS değişkenine -g seçeneğini eklemeniz gerekir. Birden fazla seçenek varsa, bunları "" içine aldığınızdan emin olun. Benim durumumda, bu dosya şunları içeriyordu:

OPTIONS=--selinux-enabled

böylece olur

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

Bir restart ( systemctl restart docker) işleminden sonra Docker yeni dizini kullanmalıdır


CentOS 6.5 / 6.6 ve muhtemelen 7'de, aynı / etc / sysconfig / docker dosyasını kullanırsınız, ancak argümanları other_args değişken adına eklersiniz.
dlaidlaw

Seçenek şimdi DOCKER_OPTS olarak adlandırılıyor (liman işçisi sürüm 1.7.0).
nedim

6
Docker'ın 1.8 sürümünden itibaren, / etc / sysconfig içindeki Docker yapılandırma dosyalarını kullanmak onaylanmamıştır. Bunun yerine etc / systemd / system / docker.service.d içindeki systemd açılır yapılandırma dosyalarını kullanmalısınız. Docker hizmeti çalışırken bir bırakma dosyası ekledikten veya değiştirdikten sonra, systemd'ye hizmet yapılandırmasını yeniden yüklemesini bildirmek için systemctl daemon-reload komutunu çalıştırın. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia


23

Docker klasörünü / mnt'ye taşımak için sembolik bir Bağlantı kullanmayın (örneğin). Bu, docker rm komutunda soruna neden olabilir .

Docker için -g Seçeneğini kullanın. Ubuntu'da kalıcı olarak /etc/default/docker.io içinde ayarlayabilirsiniz. DOCKER_OPTS Hattını geliştirin veya değiştirin.

İşte bir örnek: `DOCKER_OPTS =" - g / mnt / bir yerde / else / docker / "


benim durumumda ben yeniden başlatmak zorunda
psychok7

1
docker rmBir sembolik bağlantısı kullanırken ne tür bir sorun beklemeliyim ?
bjhend

1
Ben de işe almak için Ubuntu 16.04 stackoverflow.com/a/30219552/977622 yapmak zorunda
psychok7

21

Bunu yapmanın çok daha kolay yolu:

Liman hizmetini durdur

sudo systemctl stop docker

Mevcut docker dizinini yeni bir konuma taşıyın

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

Sembolik bağlantı oluştur

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

Liman hizmetini başlat

sudo systemctl start docker

2
Bu IMO doğru ve en basit çözüm - benim için çalıştı.
Martin Dvorak

2
benim için bir cazibe gibi çalıştı ama sembolik bağlantı komutu için eğik çizgi olmadan:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio


Bu hayatımı kurtaran harika bir çözüm. :)
Niketh Sudhakaran

Yukarıda idam ettim ve liman işçisi çalışmaya başladı. Ancak docker görüntülerimin zaten mevcut olduğunu bulamıyorum. Baska öneri?
Thilina Viraj

13

Bu çözüm Red Hat 7.2 ve Docker 1.12.0 üzerinde çalışır

/Lib/systemd/system/docker.service dosyasını düzenleyinMetin düzenleyicinizde düzenleyin.

eklemek -g / bir / yer / liman işçisi / sonunda ExecStart direktifi. Tüm çizgi böyle görünmelidir.

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

Aşağıdaki komutu yürütün

systemctl daemon-reload
systemctl restart docker

Liman işçisi dizinini kontrol etmek için komutu yürütün

docker info | grep "loop file\|Dir"

Eğer varsa / etc / sysconfig / liman işçisi Red Hat dosya veya liman işçisi 1.7.1 onay bu cevap.


benim durumum: centos7, son liman işçisi; i "docker.service" dosyasını bulmak için "systemctl status docker" çağırmak zorunda kaldı ve cevap gibi "-g" seçeneği ekledi. Teşekkürler
datdinhquoc

13

Kazanan cevabın kopyala-yapıştır versiyonu :)

Bu dosyayı yalnızca şu içerikle oluşturun:

$ sudo vi /etc/docker/daemon.json

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

Üzerinde test Ubuntu 16.04.2 LTSdocker içinde1.12.6


1
graphDaemon.json öznitelik v17.05.0 itibariyle önerilmemektedir kullanımı data-root, bakınız, bunun yerine stackoverflow.com/a/50217666/743507
dschulten

12

CentOS 6.5 içinde

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

takip eden satır ekle

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

sonra dosyayı kaydedin ve bağlantı istasyonunu yeniden başlatın

service docker start

ve depo dosyasını /data/docker


6

Debian / Ubuntu veya Fedora için muhtemelen diğer cevapları kullanabilirsiniz. Ancak /etc/default/dockerveya altında dosyalarınız yoksa /etc/sysconfig/dockerve sisteminiz systemd çalıştırıyorsa, h3nrik tarafından bu yanıtı takip etmek isteyebilirsiniz . Arch kullanıyorum ve bu benim için çalışıyor.

Temel olarak, systemd'yi yeni docker görüntü konumunu bir ortam değişkeni olarak okuyacak şekilde yapılandırmanız ve bu ortam değişkenini Docker arka plan programı yürütme komut dosyasına geçirmeniz gerekir.

Tamlık için, h3nrick'in cevabı:


Eğer bir var mı /lib/systemd/system/docker.servicedosyası?

Öyleyse, Docker hizmetinin normal /etc/default/dockerdosyayı bir ortam dosyası olarak kullanması için düzenleyin:EnvironmentFile=-/etc/default/docker .

Gelen /etc/default/dockerdosyanın sonra ekleyin DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Sonunda sadece bir systemctl daemon-reload && systemctl restart docker.

Daha fazla bilgi için lütfen belgelere de bakınız .


Debian için geçerli docker kurulum talimatlarını izlerseniz, SysVinit komut dosyaları alırsınız, ancak bunlar kullanılmaz. Bkz. Github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside

4

Çok daha basit bir çözüm, istediğiniz gibi yumuşak bir bağlantı noktası oluşturmaktır.

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

Benim için CentOS 6.5 sunucumda çalışıyor.


6
Yazılım bağlantısı oluşturmayın. Sebeplerimi daha önce yayınladığımı görüyorum ... 'docker rm' komutlarıyla sorun yaşayabilirsiniz!
Suther

2
@suther: Mayıs? Şimdi başınız belada mı, değil mi? Mayıs, teknik dokümantasyon için biraz kesin değil, eğer bir sorunla karşılaşırsam, tam olarak ne zaman olduğunu, sorunun nasıl ortaya çıktığını ve sonucun nasıl olacağını öğrenmek istiyorum.
hakre

4

@Mbarthelemy tarafından önerildiği gibi bu -g, docker arka plan programı doğrudan başlatılırken seçenek üzerinden yapılabilir .

Ancak, docker bir sistem hizmeti olarak başlatılırsa, /etc/default/dockerdosyanın değiştirilmesi önerilmez . Burada bulunan bir kılavuz var .

Doğru yaklaşım /etc/docker/daemon.jsonLinux (veya Mac) sistemlerinde veya %programdata%\docker\config\daemon.jsonWindows'da bir dosya oluşturmaktır . Bu dosya başka bir şey için kullanılmıyorsa, aşağıdaki alanlar yeterli olmalıdır:

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

Bu, liman işçisinin verilerinin ısrar etmesini istediğiniz yeni konumun /docker/daemon_files


2

OpenSUSE Sıçraması 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'un başlangıçta boş olduğunu ve yaptığım tek şeyin docker'ın yeni dizinimi kullanmasını sağlamak için argümana eklendiğini unutmayın


2

Fedora 26 ve muhtemelen diğer birçok sürümde, temel klasör konumunuzu yukarıda açıklandığı gibi taşıdıktan sonra bir hatayla karşılaşabilirsiniz. Bu, özellikle / home altında bir yere taşıyorsanız doğrudur. Bunun nedeni SeLinux'un devreye girmesi ve docker konteynerinin birçok programının bu konumdan çalışmasını engellemesidir.

Kısa çözüm, -g parametresini eklediğinizde --enable-selinux seçeneğini kaldırmaktır.


Saldırılara açık yer olmaz mı?
yuriploc

1

AWS Ubuntu 16.04 Sunucusunda Docker görüntülerini docker dizininin altına / home / ubuntu / kaggle / üzerine monte edilmiş ayrı bir EBS'ye yerleştirdim

Başlatma komut dosyamın bu snippet'i düzgün çalıştı

# 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 sürümünde Mac kullanıcıları için sadece sadece disk görüntüsü konumunu değiştirmek tercihleri seçeneğindeki kullanıcı arayüzünden Disk Image konumuna taşımak olabilir ve (tıklayarak çalışacak Taşı Disk Image ve yeniden başlatmayı) liman işçisi. Bu yaklaşımı kullanarak liman işçisi görüntülerini saklamak için harici sabit diskimi kullanabildim.


docker'ın mevcut dosyaları nasıl? manuel olarak hareket ettirmeli miyiz?
gustav

Bağlantı istasyonunu tercih ettiğiniz bir konuma yeniden yüklemeyi deneyebilirsiniz. Görüntü ve docker dosyaları bağımsızdır.
sahu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.