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?
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
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:
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:
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:
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
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
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/…
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 / "
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.
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
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 .
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
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.
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
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.
Respostas:
Nas versões recentes do Docker, você definiria o valor do
data-root
parâ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
-g
opção ao iniciar o daemon do Docker. (chequedocker --help
). Você pode aplicar essa configuração automaticamente quando o Docker for iniciado, adicionando-o ao / etc / default / dockerfonte
-g
opção ao / etc / defaults / docker em vez de modificar o arquivo Upstart, veja minha resposta.DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
/etc/default/docker
arquivo.graph
atributo no daemon.json foi descontinuado a partir da v17.05.0, use emdata-root
vez disso, cf. stackoverflow.com/a/50217666/743507Seguindo 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:
Para a versão do docker antes da pasta 17.06-ce :
Para janela de encaixe após a pasta 17.06-ce :
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.json
faça o truque:Apesar do método, você precisa recarregar a configuração e reiniciar o Docker:
Para confirmar se o Docker foi reconfigurado:
Na versão recente (17.03), é necessário um comando diferente:
A saída deve ficar assim:
Ou:
Em seguida, você pode remover com segurança o armazenamento antigo do Docker:
fonte
docker info
afirmaçã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;)Docker Root Dir: /"/mnt"
quando você corredocker info|grep "Docker Root Dir"
, você tem que substituir--data-root="/mnt"
para--data-root=/mnt
dentro do arquivodocker-storage.conf
Para novas versões do docker, precisamos usar o
data-root
quegraph
está obsoleto na v17.05.0: documentos obsoletos oficiaisEdite
/etc/docker/daemon.json
(se não existir, crie) e inclua:Em seguida, reinicie o Docker com:
fonte
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:
então seria
Após uma reinicialização (
systemctl restart docker
), o Docker deve usar o novo diretóriofonte
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 / "
fonte
docker rm
ao usar um link simbólico?Ubuntu 16.04
stackoverflow.com/a/30219552/977622 para obtê-lo para o trabalhoManeira muito mais fácil de fazer isso:
Interromper o serviço de janela de encaixe
Mover o diretório docker existente para o novo local
Criar link simbólico
Iniciar serviço docker
fonte
sudo ln -s /path/to/new/docker/ /var/lib/docker
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.
Execute o comando abaixo
Execute o comando para verificar o diretório do docker
Se você tem arquivo / etc / sysconfig / docker no Red Hat ou no docker 1.7.1, verifique esta resposta.
fonte
Versão para copiar e colar da resposta vencedora :)
Crie este arquivo apenas com este conteúdo:
$ sudo vi /etc/docker/daemon.json
Testado
Ubuntu 16.04.2 LTS
na janela de encaixe1.12.6
fonte
graph
atributo no daemon.json foi descontinuado a partir da v17.05.0, use emdata-root
vez disso, cf. stackoverflow.com/a/50217666/743507No CentOS 6.5
adicione a seguinte linha
salve o arquivo e inicie o docker novamente
e fará o arquivo de repositório em
/data/docker
fonte
Para Debian / Ubuntu ou Fedora, você provavelmente pode usar as outras respostas. Mas se você não possui arquivos abaixo
/etc/default/docker
ou/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/docker
como um arquivo de ambiente:EnvironmentFile=-/etc/default/docker
.No
/etc/default/docker
arquivo, adicioneDOCKER_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 .
fonte
Uma solução muito mais simples é criar um ponto de link flexível para o que você quiser, como
Funciona para mim no meu servidor CentOS 6.5.
fonte
Conforme recomendado pelo @mbarthelemy, isso pode ser feito através da
-g
opçã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/docker
arquivo. Há uma diretriz para isso localizada aqui .A abordagem correta é criar um
/etc/docker/daemon.json
arquivo nos sistemas Linux (ou Mac) ou%programdata%\docker\config\daemon.json
no Windows. Se esse arquivo não estiver sendo usado para mais nada, os seguintes campos deverão ser suficientes:Isso pressupõe que o novo local em que você deseja que o docker persista, seus dados são
/docker/daemon_files
fonte
No openSUSE Leap 42.1
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
fonte
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.
fonte
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
fonte
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.
fonte