Como alterar o diretório de instalação da imagem do docker?

183

Pelo que sei, as imagens do docker são instaladas /var/lib/dockerquando são puxadas. Existe uma maneira de alterar esse local, como um volume montado como /mnt?

Michael Barton
fonte
3
Em qual sistema operacional sua janela de encaixe está sendo executada?
Thomasleveil

Respostas:

135

Nas versões recentes do Docker, você definiria o valor do data-rootparâmetro como seu caminho personalizado, em /etc/docker/daemon.json (de acordo com https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Nas versões anteriores, é possível alterar o diretório base de armazenamento do Docker (para onde vão o contêiner e as imagens) usando a -gopção ao iniciar o daemon do Docker. (cheque docker --help). Você pode aplicar essa configuração automaticamente quando o Docker for iniciado, adicionando-o ao / etc / default / docker

mbarthelemy
fonte
4
Eu acho que a melhor solução é adicionar essa -gopção ao / etc / defaults / docker em vez de modificar o arquivo Upstart, veja minha resposta.
mbarthelemy
9
Sim, altere esta linha paraDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Não funciona no Fedora. Veja minha resposta se sua distribuição for o Fedora
Vitor
3
Pode ser necessário implementar esta solução para um bug em algumas versões do Debian ou Ubuntu se o docker ignorar seu /etc/default/dockerarquivo.
Nedim
4
O graphatributo no daemon.json foi descontinuado a partir da v17.05.0, use em data-rootvez disso, cf. stackoverflow.com/a/50217666/743507
dschulten
141

Seguindo os conselhos dos comentários, utilizo a documentação do Docker systemd para melhorar esta resposta. O procedimento abaixo não requer reinicialização e é muito mais limpo.

Primeiro, crie diretório e arquivo para configuração personalizada:

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

Para a versão do docker antes da pasta 17.06-ce :

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

Para janela de encaixe após a pasta 17.06-ce :

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

Método alternativo através daemon.json

Eu tentei recentemente o procedimento acima com 17.09-ce no Fedora 25 e parece não funcionar. Em vez dessa simples modificação, /etc/docker/daemon.jsonfaça o truque:

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

Apesar do método, você precisa recarregar a configuração e reiniciar o Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Para confirmar se o Docker foi reconfigurado:

docker info|grep "loop file"

Na versão recente (17.03), é necessário um comando diferente:

docker info|grep "Docker Root Dir"

A saída deve ficar assim:

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

Ou:

 Docker Root Dir: /mnt

Em seguida, você pode remover com segurança o armazenamento antigo do Docker:

rm -rf /var/lib/docker
Piotr Król
fonte
8
É o único método que me ajudou no Ubuntu 16.04!
Vadim
1
Este link docs.docker.com/engine/admin/systemd explica como configurar o Docker com o systemd, que funciona para uma distribuição linux mais recente, como o Ubuntu 16.04.
Joseph Hui
6
A docker infoafirmação provavelmente está desatualizada. No Ubuntu 16.04, a verificação para reconfigurado é sudo docker info | grep "Docker Root Dir". Caso contrário, boa resposta, deve ser o único aceito;)
Guillaume Perrot
5
Na nova versão do Linux (4.10) e Docker (docker-ce 17.06), a linha deve ser alterada da seguinte maneira: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Se você ver Docker Root Dir: /"/mnt"quando você corre docker info|grep "Docker Root Dir", você tem que substituir --data-root="/mnt"para --data-root=/mntdentro do arquivodocker-storage.conf
Ser
62

Para novas versões do docker, precisamos usar o data-rootque graphestá obsoleto na v17.05.0: documentos obsoletos oficiais

Edite /etc/docker/daemon.json(se não existir, crie) e inclua:

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

Em seguida, reinicie o Docker com:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Uma explicação passo a passo mais detalhada (incluindo a movimentação de dados) usando o Docker Storage com raiz de dados pode ser encontrada em: Postagem em blog
  • No caso do Windows, um post semelhante específico do Windows
andreas-supersmart
fonte
seu comentário me ajudou a encontrar esta página: adriel.co.nz/blog/2018/01/25/… thanks!
Nasatome
8
Acho que é hora de dar a essa resposta a sinalização "aceito", porque está funcionando na versão atual.
The Bndr
Eu comento aqui para informar às pessoas qual versão poderia usar isso, após o lançamento do github.com/docker/docker.github.io/pull/5978 , ele muda o site oficial.
zhongjiajie
Isso funcionou para mim também, obrigado :)
Aashay Amballi
39

