Pregunta ¿Se puede ejecutar Docker de forma nativa en el nuevo espacio de usuario de Windows 10 (Ubuntu)?


Mi entendimiento fue que la principal limitación de ejecutar la ventana acoplable en otros sistemas operativos fueron los contenedores de la red de Linux que lo hicieron posible. (Ciertamente para Mac).

Recientemente Microsoft anunció una beta de un Ubuntu linux modo de usuario ejecutándose de forma nativa en Windows 10. Esto puede ejecutar binarios compilados en formato ELF en Windows (a diferencia de cygwin que requiere una compilación).

Mi pregunta es: ¿Se puede ejecutar Docker de forma nativa en el nuevo espacio de usuario de Windows 10 (Ubuntu)?


121
2018-04-04 10:16


origen


No es "solo" un bash espacio de usuario. Es un espacio de usuario de Linux real y bastante completo, pero sin X Windows, es decir, solo texto. Decir "bash" comunica bastante bien la limitación de solo texto ... - MSalters
¿Me he perdido algo? ¿Se distribuyó esto realmente? Por el momento solo lo conozco como vaporware. - Michael Hampton♦
Creo que no quedará claro hasta que publiquen esto (AFAIK ni siquiera está disponible para los usuarios de Windows), sin embargo, vale la pena señalar que Microsoft y Docker están trabajando para llevar Docker a Windows de forma nativa, que se lanzará junto con el servidor Windows 2016. - Rоry McCune
@RоryMcCune: Interesante. Sin embargo, de acuerdo con esta entrada del blog Docker a partir de agosto de 2015, este será un puerto que permitirá a Docker ejecutar Windows Imágenes en Windows, no imágenes de Linux en Windows. - sleske
De hecho, ese es el propósito de la ventana acoplable nativa de Windows. La naturaleza de la contenedorización es que no puede ejecutar sistemas con otros kernels, sin agregar alguna virtualización o (posiblemente) este nuevo subsistema que Microsoft está desarrollando. - Rоry McCune


Respuestas:


A partir de ahora (abril 2016) la respuesta es:

Aún no lo sabemos (pero probablemente no).

Los hechos

  • Windows 10 ahora puede ejecutar una variedad de programas de Linux (entre ellos el shell Bash y varias utilidades de texto). Estos no son puertos (es decir, versiones compiladas, como por ejemplo en Cygwin), son lo mismo Binarios elfos que se ejecutan en un sistema Linux típico. En En este caso, fueron tomados de Ubuntu.
  • Para hacer esto posible, Windows 10 se modificó para aceptar llamadas al sistema Linux (syscalls), y para poder cargar y ejecutar archivos binarios ELF (comentario de Scott Hanselman). Esto significa que los ejecutables de Linux sin modificar se pueden ejecutar, cargarán sus bibliotecas compartidas sin modificar según sea necesario, y Windows los ejecutará como procesos de Windows.
  • Cada vez que un programa Linux de este tipo quiere interactuar con el kernel, emite una llamada al sistema (o deja que una biblioteca lo haga). Esta es (probablemente) la única diferencia para ejecutar en Linux: cuando se ejecuta en Linux, el kernel de Linux maneja estas llamadas; En Windows 10, el kernel de Windows 10 lo hace en su lugar.

La especulacion

Entonces, la pregunta es si se implementaron o no los syscalls que necesita Docker (para chroot y espacios de nombres, entre otras cosas). La respuesta es que es probable que "no". Docker requiere una funcionalidad bastante sofisticada (y específica de Linux) para la administración de procesos y recursos, y el aislamiento del proceso. Si bien es probable que se pueda replicar todo esto en Windows, sería mucho trabajo, y dado que el objetivo de esta característica de Windows parece ser ejecutar los programas del espacio de usuario de Linux, parece poco probable que hayan hecho todo el trabajo (y lo hayan mantenido en secreto). .

Sin embargo, no hay información definitiva de ninguna manera, por lo que puedo decir. 

