¿Se pueden alojar los contenedores de Windows en Linux?

239

¿Es posible ejecutar Windows Containers en Linux ? El escenario se basa en una aplicación escrita en .NET (red antigua) y el usuario de Linux que quiere ejecutar esto con Docker para proporcionar una net462API escrita en el localhost.

Estoy usando la versión beta de Docker Desktop para Windows

Si no, ¿por qué Windows puede ejecutar contenedores de Linux y no al revés?

EDITAR:

Como ha pasado algún tiempo y esta pregunta es popular. Me gustaría agregar una nota aquí que la solución es usar el nuevo estándar de red. Me permitió empaquetar 4.6.2framework en una nueva biblioteca.

Sebastian 506563
fuente
44
No es posible: para construir y ejecutar contenedores de Windows, se requiere un sistema de Windows con soporte de contenedores.
ajtrichards
55
Ok, pero ¿por qué entonces Windows puede ejecutar contenedores de Linux? No hay viceversa por ahora?
Sebastian 506563
10
@ Sebastian506563 porque Docker ejecuta la virtualización VirtualBox detrás de escena para hacer que los contenedores de Linux se ejecuten en Windows. Supongo que, en teoría, también será posible de otra manera, solo que Docker no lo implementó.
Gregory Suvalian
55
Con las máquinas virtuales, cada máquina virtual tiene su propio sistema operativo. Con los contenedores, hay una imagen del sistema operativo base y cada contenedor agrega una nueva capa delgada en la parte superior de la base. En Docker, este sistema operativo base está basado en Linux. es decir, su contenedor de Windows no puede usar la base, ya que es diferente. blog.risingstack.com/…
xen-dara
3
@PanagiotisKanavos, por favor, redacta la respuesta
Sebastian 506563

Respuestas:

162

Actualización3: 06.2019 Algunos de los comentarios dicen que la respuesta no está clara, intentaré aclarar.

TL; DR:

P: ¿Los contenedores de Windows pueden ejecutarse en Linux?

A: No. No pueden. Los contenedores utilizan los recursos y controladores subyacentes del sistema operativo, por lo que los contenedores de Windows pueden ejecutarse solo en Windows, y los contenedores de Linux pueden ejecutarse solo en Linux.

P: ¿Pero qué pasa con Docker para Windows? ¿U otras soluciones basadas en VM?

R: Docker para Windows le permite simular la ejecución de contenedores de Linux en Windows , pero bajo el capó se crea una máquina virtual Linux, por lo que los contenedores de Linux se ejecutan en Linux y los contenedores de Windows se ejecutan en Windows .

Bonificación: lea este artículo muy bueno sobre la ejecución de contenedores Docker de Linux en Windows

P: Entonces, ¿qué debo hacer con una aplicación .Net Framework 462 si quisiera ejecutarla en un contenedor?

A: depende. Siguiendo varias recomendaciones:

  • Si es posible, muévase a .Net Core. Dado que .Net Core brinda soporte a la mayoría de las características principales de .Net Framework, y .Net Framework 4.8 será la última versión de .Net framework
  • Si no puede migrar a .Net Core, como mencionó @Sebastian, puede convertir sus bibliotecas a .Net Standard y tener 2 versiones de la aplicación, una en .Net Framework 4.6.2 y otra en .Net Core, no es siempre obvio, Visual Studio lo admite bastante bien (con múltiples objetivos), pero algunas dependencias pueden requerir un cuidado adicional.

  • (Menos recomendado) En algunos casos, puede ejecutar contenedores de Windows. Los contenedores de Windows son cada vez más maduros, con un mejor soporte en plataformas como Kubernetes. Pero para poder ejecutar el código de .Net Framework, aún debe ejecutarse en la imagen base de "Server Core", que ocupa aproximadamente 1,4 GB. En los mismos casos raros, puede migrar su código a .Net Core, pero aun así ejecutarlo en servidores Windows Nano, con un tamaño de imagen de 95 MB.