Como não encontrei as instruções corretas para fazer isso no Fedora (EDIT: as pessoas apontaram nos comentários que isso também deve funcionar no CentOS e no Suse) (/ etc / default / docker não é usado lá), estou adicionando meu responda aqui:

Você precisa editar o arquivo / etc / sysconfig / docker e adicionar a opção -g na variável OPTIONS. Se houver mais de uma opção, coloque-as em "". No meu caso, esse arquivo continha:

OPTIONS=--selinux-enabled

então seria

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

Após uma reinicialização ( systemctl restart docker), o Docker deve usar o novo diretório

Vitor
fonte
No CentOS 6.5 / 6.6 e provavelmente 7, você usa o mesmo arquivo / etc / sysconfig / docker, mas adiciona os argumentos ao nome da variável other_args.
dlaidlaw
A opção é chamada DOCKER_OPTS agora (docker versão 1.7.0).
Nedim
6
A partir da versão 1.8 do Docker, o uso dos arquivos de configuração do Docker em / etc / sysconfig está obsoleto. Em vez disso, você deve usar os arquivos de configuração do systemd em etc / systemd / system / docker.service.d. Após adicionar ou modificar um arquivo drop-in enquanto o serviço docker estiver em execução, execute o comando systemctl daemon-reload para informar ao systemd para recarregar a configuração do serviço. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia
e use os arquivos drop-in docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia
23

Não use um link simbólico para mover a pasta docker para / mnt (por exemplo). Isso pode causar problemas no comando docker rm .

Melhor usar a opção -g para janela de encaixe. No Ubuntu, você pode configurá-lo permanentemente em /etc/default/docker.io. Aprimore ou substitua a linha DOCKER_OPTS.

