¿Cómo cambiar el directorio de instalación de la imagen del acoplador?

183

Por lo que puedo decir, las imágenes de la ventana acoplable se instalan a /var/lib/dockermedida que se extraen. ¿Hay alguna manera de cambiar esta ubicación, como un volumen montado como /mnt?

Michael Barton
fuente
3
¿en qué sistema operativo se está ejecutando su docker?
Thomasleveil

Respuestas:

135

Con versiones recientes de Docker, establecería el valor del data-rootparámetro en su ruta personalizada, en /etc/docker/daemon.json (de acuerdo con https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Con versiones anteriores, puede cambiar el directorio base de almacenamiento de Docker (donde van el contenedor y las imágenes) utilizando la -gopción al iniciar el demonio Docker. (consultar docker --help) Puede hacer que esta configuración se aplique automáticamente cuando Docker se inicia al agregarla a / etc / default / docker

mbarthelemy
fuente
44
Creo que la mejor solución es agregar esta -gopción a / etc / defaults / docker en lugar de modificar el archivo Upstart, vea mi respuesta.
mbarthelemy
9
Sí, cambie esta línea aDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
66
No funciona en Fedora. Vea mi respuesta si su distribución es Fedora
Vitor
3
Es posible que deba implementar esta solución a un error en algunas versiones de Debian o Ubuntu si Docker ignora su /etc/default/dockerarchivo.
nedim
44
El graphatributo en daemon.json está en desuso a partir de v17.05.0, use data-rooten su lugar, cf. stackoverflow.com/a/50217666/743507
dschulten
141

Siguiendo los consejos de los comentarios, utilizo la documentación de Docker systemd para mejorar esta respuesta. El siguiente procedimiento no requiere reiniciar y es mucho más limpio.

Primero cree el directorio y el archivo para la configuración personalizada:

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

Para la versión acoplable anterior a la pasta 17.06-ce :

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

Para la ventana acoplable después de la pasta de 17.06 ce :

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

Método alternativo a través de daemon.json

Recientemente probé el procedimiento anterior con 17.09-ce en Fedora 25 y parece que no funciona. En lugar de esa simple modificación en /etc/docker/daemon.jsonhacer el truco:

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

A pesar del método, debe volver a cargar la configuración y reiniciar Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Para confirmar que Docker se reconfiguró:

docker info|grep "loop file"

En la versión reciente (17.03) se requiere un comando diferente:

docker info|grep "Docker Root Dir"

La salida debería verse así:

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

O:

 Docker Root Dir: /mnt

Luego, puede eliminar de forma segura el antiguo almacenamiento de Docker:

rm -rf /var/lib/docker
Piotr Król
fuente
8
¡Es el único método que me ayudó en Ubuntu 16.04!
Vadim
1
Este enlace docs.docker.com/engine/admin/systemd explica cómo configurar Docker con systemd, que funciona para la distribución de Linux más reciente, como Ubuntu 16.04.
Joseph Hui
66
La docker infodeclaración probablemente esté desactualizada. En Ubuntu 16.04, la verificación para reconfigurado es sudo docker info | grep "Docker Root Dir". De lo contrario, buena respuesta, debería ser la aceptada;)
Guillaume Perrot
55
En la nueva versión de Linux (4.10) y Docker (docker-ce 17.06) la línea se debe cambiar de la siguiente manera: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Si usted ve Docker Root Dir: /"/mnt"cuando se ejecuta docker info|grep "Docker Root Dir", usted tiene que reemplazar --data-root="/mnt"en --data-root=/mntel interior del archivodocker-storage.conf
Ser
62

Para las nuevas versiones de Docker, debemos usar data-rootcomo graphestá en desuso en v17.05.0: documentos oficiales en desuso

Edite /etc/docker/daemon.json(si no existe, créelo) e incluya:

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

Luego reinicie Docker con:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Puede encontrar una explicación paso a paso más detallada (incluidos los datos en movimiento) usando Docker Storage con raíz de datos en: Publicación de blog
  • En el caso de Windows, una publicación similar específica de Windows
andreas-supersmart
fuente
su comentario me ayudó a encontrar esta página: adriel.co.nz/blog/2018/01/25/… ¡gracias!
nasatome
8
Creo que es hora de dar a esta respuesta la bandera "aceptada", porque está funcionando en la versión actual.
The Bndr
Comento aquí para que la gente sepa qué versión podría usar esto, después del lanzamiento de github.com/docker/docker.github.io/pull/5978 , Cambia el sitio web oficial.
zhongjiajie
Esto también funcionó para mí, gracias :)
Aashay Amballi
39