Dejando también las viejas actualizaciones para la historia

Actualización2: 08.2018 Si está utilizando Docker-for-Windows, ahora puede ejecutar Windows y contenedores de Linux simultáneamente : https://blogs.msdn.microsoft.com/premier_developer/2018/04/20/running-docker-windows- y-linux-contenedores-simultáneamente /

Bonificación: no está directamente relacionado con la pregunta, pero ahora puede ejecutar no solo el contenedor de Linux en sí, sino también el orquestador como kubernetes: https://blog.docker.com/2018/07/kubernetes-is-now-available-in -docker-desktop-stable-channel /

Actualizado en 2018:

La respuesta original en general es correcta, PERO hace varios meses, Docker agregó la función experimental LCOW ( repositorio oficial de github ).

De esta publicación :

¿Docker para Windows ya no ejecuta contenedores de Linux? Así es. Docker para Windows puede ejecutar contenedores Linux o Windows, con soporte para contenedores Linux a través de una VM Hyper-V Moby Linux (a partir de Docker para Windows 17.10 esta VM se basa en LinuxKit).

La configuración para ejecutar contenedores Linux con LCOW es mucho más simple que la arquitectura anterior en la que una máquina virtual Linux de Hyper-V ejecuta un demonio Docker de Linux, junto con todos sus contenedores. Con LCOW, el demonio Docker se ejecuta como un proceso de Windows (igual que cuando se ejecutan contenedores de Windows Docker), y cada vez que inicia un contenedor de Linux, Docker lanza un hipervisor Hyper-V mínimo que ejecuta una VM con un kernel de Linux, runc y los procesos de contenedor. corriendo en la parte superior.

Debido a que solo hay un demonio Docker, y dado que ese demonio ahora se ejecuta en Windows, pronto será posible ejecutar contenedores Docker de Windows y Linux uno al lado del otro, en el mismo espacio de nombres de red . Esto desbloqueará muchos escenarios interesantes de desarrollo y producción para los usuarios de Docker en Windows.

Original:

Como se mencionó en los comentarios de @PanagiotisKanavos, los contenedores no son para virtualización y están utilizando los recursos de la máquina host . Como resultado, por ahora el contenedor de Windows no puede ejecutarse "tal cual" en la máquina Linux.

Pero , puede hacerlo utilizando VM, ya que funciona en Windows. Puede instalar Windows VM en su host de Linux, lo que permitirá ejecutar contenedores de Windows.

Con él, en mi humilde opinión, ejecutarlo de esta manera en el entorno PROD no será la mejor idea.

Además, esta respuesta proporciona más detalles.

evgenyl
fuente
12
La respuesta vinculada en realidad no proporciona ningún detalle al respecto, solo explica cómo ejecutar contenedores de Linux en Windows (lo inverso). Es posible ejecutar Docker dentro de una VM de Windows, pero necesita soporte de virtualización anidada para esto. Esto significa que funciona con VMware, pero no con Virtualbox.
Ralf
3
Hay muchas palabras en la respuesta, pero no parece responder a la pregunta.
Kyberias
2
No es la respuesta a la pregunta. No debería estar tan bien clasificado
Amorfo el
2
Esta NO es una respuesta a esta pregunta. Ejecutar Docker en Linux es MUY diferente de ejecutar Docker en Windows. ¿Por qué se marca esto como una respuesta? \
Ani
Contenedores = ejecutar eficientemente aplicaciones aisladas y diferenciadas (que fueron creadas para un sistema operativo específico), menos memoria, espacio en disco, gastos generales, una utilización de hardware más eficiente VMs = caso de uso ... ejecutar sistemas operativos completos para varios casos de uso ..., la utilización del hardware es buena (No necesito comprar una máquina diff para cada sistema operativo ... si realmente necesito múltiples sistemas operativos para mi caso de uso), pero la utilización difícil no es tan buena en comparación con los contenedores. Gran video del CTO de Joyent: youtube.com/watch?v=coFIEH3vXPw
cacoder
16