Puertos Docker existentes

Por supuesto, si Microsoft decide que quieren que Docker sea compatible con Windows 10, probablemente podrán ofrecerlo. Hay algún precedente para portar Docker a un kernel diferente:

  • Hay un Puerto Docker para FreeBSD. Está etiquetado como "experimental", pero en principio parece funcionar. Puede usar contenedores Docker no modificados del repositorio de Docker, lo que significa que en realidad proporciona un entorno de host similar a Linux para las imágenes.
  • Hay un proyecto en curso para portar Docker a Windows (específicamente, Windows Server 2016) - vea esto Entrada del blog Docker a partir de agosto de 2015. Sin embargo, a diferencia del puerto FreBSD anterior, este será un puerto que permitirá a Docker ejecutar imágenes de Windows en Windows, no imágenes de Linux en Windows. Gracias a Rоry McCune por señalar esto.

50
2018-04-05 07:15



Actualización: hay un artículo sobre el tema en un blog de MSDN ahora: Descripción general del subsistema de Windows para Linux. - sleske
A partir de hoy es posible con Hyper-V: tutorials.ubuntu.com/tutorial/… - Nick Sweeting
He bajado la votación simplemente porque la respuesta más votada es más útil que la especulación de lo que puede ser, cubre lo que es. - James


Puede usar Docker para Windows como el motor y Docker para Linux como el cliente en Bash en Ubuntu en Windows. Conéctelos a través de TCP.

Instala Docker para Windows: https://docs.docker.com/docker-for-windows/ Si desea usar Windows Containers en lugar de Linux Containers, ambos contenedores de tipo pueden ser administrados por el cliente de Linux docker en el espacio de usuario de bash.

Desde la versión 17.03.1-ce-win12 (12058) debe verificar Exponer el demonio en tcp: // localhost: 2375 sin TLS para que el cliente de Linux docker continúe comunicándose con el demonio de Windows docker por TCP

Sigue estos pasos:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

o

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps

Para hacerlo permanente:

mkdir ~/bin
mv ~/docker/docker ~/bin

Agregue las variables correspondientes a .bashrc

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

Por supuesto que puedes instalar docker-compose

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

O usando python pip

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose

Y la finalización de Bash. La mejor parte:

sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Lo he probado con la versión 18.06.0-ce-win59 (19098) de Docker para Windows con Hyper-V:

~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:04:39 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Mira tanto el cliente como el servidor dicen OS / Arch: linux / amd64

Volúmenes

Tenga cuidado al añadir volúmenes. El camino C:\dir será visible como /mnt/c/dir en WSL y como /c/dir/ por motor docker. Puedes superarlo permanentemente:

sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"

Debe salir y volver a cargar WSL después de realizar el cambio en wsl.conf para que WSL lea sus cambios en el inicio.

ACTUALIZAR

desde: Novedades de la línea de comandos en Windows 10 versión 1803

Unix Sockets   Unix Sockets no era compatible con Windows, ¡y ahora lo son! También puede comunicarse a través de sockets Unix entre Windows y WSL. Una de las mejores cosas de esto es que permite que WSL ejecute Linux Docker Client para interactuar con el Docker Daemon que se ejecuta en Windows.

Saludos


99
2017-07-19 22:05