Como no he encontrado las instrucciones correctas para hacer esto en Fedora (EDITAR: la gente señaló en los comentarios que esto también debería funcionar en CentOS y Suse) (/ etc / default / docker no se usa allí), estoy agregando mi responde aquí:

Debe editar / etc / sysconfig / docker y agregar la opción -g en la variable OPTIONS. Si hay más de una opción, asegúrese de encerrarlas en "". En mi caso, ese archivo contenía:

OPTIONS=--selinux-enabled

entonces se convertiría

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

Después de un reinicio ( systemctl restart docker), Docker debería usar el nuevo directorio

Vitor
fuente
En CentOS 6.5 / 6.6 y probablemente 7, usa el mismo archivo / etc / sysconfig / docker, pero agrega los argumentos al nombre de la variable other_args.
dlaidlaw
La opción se llama DOCKER_OPTS ahora (docker versión 1.7.0).
nedim
66
Desde la versión 1.8 de Docker en adelante, el uso de los archivos de configuración de Docker en / etc / sysconfig está en desuso. En su lugar, debe usar los archivos de configuración desplegables systemd en etc / systemd / system / docker.service.d. Después de agregar o modificar un archivo desplegable mientras se ejecuta el servicio Docker, ejecute el comando systemctl daemon-reload para indicarle a systemd que vuelva a cargar la configuración del servicio. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia el
y use archivos desplegables docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia el
23

No utilice un enlace simbólico para mover la carpeta acoplable a / mnt (por ejemplo). Esto puede causar problemas con el comando docker rm .

Mejor use la opción -g para docker. En Ubuntu puedes configurarlo permanentemente en /etc/default/docker.io. Mejore o reemplace la línea DOCKER_OPTS.