No, no puede ejecutar contenedores de Windows directamente en Linux.

Pero puedes ejecutar Linux en Windows.

Windows Server / 10 viene empaquetado con la imagen base del sistema operativo ubuntu ( después del paquete de servicio beta de septiembre de 2016 ). Esa es la razón por la que puede ejecutar Linux en Windows y no de otra manera. Mira aquí. https://thenewstack.io/finally-linux-containers-really-will-run-windows-linuxkit/

Puede cambiar entre los contenedores del sistema operativo Linux y Windows haciendo clic derecho en la ventana acoplable en el menú de la bandeja.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Karthikeyan VK
fuente
13
El OP está buscando ejecutar contenedores de Windows en servidores Linux, por lo que este no responde la pregunta. Pero no me gustan las personas que emiten un voto negativo sin un comentario, así que estoy dando un voto positivo
margarita
1
@Karthikeyan V: Porque no es una respuesta a la pregunta.
Stefan Steiger
No estoy seguro de lo que dijo antes, pero la primera declaración dice que no puedes y la segunda dice que puedes. Probablemente sea una falta o algo confuso.
StingyJack
9

A diferencia de la virtualización, la contenedorización utiliza el mismo sistema operativo host. Por lo tanto, el contenedor construido en Linux no se puede ejecutar en Windows y viceversa.

En Windows, debe tomar la ayuda de la virtualización (usando Hyper-v) para tener el mismo sistema operativo que el sistema operativo de sus contenedores y luego debería poder ejecutar lo mismo.

Docker para Windows es una aplicación similar que se basa en Hyper-v y ayuda a ejecutar Linux Docker Container en Windows. Pero hasta donde yo sé, no hay nada como tal que ayude a ejecutar contenedores de Windows en Linux.

sunil bhardwaj
fuente
9

Los contenedores usan el núcleo del sistema operativo. Windows Container utiliza procesos para ejecutarse. Entonces, teóricamente, los Contenedores de Windows no pueden ejecutarse en Linux.

Sin embargo, existen soluciones alternativas que utilizan soluciones VMstyle.

He encontrado esta solución que usa Vagrant y Packer en Mac, por lo que también debería funcionar para Linux: https://github.com/StefanScherer/windows-docker-machine

Este entorno vagabundo crea una máquina Docker para trabajar en su MacBook con contenedores de Windows. Puede cambiar fácilmente entre los contenedores Docker para Mac Linux y los contenedores de Windows.

Ejecutar comandos bash ingrese la descripción de la imagen aquí

construyendo la caja vagabunda sin cabeza

$ git clone https://github.com/StefanScherer/packer-windows
$ cd packer-windows

$ packer build --only=vmware-iso windows_2019_docker.json
$ vagrant box add windows_2019_docker windows_2019_docker_vmware.box

Crea la máquina Docker

$ git clone https://github.com/StefanScherer/windows-docker-machine
$ cd windows-docker-machine
$ vagrant up --provider vmware_fusion 2019

Cambiar a contenedores de Windows

$ eval $(docker-machine env 2019)
solución alterna
fuente
7

Solución 1 - Usando VirtualBox

Como Muhammad Sahputra sugirió en esta publicación , es posible ejecutar el sistema operativo Windows dentro de VirtualBox (usando VBoxHeadless - sin interfaz gráfica) dentro del contenedor Docker .

Además, una configuración de NAT dentro de las configuraciones de red de VM puede hacer un reenvío de puertos que le brinda la capacidad de pasar cualquier tráfico que provenga del contenedor Docker. Esto eventualmente, en una perspectiva amplia, le permite ejecutar cualquier servicio basado en Windows sobre la máquina Linux.

Quizás este no sea un caso de uso típico de un contenedor Docker, pero definitivamente es un enfoque interesante para el problema.


Solución 2 - Usar vino

Para aplicaciones simples y quizás más complicadas, puede intentar usar el vino dentro de un contenedor acoplable .

Esta página de Docker Hub puede ayudarlo a lograr su objetivo.


