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


126

Comprendí que la limitación principal de ejecutar Docker en otros sistemas operativos era que los contenedores de red de Linux lo hacían posible. (Ciertamente para Mac).

Recientemente, Microsoft anunció una versión beta de un modo de usuario Linux de Ubuntu que se ejecuta 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: ¿puede ejecutar Docker de forma nativa en el nuevo espacio de usuario bash de Windows 10 (Ubuntu)?


44
No es "solo" un bashespacio 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? ¿Esto realmente se distribuyó? Por el momento solo lo conozco como vaporware.
Michael Hampton

2
Creo que no estará claro hasta que lancen esto (AFAIK ni siquiera está disponible para usuarios de Windows todavía), 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 Windows Server 2016
R®ry McCune

1
@ RоryMcCune: Interesante. Sin embargo, de acuerdo con esta entrada del blog del estibador de agosto de 2015, este será un puerto que permite acoplable para ejecutar de Windows imágenes en Windows, Linux no imágenes en Windows.
sleske 05 de

2
de hecho, ese es el propósito del acoplador nativo de Windows. La naturaleza de la contenerización es que no se puede ejecutar sistemas con otros kernels, sin añadir de alguna virtualización o (posiblemente) este nuevo subsistema que Microsoft están desarrollando
Rоry McCune

Respuestas:


103

Puede usar Docker Desktop para Windows como motor y Docker para Linux como cliente en WSL en Ubuntu / Debian en Windows. Conéctelos a través de TCP.

Instale Docker Desktop para Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Si desea utilizar Contenedores de Windows en lugar de Contenedores de Linux, el cliente de Docker de Linux puede administrar ambos contenedores de tipo. El espacio de usuario bash.

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

Sigue estos pasos:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.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, puede instalar docker-compose

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.24.1/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 probé con la versión 2.1.0.1 (37199) de Docker Desktop con Hyper-V:

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/amd64**

Volúmenes

Tenga cuidado al agregar volúmenes. La ruta C:\dirserá visible como /mnt/c/diren WSL y como /c/dir/por el 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

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

Sockets Unix Los Sockets Unix no eran compatibles con Windows, ¡y ahora sí! También puede comunicarse a través de sockets Unix entre Windows y WSL. Una de las mejores cosas de esto es que permite a WSL ejecutar Linux Docker Client para interactuar con Docker Daemon que se ejecuta en Windows.

ACTUALIZAR

Este script y el uso de Sockets Unix se incluyeron en la configuración pengwin de Pengwin.

Saludos


3
Hola @ joel-pearson, docker tiene dos partes: el motor y el cliente. El motor se ejecuta en Windows utilizando Docker Toolbox (basado en VirtualBox) o Docker para Windows (basado en Hyper-V), ambos oficialmente compatibles con el equipo de Docker. El motor Docker aún no se ejecuta en bash espacio de usuario. 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 Docker en el espacio de usuario bash. ¿Por qué? Personalmente prefiero bash, la finalización funciona. Estoy de acuerdo en que la pregunta está relacionada con el motor acoplable, pero la encontré cuando estaba buscando al cliente, y muchas personas hacen lo mismo.
Carlos Rafael Ramirez

1
Lo acabo de probar y funciona para mí en 1.12 :) Súper emocionado de poder ahora hacer un desarrollo serio en Windows.
Zach Russell

2
Intenté sus instrucciones en Bash en Ubuntu en Windows, obtuve "No se puede conectar al Docker Daemon. ¿Se está ejecutando el Docker Daemon en este host?". ¿Te faltan algunos pasos?
mpen

55
A partir de febrero de 2017, esta sigue siendo la única forma.
hdave

3
Después de junio de 2017, puede ejecutar el Docker para ejecutables de Windows desde el shell bash . En lugar de instalar el cliente de Docker, puede usarlo docker.exedirectamente para consultar / interactuar con el subsistema de Docker. Sin embargo, tenga en cuenta que la ventana acoplable para Windows utilizará las variables y configuraciones de Windows.
Jaime

51

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

Todavía 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 los mismos binarios ELF que se ejecutan en un sistema Linux típico. 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 se pueden ejecutar ejecutables de Linux no modificados, cargarán sus bibliotecas compartidas no modificadas 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 núcleo, emite una llamada al sistema (o deja que una biblioteca lo haga). Esta es (supuestamente) la única diferencia con ejecutar en Linux: cuando se ejecuta en Linux, el kernel de Linux maneja estas llamadas; en Windows 10, el núcleo de Windows 10 lo hace en su lugar.

La especulacion

Entonces, la pregunta es si las llamadas al sistema que necesita Docker (para chroot y espacios de nombres, entre otras cosas) se implementaron o no. La respuesta es que es probable que "no". Docker requiere una funcionalidad bastante sofisticada (y específica de Linux) para la gestión de procesos y recursos, y el aislamiento de procesos. Si bien es probable que sea posible replicar todo esto en Windows, sería mucho trabajo, y dado que el objetivo de esta característica de Windows parece ser ejecutar programas de espacio de usuario de Linux, parece poco probable que hicieran todo el trabajo (y lo mantuvieran 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 desean soporte Docker en Windows 10, probablemente podrán ofrecerlo. Hay algunos precedentes para portar Docker a un kernel diferente:

  • Hay un puerto Docker para FreeBSD . Está etiquetado como "experimental", pero parece funcionar en principio. Puede usar contenedores Docker no modificados del repositorio Docker, lo que significa que en realidad proporciona un entorno host similar a Linux para las imágenes.
  • Hay un proyecto en marcha para portar Docker a Windows (específicamente, Windows Server 2016); consulte esta entrada del blog de Docker de agosto de 2015. Sin embargo, a diferencia del puerto FreBSD anterior, este será un puerto que le 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.

1
Actualización: ahora hay un artículo sobre el tema en un blog de MSDN: 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

Voté en contra 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

13

La primera vista previa de información privilegiada fue lanzada ayer. Intenté instalar Docker pero falla con lo siguiente: la ventana acoplable falla

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


55
Buena idea para probar esto realmente. 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, admite lectores de pantalla, rastreable por motores de búsqueda)
sleske

