Preguntas frecuentes sobre Docker Desktop para Linux
¿Por qué Docker Desktop para Linux ejecuta una máquina virtual?
Docker Desktop para Linux ejecuta una Máquina Virtual (VM) por las siguientes razones:
Para garantizar que Docker Desktop proporcione una experiencia coherente en todas las plataformas.
Durante la fase de investigación, la razón más citada por los usuarios que querían Docker Desktop para Linux era garantizar una experiencia coherente de Docker Desktop con paridad de características en todos los sistemas operativos principales. El uso de una máquina virtual garantiza que la experiencia de Docker Desktop para los usuarios de Linux coincida estrechamente con la de Windows y macOS.
Para utilizar nuevas características del kernel.
Dado que Docker controla el kernel y el sistema operativo dentro de la máquina virtual, Docker puede implementarlos para todos los usuarios de inmediato, incluso para aquellos que prefieren quedarse deliberadamente en una versión LTS del sistema operativo de su máquina.
Para mejorar la seguridad.
Las vulnerabilidades en las imágenes de contenedores representan un riesgo de seguridad para el entorno host. Existe una gran cantidad de imágenes no oficiales que no garantizan estar verificadas contra vulnerabilidades conocidas. Los usuarios malintencionados pueden subir imágenes a registros públicos y utilizar diferentes métodos para engañar a los usuarios para que las descarguen y ejecuten. El enfoque de VM mitiga esta amenaza, ya que cualquier malware que obtenga privilegios de root queda restringido al entorno de la VM sin acceso al host.
¿Por qué no ejecutar Docker en modo rootless? Aunque esto tiene el beneficio de limitar superficialmente el acceso al usuario root para que todo parezca más seguro en "top", permite que los usuarios sin privilegios obtengan
CAP_SYS_ADMINen su propio espacio de nombres de usuario y accedan a las API del kernel que no están diseñadas para ser utilizadas por usuarios sin privilegios, lo que resulta en vulnerabilidades.Para proporcionar los beneficios de la paridad de características y una mayor seguridad, con un impacto mínimo en el rendimiento.
La máquina virtual utilizada por Docker Desktop para Linux utiliza
VirtioFS, un sistema de archivos compartido que permite a las máquinas virtuales acceder a un árbol de directorios ubicado en el host. Las pruebas de rendimiento internas de Docker muestran que, con la asignación de recursos adecuada a la máquina virtual, se puede lograr un rendimiento del sistema de archivos casi nativo con VirtioFS.Por lo tanto, se ajusta la memoria predeterminada disponible para la máquina virtual en Docker Desktop para Linux. Puedes ajustar esta configuración según tus necesidades específicas utilizando el control deslizante Memory dentro de la pestaña Settings > Resources de Docker Desktop.
¿Cómo activo el uso compartido de archivos?
Docker Desktop para Linux utiliza VirtioFS como el mecanismo predeterminado (y actualmente único) para habilitar el uso compartido de archivos entre el host y la máquina virtual de Docker Desktop.
Para no requerir privilegios elevados, sin restringir innecesariamente las operaciones en los archivos compartidos, Docker Desktop ejecuta el servicio de uso compartido de archivos (virtiofsd) dentro de un espacio de nombres de usuario (consulta user_namespaces(7)) con asignación de UID y GID configurada. Como resultado, Docker Desktop depende de que el host esté configurado para permitir que el usuario actual utilice la delegación de IDs subordinados. Para que esto sea así, deben estar presentes /etc/subuid (consulta subuid(5)) y /etc/subgid (consulta subgid(5)). Docker Desktop solo admite la delegación de IDs subordinados configurada a través de archivos. Docker Desktop asigna el ID de usuario y GID actuales al 0 en los contenedores. Utiliza la primera entrada correspondiente al usuario actual en /etc/subuid y /etc/subgid para establecer las asignaciones para IDs mayores que 0 en los contenedores.
| ID en contenedor | ID en host |
|---|---|
| 0 (root) | ID del usuario que ejecuta Docker Desktop (por ejemplo, 1000) |
| 1 | 0 + inicio del rango de IDs especificado en /etc/subuid//etc/subgid (por ejemplo, 100000) |
| 2 | 1 + inicio del rango de IDs especificado en /etc/subuid//etc/subgid (por ejemplo, 100001) |
| 3 | 2 + inicio del rango de IDs especificado en /etc/subuid//etc/subgid (por ejemplo, 100002) |
| ... | ... |
Si no existen /etc/subuid and /etc/subgid, deben crearse. Ambos deben contener entradas con el formato:
<username>:<start of id range>:<id range size>. Por ejemplo, para permitir que el usuario actual use IDs de 100 000 a 165 535:
$ grep "$USER" /etc/subuid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subuid)
$ grep "$USER" /etc/subgid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subgid)
Para verificar que las configuraciones se hayan creado correctamente, inspecciona sus contenidos:
$ echo $USER
exampleuser
$ cat /etc/subuid
exampleuser:100000:65536
$ cat /etc/subgid
exampleuser:100000:65536
En este escenario, si se cambia el propietario de un archivo compartido mediante chown dentro de un contenedor de Docker Desktop de un usuario con un UID de 1000, en el host se mostrará como propiedad de un usuario con un UID de 100999. Esto tiene el efecto secundario desafortunado de impedir el acceso a dicho archivo en el host. El problema se resuelve creando un grupo con el nuevo GID y agregando nuestro usuario a él, o estableciendo una ACL recursiva (consulta setfacl(1)) para las carpetas compartidas con la máquina virtual de Docker Desktop.
¿Cómo utilizo los SDK de Docker con Docker Desktop para Linux?
Docker Desktop para Linux utiliza un socket por usuario ubicado en ~/.docker/desktop/docker.sock en lugar de /var/run/docker.sock de todo el sistema. La CLI de Docker maneja esto automáticamente a través del contexto desktop-linux, pero los SDK de Docker y otras herramientas que se conectan directamente al demonio de Docker también necesitan que se configure la variable de entorno DOCKER_HOST.
Sin configurar DOCKER_HOST, los SDK intentan conectarse a /var/run/docker.sock y fallan con un error como:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?Para solucionar esto, establece la variable de entorno DOCKER_HOST antes de ejecutar tu aplicación basada en SDK:
export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock
Or consíguelo dinámicamente desde el contexto desktop-linux:
export DOCKER_HOST=$(docker context inspect desktop-linux --format '{{ .Endpoints.docker.Host }}')
Para hacer esto permanente, añade el comando de exportación a tu perfil de shell (~/.bashrc, ~/.zshrc o similar):
echo 'export DOCKER_HOST=unix://$HOME/.docker/desktop/docker.sock' >> ~/.bashrc
¿Dónde almacena Docker Desktop los contenedores de Linux?
Docker Desktop almacena los contenedores e imágenes de Linux en un único archivo de "imagen de disco" grande en el sistema de archivos de Linux. Esto es diferente de Docker en Linux, que generalmente almacena contenedores e imágenes en el directorio /var/lib/docker en el sistema de archivos del host.
¿Dónde está el archivo de imagen de disco?
Para localizar el archivo de imagen de disco, selecciona Settings desde el panel de Docker Desktop y luego Advanced en la pestaña Resources.
La pestaña Advanced muestra la ubicación de la imagen de disco. También muestra el tamaño máximo de la imagen de disco y el espacio real que está consumiendo la imagen de disco. Ten en cuenta que otras herramientas podrían mostrar el uso de espacio del archivo en función del tamaño máximo del archivo, y no del tamaño real del archivo.
¿Qué pasa si el archivo es demasiado grande?
Si el archivo de imagen de disco es demasiado grande, puedes:
- Moverlo a una unidad de almacenamiento más grande
- Eliminar contenedores e imágenes innecesarios
- Reducir el tamaño máximo permitido del archivo
¿Cómo muevo el archivo a una unidad de almacenamiento más grande?
Para mover el archivo de imagen de disco a una ubicación diferente:
Selecciona Settings y luego Advanced en la pestaña Resources.
En la sección Disk image location, selecciona Browse y elige una nueva ubicación para la imagen de disco.
Selecciona Apply para que los cambios surtan efecto.
No muevas el archivo directamente en el gestor de archivos (Finder/Files), ya que esto puede hacer que Docker Desktop pierda el rastro del archivo.
¿Cómo elimino contenedores e imágenes innecesarios?
Comprueba si tienes contenedores e imágenes innecesarios. Si tu cliente y la API del demonio ejecutan la versión 1.25 o posterior (usa el comando docker version en el cliente para verificar las versiones de tu cliente y de la API del demonio), puedes ver la información detallada del uso de espacio ejecutando:
$ docker system df -v
Alternativamente, para listar las imágenes, ejecuta:
$ docker image ls
Para listar los contenedores, ejecuta:
$ docker container ls -a
Si hay muchos objetos redundantes, ejecuta el comando:
$ docker system prune
Este comando elimina todos los contenedores detenidos, las redes no utilizadas, las imágenes huérfanas y la caché de construcción.
Puede tomar unos minutos recuperar el espacio en el host dependiendo del formato del archivo de imagen de disco:
- Si el archivo se llama
Docker.raw: el espacio en el host se recuperará en unos pocos segundos. - Si el archivo se llama
Docker.qcow2: el espacio se liberará mediante un proceso en segundo plano después de unos minutos.
El espacio solo se libera cuando se eliminan las imágenes. El espacio no se libera automáticamente cuando se eliminan archivos dentro de contenedores en ejecución. Para iniciar una recuperación de espacio en cualquier momento, ejecuta el comando:
$ docker run --privileged --pid=host docker/desktop-reclaim-space
Ten en cuenta que muchas herramientas informan del tamaño máximo del archivo, no del tamaño real. Para consultar el tamaño real del archivo en el host desde una terminal, ejecuta:
$ cd ~/.docker/desktop/vms/0/data
$ ls -klsh Docker.raw
2333548 -rw-r--r--@ 1 username staff 64G Dec 13 17:42 Docker.raw
En este ejemplo, el tamaño real del disco es 2333548 KB, mientras que el tamaño máximo del disco es 64 GB.
¿Cómo reduzco el tamaño máximo del archivo?
Para reducir el tamaño máximo del archivo de imagen de disco:
Desde el panel de Docker Desktop, selecciona Settings y luego Advanced en la pestaña Resources.
La sección Disk image size contiene un control deslizante que te permite cambiar el tamaño máximo de la imagen de disco. Ajusta el control deslizante para establecer un límite inferior.
Selecciona Apply.
Cuando reduces el tamaño máximo, el archivo de imagen de disco actual se elimina y, por lo tanto, se pierden todos los contenedores e imágenes.