Espero que Docker lance una solución nativa pronto, como lo hicieron con la máquina docker en Windows hace varios años.

Slavik Meltser
fuente
6

Puede usar Windows Containers dentro de una máquina virtual (el sistema operativo invitado debe cumplir los requisitos: Windows 10 Pro o Windows 2016).

Por ejemplo , puede usar VirtualBox , solo habilite Hyper-V dentro de la interfaz Sistema / Aceleración / Paravirtualización.

Después de eso, si Docker no se inicia debido a un error, use el "Cambiar a contenedores de Windows ..." en la configuración.

(Esto podría moverse como un comentario a la respuesta aceptada, pero no tengo suficiente reputación para hacerlo)

BalintPogatsa
fuente
3

Si bien Docker para Windows es perfectamente capaz de ejecutar contenedores de Linux, lo contrario, aunque en teoría es posible, no se implementa debido a razones prácticas.

La más obvia es que, si bien Docker para Windows puede ejecutar una máquina virtual Linux libremente, Docker para Linux requeriría una licencia de Windows para ejecutarla dentro de una máquina virtual.

Además, Linux es completamente personalizable, por lo que la VM de Linux utilizada por Docker para Windows se ha reducido a solo unos pocos MB, que contiene solo el mínimo necesario para ejecutar los contenedores, mientras que la distribución más pequeña de Windows disponible es de aproximadamente 1,5 GB. Puede que no sea un tamaño impracticable, pero es mucho más engorroso que el de Linux en Windows.

Si bien es ciertamente posible que alguien venda una variación de Docker para Linux incluida con una licencia de Windows y esté lista para ejecutar contenedores de Windows en Linux (y no sé si ese producto existe), la conclusión es que no se puede evitar pagar el precio de bloqueo del proveedor de Windows: tanto en dinero como en espacio de almacenamiento.

lvella
fuente
0

Puede ejecutar MSSQL y .NET Core en Linux, y por lo tanto dentro de los contenedores de Linux, hoy en día.

Ver: https://hub.docker.com/r/microsoft/mssql-server-linux/

También: https://hub.docker.com/r/microsoft/dotnet/

La pregunta directa a su respuesta es, por supuesto, a menos que haya una versión compilada especialmente para Linux, no.

Dagelf
fuente
3
Esto es cierto, pero no tiene nada que ver con la pregunta. Además, MS-SQL es más que solo el motor (que en Linux viene sin archivos o R por cierto, por lo que ni siquiera es el motor completo).
Stefan Steiger
Tienes que pensar un paso adelante ... ¿por qué está preguntando? Si está preguntando porque quiere ejecutar uno de estos: voila.
Dagelf
2
Posible. Pero en mi humilde opinión, probablemente esté haciendo la pregunta porque ya lo ha hecho, y ahora tiene que ejecutar cosas como SSRS / SSAS o algún control de formulario web, como ReportViewer, en Linux.
Stefan Steiger
Docker image microsoft / dotnet es para .Net Core, que es algo completamente diferente del antiguo .Net 4.x, por lo que no puede ejecutar la aplicación diseñada para el antiguo .Net en .Net Core
j123b567
3
Son compatibles .NET Corey NO .NET : estos son dos entornos completamente diferentes.
Slavik Meltser
-1

Los contenedores de Windows no se ejecutan en Linux y tampoco puede ejecutar contenedores de Linux en Windows directamente.

Ehsan
fuente
66
¿Puedes elaborar un poco?
Matthieu
18
Puede ejecutar contenedores de Linux en win 10
Kugel
2
Le voté a este tipo, ya que creo que era cierto en ese momento. Sin embargo, ahora puede ejecutar contenedores Linux en Docker en Windows (Docker se ejecuta en una VM llamada MobyLinux).
JakeJ
En realidad, Windows ejecuta una pequeña VM de Linux para ejecutar contenedores de Linux. verifique sus recursos de Hyper-V para verlo
Tuğrul Karakaya