Hola @ joel-pearson, la ventana acoplable tiene dos partes: el motor y el cliente. El motor se ejecuta en Windows usando Docker Toolbox (basado en VirtualBox) o Docker para Windows (basado en Hyper-V), ambos soportados oficialmente por el equipo de docker. El motor Docker aún no se ejecuta en el espacio de usuario de bash. El cliente Docker en Windows se puede ejecutar en cmd, powershell o cygwin. Lo que dice esta respuesta es la forma de ejecutar el cliente de la ventana acoplable en el espacio de usuario de bash. ¿Por qué? Personalmente prefiero bash, la terminación funciona. Estoy de acuerdo en que la pregunta es sobre el motor de la ventana acoplable, pero lo encontré cuando estaba buscando al cliente, y muchas personas hacen lo mismo. - Carlos Rafael Ramirez
Acabo de probarlo y funciona para mí en 1.12 :) Súper emocionado de poder hacer un desarrollo serio en Windows. - Zach Russell
Intenté tus instrucciones en Bash en Ubuntu en Windows, obtuve "No se puede conectar con el demonio Docker. ¿Se está ejecutando el demonio docker en este host?". ¿Te faltan algunos pasos? - mpen
A partir de febrero de 2017, esta sigue siendo la única manera. - hdave
Después de junio de 2017, puedes corre el ventana acoplable para ventanas ejecutables desde el shell bash. En lugar de instalar el cliente docker, puede utilizar el docker.exe directamente para consultar / interactuar el subsistema docker. Sin embargo, tenga en cuenta que la ventana acoplable para Windows utilizará las variables y configuraciones de Windows. - Jaime


La primera vista previa de información privilegiada fue lanzada ayer. He intentado instalar la ventana acoplable pero falla con lo siguiente: docker fail

Por lo tanto, parece que para la primera vista previa no funciona actualmente. Sin embargo, como muchas personas han especulado, puede funcionar en una versión futura.


12
2018-04-07 10:29



Genial, gracias por intentarlo! - Hawkeye
Buena idea para intentar realmente esto. Una cosa: ¿podría agregar el texto de la captura de pantalla como texto real (el terminal de Ubuntu admite copiar y pegar). El texto "real" tiene numerosas ventajas (más fácil de leer, compatible con lectores de pantalla, rastreable por los motores de búsqueda) - sleske
Algunas actualizaciones: He podido instalar completamente la ventana acoplable en mi máquina ejecutando la actualización final del aniversario. Pero haciendo un docker ps falla con: Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS? - kumar_harsh
Parece que ahora funciona: tutorials.ubuntu.com/tutorial/… - Nick Sweeting


No, esto no es posible.

Docker necesita varias cosas para ejecutar contenedores:

  • chroot
  • Espacios de nombres para:
    • PID
    • Usuarios
    • Red
    • Montajes
    • UTS
    • IPC

Estas son todas las características del kernel que están implementadas en Linux. Desafortunadamente, la mayoría de ellos no tienen una característica similar en Windows para usar como reemplazo (ni en el Subsistema Linux que Microsoft implementó en el kernel de Windows). Todo esto debe ser proporcionado por el sistema operativo.


11
2018-04-04 10:21



En realidad, Windows tiene espacios de nombres para Usuarios, Montajes e IPC. Los espacios de nombres de los usuarios son necesarios para Active Directory, los espacios de nombres de montaje y los espacios de nombres IPC son necesarios para la operación multiusuario. Fundamentalmente, el Administrador de objetos del kernel en Windows siempre ha tenido espacios de nombres, desde el primer lanzamiento de Windows NT, por lo que no es tan extraño. - MSalters
Y con los servicios de escritorio remoto, los objetos de sesión utilizan activamente estos espacios de nombres para proporcionar una operación simultánea. Eso no significa que tenga toda la infraestructura necesaria, pero las partes más importantes están ahí. Como para chrootTenga en cuenta que el entorno de Ubuntu ya tiene una raíz diferente a la de WIN32. - MSalters
En realidad, creo que es demasiado pronto para responder esto de cualquier manera. Como se describe en un comentario de Scott Hanselman, el kernel de Windows 10 ahora acepta Linux syscalls. Entonces, la pregunta es si se implementaron o no los syscalls que necesita Docker (para chroot y espacios de nombres). Si bien la respuesta es probablemente "no", no hay información definitiva de ninguna manera, por lo que puedo decir. - sleske
@sleske tiene razón, esta pregunta no se puede responder en este momento, y decir "no, no puedo" sin ninguna indicación real de lo que hacen los desarrolladores que trabajan en el espacio de Linux en las viudas es bastante presuntuoso. - Ryan
No sé lo suficiente como para afirmar con confianza que esta respuesta es totalmente errónea, pero la forma en que está redactada me hace un poco escéptico de su validez. En particular, afirmar que "Bash es un simple programa de espacio de usuario y no puede proporcionar ninguno de estos" y al referirse al Windows Subsystem for Linux como "la nueva característica de Bash" hace que parezca que esta respuesta se basa en la suposición totalmente falsa que hizo Microsoft. fue port bash a Windows. Eso no es lo que pasó. Desarrollaron una interfaz de kernel de Linux completa que se ejecuta sobre el kernel de Windows: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