Alguna actualización: pude instalar completamente Docker en mi máquina ejecutando la actualización de aniversario final. Pero hacer un docker pserror 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?
kumarharsh

Parece que funciona ahora: tutorials.ubuntu.com/tutorial/…
Nick Sweeting

13

No, esto no es posible.

Docker necesita varias cosas para ejecutar contenedores:

  • chroot
  • Espacios de nombres para:
    • PID
    • Los usuarios
    • Red
    • Monturas
    • UTS
    • IPC

Estas son todas las características del núcleo que se implementan 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). Todos estos deben ser proporcionados por el sistema operativo.


44
En realidad, Windows tiene espacios de nombres para usuarios, montajes e IPC. Los espacios de nombres de usuario son necesarios para Active Directory, los espacios de nombres de montaje y los espacios de nombres IPC son necesarios para la operación multiusuario. Básicamente, el Kernel Object Manager en Windows siempre ha tenido espacios de nombres, desde la primera versión de Windows NT, por lo que no es tan extraño.
MSalters

3
Y con los Servicios de escritorio remoto, los objetos de sesión usan activamente estos espacios de nombres para proporcionar una operación concurrente. Eso no significa que tenga toda la infraestructura requerida, pero las partes principales están ahí. En cuanto a chroot, tenga en cuenta que el entorno de Ubuntu ya tiene una raíz diferente que el WIN32.
MSalters

66
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 llamadas de sistema de Linux. Entonces, la pregunta es si las llamadas al sistema que necesita Docker (para chroot y espacios de nombres) se implementaron o no. Si bien la respuesta es "no", no hay información definitiva de ninguna manera, por lo que puedo decir.
sleske

1
@sleske tiene razón, esta pregunta no tiene respuesta en este momento, y decir "no, no puede" sin ninguna indicación real de lo que los desarrolladores que trabajan en el espacio de Linux en las viudas es bastante presuntuoso.
Ryan

2
No sé lo suficiente como para afirmar con confianza que esta respuesta es totalmente incorrecta, pero la forma en que está redactada me hace un poco escéptico sobre su validez. En particular, declarar "Bash es un programa simple de espacio de usuario y no puede proporcionar ninguno de estos" y al referirse al subsistema de Windows para Linux como "la nueva función Bash" hace que parezca que esta respuesta se basa en la suposición totalmente falsa de que todo Microsoft hizo fue port bash a Windows. Eso no es lo que pasó. Desarrollaron una interfaz completa del kernel de Linux que se ejecuta sobre el kernel de Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

A partir de la Actualización del creador (lanzada públicamente el 13 de junio de 2017), puede ejecutar el ejecutable nativo de Windows directamente en WSL. Esto significa que si ya ha instalado Docker para Windows , simplemente puede invocar los dockerarchivos binarios instalados en C:\Program Files. Ya que terminan en .exela opción más fácil es crear alias. Algo como lo siguiente en su .bashrcdebería funcionar:

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: recibirá un mensaje de error como " No se puede traducir el directorio de trabajo actual " si se ejecuta desde un directorio de Linux. Simplemente cden un directorio de Windows (por ejemplo /mnt/c/Users/YourUsername) y debería ser bueno.


Esto no parece recoger variables de entorno bash en archivos YML compuestos por docker. ¿Alguna idea para eso?
Rüdiger Schulz

1
Eso tiene sentido, ya que estás invocando el dockerbinario de Windows , y solo lo haces a través del shell de Linux. No estoy seguro de si hay una buena manera de lograrlo.
dimo414

6

Una vez que se publique Docker 1.12 y se separe el cliente Docker de Linux, debería poder ejecutar el cliente docker en Windows 10 bash.

Esto puede no parecer mucho dado que tiene un cliente Docker Windows, pero es útil si tiene cadenas de herramientas de Linux que incluyen docker por su funcionalidad del lado del cliente.


4

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

Una simple "versión acoplable" 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 de bash.

Sin embargo, puede instalar Docker para Windows y funciona de maravilla, obviamente puede implementar servidores Linux y todo lo que necesita.

> 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

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 contenedorización sobre la virtualización.

Docker necesita más que solo usar llamadas a 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 núcleo.

Ni cgroups ni aufs están nativos en el kernel de Windows 10.

Aquí hay una implementación de Windows Server 2016: 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

Docker no funciona actualmente 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

¡Increíble! Por favor sigue intentándolo.
Hawkeye el

Parece que esto podría estar relacionado con cómo funciona la asignación de memoria en golang (en el que Docker está escrito): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade

El mío simplemente se cuelga para siempre después del comando.
wieczorek1990

1

De: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)

2
Esto se complementa con el hecho de que ahora puede ejecutar el cliente de Docker para Linux en bash, así que evite usar PowerShell si no está acostumbrado
Carlos Rafael Ramírez

1
Será interesante ver si aumentan esto a un enjambre de acopladores.
Hawkeye el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.