Aquí un ejemplo: `DOCKER_OPTS =" - g / mnt / somewhere / else / docker / "

suther
fuente
en mi caso tuve que reiniciar
psychok7
1
¿Qué tipo de problemas tengo que esperar docker rmal usar un enlace simbólico?
bjhend
1
También tuve que hacer esto en Ubuntu 16.04 stackoverflow.com/a/30219552/977622 para que funcione
psychok7
21

Una forma mucho más fácil de hacerlo:

Detener el servicio de acoplador

sudo systemctl stop docker

Mover el directorio de acopladores existente a una nueva ubicación

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

Crear enlace simbólico

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

Iniciar el servicio de acoplador

sudo systemctl start docker
fnjn
fuente
2
Esta es la OMI, la solución correcta y más directa, funcionó para mí.
Martin Dvorak el
2
funcionó como un encanto para mí, pero sin la barra inclinada final para el comando de enlace simbólico:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio
Esto es lo que sugieren los foros de Docker
headdab
Esta es una solución increíble que me salvó la vida. :)
Niketh Sudhakaran
Ejecuté arriba y el docker estaba funcionando. Pero no puedo encontrar que mis imágenes acopladas ya existan. ¿Alguna sugerencia?
Thilina Viraj
13

Esta solución funciona en Red Hat 7.2 y Docker 1.12.0

Edite el archivo /lib/systemd/system/docker.service en su editor de texto.

agregue -g / ruta / a / docker / al final de la directiva ExecStart . La línea completa debería verse así.

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

Ejecute el siguiente comando

systemctl daemon-reload
systemctl restart docker

Ejecute el comando para verificar el directorio acoplable

docker info | grep "loop file\|Dir"

Si tiene el archivo / etc / sysconfig / docker en Red Hat o docker 1.7.1, verifique esta respuesta.

Sudeepta
fuente
mi caso: centos7, último docker; Tuve que llamar a "systemctl status docker" para encontrar el archivo "docker.service" y agregué la opción "-g" como en la respuesta. Gracias
datdinhquoc
13

Copie y pegue la versión de la respuesta ganadora :)

Cree este archivo solo con este contenido:

$ sudo vi /etc/docker/daemon.json

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

Probado Ubuntu 16.04.2 LTSen Docker1.12.6

Topera
fuente
1
El graphatributo en daemon.json está en desuso a partir de v17.05.0, use data-rooten su lugar, cf. stackoverflow.com/a/50217666/743507
dschulten
12

En CentOS 6.5

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

agregue la siguiente línea

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

luego guarde el archivo y vuelva a iniciar la ventana acoplable

service docker start

y hará un archivo de repositorio en /data/docker

Sean Kim
fuente
6

Para Debian / Ubuntu o Fedora, probablemente pueda usar las otras respuestas. Pero si no tiene archivos debajo de /etc/default/dockero /etc/sysconfig/docker, y su sistema está ejecutando systemd, es posible que desee seguir esta respuesta con h3nrik . Estoy usando Arch, y esto funciona para mí.

Básicamente, debe configurar systemd para leer la nueva ubicación de la imagen de Docker como una variable de entorno y pasar esa variable de entorno al script de ejecución del demonio Docker.

Para completar, aquí está la respuesta de h3nrick:


¿Tienes un /lib/systemd/system/docker.servicearchivo?

Si es así, editar de manera que el servicio utiliza el estibador habitual /etc/default/dockercomo un archivo de entorno: EnvironmentFile=-/etc/default/docker.

En el /etc/default/dockerarchivo, luego agregue DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Al final solo haz un systemctl daemon-reload && systemctl restart docker.

Para más información, consulte también la documentación .

modulitos
fuente
Si sigue las instrucciones actuales de instalación de Docker para Debian, obtendrá los scripts de SysVinit pero no se usarán. Ver github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Una solución mucho más simple es crear un punto de enlace flexible a lo que desee, como

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

Funciona para mí en mi servidor CentOS 6.5.

liuyanghejerry
fuente
66
No cree un enlace suave. Razones para ver mi comentario que publico antes ... ¡Puede tener problemas con los comandos 'docker rm'!
Suther
2
@Suther: ¿mayo? ¿Hay alguna situación en la que te encuentres en problemas o no? May es un poco impreciso para la documentación técnica, si me encuentro con un problema, quiero saber cuándo sucede exactamente eso, cómo se causa ese problema y cómo sería el resultado.
Hakre
4

Según lo recomendado por @mbarthelemy, esto se puede hacer a través de la -gopción al iniciar el dacker de Docker directamente.

Sin embargo, si Docker se inicia como un servicio del sistema, no se recomienda modificar el /etc/default/dockerarchivo. Hay una guía para esto ubicada aquí .

El enfoque correcto es crear un /etc/docker/daemon.jsonarchivo en sistemas Linux (o Mac) o %programdata%\docker\config\daemon.jsonen Windows. Si este archivo no se está utilizando para otra cosa, los siguientes campos deberían ser suficientes:

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

Esto supone que la nueva ubicación donde desea que Docker persista sus datos es /docker/daemon_files

ivandov
fuente
2

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

Tenga en cuenta que DOCKER_OPTS estaba inicialmente vacío y todo lo que hice fue agregar el argumento para hacer que Docker use mi nuevo directorio

Mahlatse Makalancheche
fuente
2

En Fedora 26 y probablemente en muchas otras versiones, puede encontrar un error después de mover la ubicación de la carpeta base como se describió anteriormente. Esto es particularmente cierto si lo está trasladando a un lugar debajo de / home. Esto se debe a que SeLinux se activa y evita que el contenedor de Docker ejecute muchos de sus programas desde esta ubicación.

La solución corta es eliminar la opción --enable-selinux cuando agrega el parámetro -g.

Euan
fuente
¿No sería ese espacio abierto para los ataques?
yuriploc
1

En un servidor AWS Ubuntu 16.04 puse las imágenes de Docker en un EBS separado, montado en / home / ubuntu / kaggle /, debajo del directorio de docker

Este fragmento de mi script de inicialización funcionó correctamente

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

Para los usuarios de Mac en la versión 17.06.0-ce-mac19, simplemente puede mover la ubicación de la imagen del disco desde la interfaz de usuario en la opción de preferencias Simplemente cambie la ubicación de la imagen del disco y funcionará (haciendo clic en Mover imagen del disco ) y reiniciando el estibador Usando este enfoque pude usar mi disco duro externo para almacenar imágenes acoplables.

sahu
fuente
¿Qué hay de los archivos existentes de Docker? ¿deberíamos moverlo manualmente?
gustav
Puede intentar reinstalar la ventana acoplable en la ubicación que prefiera. Los archivos de imagen y acopladores son independientes.
Sahu