A partir de la Actualización del creador (lanzado públicamente el 13 de junio de 2017) puede ejecutar el ejecutable nativo de Windows directamente en WSL. Esto significa que si ya has instalado Docker para Windows simplemente puedes invocar el docker binarios instalados bajo C:\Program Files. Ya que terminan en .exe La opción más fácil es crear alias. Algo como lo siguiente en tu .bashrc Deberia trabajar:

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

Esto crea alias para todos los archivos en el DOCKER_BINdirectorio:

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

Una advertencia: aparecerá un mensaje de error como "No se puede traducir el directorio de trabajo actual"si se ejecuta desde un directorio de Linux. Solo cd en un directorio de Windows (por ejemplo, /mnt/c/Users/YourUsername) y debes ser bueno.


6
2018-06-22 06:02



Esto no parece recoger las variables de entorno de bash en archivos YML compuestos por ventana acoplable. ¿Alguna idea para eso? - Rüdiger Schulz
Eso tiene sentido, ya que estás invocando a Windows. docker binario, y simplemente hacerlo a través del shell de Linux. No estoy seguro de si hay una buena manera de lograrlo. - dimo414


Una vez que se lanza Docker 1.12 y se separa el cliente Linux Docker, debería poder ejecutar la ventana acoplable. cliente en Windows 10 bash.

Es posible que esto no parezca demasiado dado que tienes un cliente Docker para Windows, pero es útil si tienes cadenas de herramientas de Linux que incluyen la ventana acoplable para su funcionalidad del lado del cliente.


5
2018-04-29 09:31





En Windows 10 versión 1607 Build 1493.10 puede instalarlo con éxito en Ubuntu Bash, pero no funciona :(

Una simple "versión docker" le dirá:

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

Si luego ejecuta "sudo docker -d" obtendrá el siguiente error:

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

Así que este es definitivamente un tapón desde el lado bash.

Sin embargo, puedes instalar Docker para Windows y funciona como un encanto, obviamente puede implementar servidores Linux y todo lo que necesite.

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

3
2017-08-12 21:38





A partir de septiembre de 2016, No.

Todas las implementaciones actuales de Docker en Windows usan virtualización, Docker 1.12 usa un hipervisor en Windows, lo que elimina la ventaja de la contención en contenedores sobre la virtualización.

Docker necesita más que solo usar las llamadas de sistemas Linux.

Necesita grupos de control de procesos (cgroups), un sistema de archivos apilable (aufs), además de otros sistemas basados ​​en Linux fuera del kernel.

Ni cgroups ni aufs se encuentran de forma nativa en el kernel de Windows 10.

Hay una implementación de Windows Server 2016 aquí: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..pero esto solo ejecutará algunos servicios de Windows, por ejemplo, IIS, y no Ubuntu


2
2017-09-05 13:15





Docker actualmente no funciona en la compilación actual (14316), suponiendo que pueda instalarlo.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict

1
2018-04-12 20:47



¡Increíble! Por favor sigue intentándolo. - Hawkeye
Parece que esto podría estar relacionado con cómo funciona la asignación de memoria en golang (en el que está escrito Docker): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/… - Timothy Meade
El mío simplemente cuelga para siempre después de la orden. - wieczorek1990