Aqui está um exemplo: `DOCKER_OPTS =" - g / mnt / em algum lugar / else / docker / "

suther
fonte
No meu caso eu tive que reiniciar
psychok7
1
Com que tipo de problemas eu devo esperar docker rmao usar um link simbólico?
bjhend
1
Eu também tive que fazer isso em Ubuntu 16.04 stackoverflow.com/a/30219552/977622 para obtê-lo para o trabalho
psychok7
21

Maneira muito mais fácil de fazer isso:

Interromper o serviço de janela de encaixe

sudo systemctl stop docker

Mover o diretório docker existente para o novo local

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

Criar link simbólico

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

Iniciar serviço docker

sudo systemctl start docker
fnjn
fonte
2
Esta é a IMO, a solução certa e mais direta - funcionou para mim.
Martin Dvorak
2
funcionou como um encanto para mim, mas sem a barra final para o comando de link simbólico:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio 7/19
Isto é o que os fóruns docker sugerem: forums.docker.com/t/...
headdab
Esta é uma solução incrível que salvou minha vida. :)
Niketh Sudhakaran
Eu executei acima e a janela de encaixe estava funcionando. Mas não consigo encontrar minhas imagens de janela de encaixe já existentes. Alguma sugestão?
Thilina Viraj
13

Esta solução funciona no Red Hat 7.2 & Docker 1.12.0

Edite o arquivo /lib/systemd/system/docker.service no seu editor de texto.

adicione -g / path / to / docker / no final da diretiva ExecStart . A linha completa deve ficar assim.

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

Execute o comando abaixo

systemctl daemon-reload
systemctl restart docker

Execute o comando para verificar o diretório do docker

docker info | grep "loop file\|Dir"

Se você tem arquivo / etc / sysconfig / docker no Red Hat ou no docker 1.7.1, verifique esta resposta.

Sudeepta
fonte
meu caso: centos7, docker mais recente; Eu tive que chamar "systemctl status docker" para encontrar o arquivo "docker.service" e adicionei a opção "-g" como na resposta. Obrigado
datdinhquoc
13

Versão para copiar e colar da resposta vencedora :)

Crie este arquivo apenas com este conteúdo:

$ sudo vi /etc/docker/daemon.json

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

Testado Ubuntu 16.04.2 LTSna janela de encaixe1.12.6

Topera
fonte
1
O graphatributo no daemon.json foi descontinuado a partir da v17.05.0, use em data-rootvez disso, cf. stackoverflow.com/a/50217666/743507
dschulten
12

No CentOS 6.5

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

adicione a seguinte linha

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

salve o arquivo e inicie o docker novamente

service docker start

e fará o arquivo de repositório em /data/docker

sean kim
fonte
6

Para Debian / Ubuntu ou Fedora, você provavelmente pode usar as outras respostas. Mas se você não possui arquivos abaixo /etc/default/dockerou /etc/sysconfig/docker, e seu sistema está executando o systemd, siga esta resposta pelo h3nrik . Estou usando o Arch, e isso funciona para mim.

Basicamente, você precisa configurar o systemd para ler o novo local da imagem do docker como uma variável de ambiente e passar essa variável de ambiente para o script de execução do daemon do Docker.

Para completar, aqui está a resposta de h3nrick:


Você tem um /lib/systemd/system/docker.service arquivo?

Nesse caso, edite-o para que o serviço Docker use o habitual /etc/default/dockercomo um arquivo de ambiente:EnvironmentFile=-/etc/default/docker .

No /etc/default/dockerarquivo, adicione DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

No final, basta fazer um systemctl daemon-reload && systemctl restart docker.

Para mais informações, consulte também a documentação .

modulitos
fonte
Se você seguir as instruções atuais de instalação do docker para o Debian, obterá scripts SysVinit, mas eles não serão usados. Veja github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Uma solução muito mais simples é criar um ponto de link flexível para o que você quiser, como

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

Funciona para mim no meu servidor CentOS 6.5.

liuyanghejerry
fonte
6
Não crie um softlink. Razões para ver meu comentário publicado antes ... Você pode ter problemas com os comandos 'docker rm'!
Suther
2
@ Suther: maio? Agora, há uma situação em que você encontra problemas ou não? Maio é um pouco impreciso para a documentação técnica; se eu encontrar um problema, quero saber quando exatamente isso acontece, como esse problema é causado e como seria o resultado.
hakre 29/07
4

Conforme recomendado pelo @mbarthelemy, isso pode ser feito através da -gopção ao iniciar o daemon do docker diretamente.

No entanto, se a janela de encaixe estiver sendo iniciada como um serviço do sistema, não é recomendável modificar o /etc/default/dockerarquivo. Há uma diretriz para isso localizada aqui .

A abordagem correta é criar um /etc/docker/daemon.jsonarquivo nos sistemas Linux (ou Mac) ou %programdata%\docker\config\daemon.jsonno Windows. Se esse arquivo não estiver sendo usado para mais nada, os seguintes campos deverão ser suficientes:

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

Isso pressupõe que o novo local em que você deseja que o docker persista, seus dados são /docker/daemon_files

ivandov
fonte
2

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

Observe que DOCKER_OPTS estava inicialmente vazio e tudo o que fiz foi adicionar o argumento para fazer o docker usar meu novo diretório

Mahlatse Makalancheche
fonte
2

No Fedora 26 e provavelmente em muitas outras versões, você pode encontrar um erro após mover o local da pasta base, conforme descrito acima. Isso é particularmente verdadeiro se você o estiver movendo para algum lugar em / home. Isso ocorre porque o SeLinux entra em ação e impede que o contêiner do docker execute muitos de seus programas nesse local.

A solução curta é remover a opção --enable-selinux quando você adiciona o parâmetro -g.

Euan
fonte
Isso não abriria espaço para ataques?
Yuriploc 24/04/19
1

Em um servidor AWS Ubuntu 16.04, coloquei as imagens do Docker em um EBS separado, montado em / home / ubuntu / kaggle /, sob o diretório do docker

Este trecho do meu script de inicialização funcionou corretamente

# 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
fonte
0

Para usuários de Mac na versão 17.06.0-ce-mac19, você pode simplesmente mover o local da Imagem do Disco da interface do usuário na opção de preferências Basta alterar o local da imagem do disco e ela funcionará (clicando em Mover imagem de disco ) e reiniciando a janela de encaixe. Usando essa abordagem, pude usar meu disco rígido externo para armazenar imagens do docker.

sahu
fonte
e os arquivos existentes do docker? devemos movê-lo manualmente?
gustav
Você pode tentar reinstalar a janela de encaixe em um local de sua preferência. Os arquivos de imagem e janela de encaixe são independentes.
sahu 24/03