¿Es posible ejecutar contenedores de Windows 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 API escrita net462 en el host 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?
Como ha pasado algún tiempo y esta pregunta es popular. Me gustaría agregar una nota aquí de que la solución es usar el nuevo estándar de red. Me permitió empaquetar el marco 4.6.2 en una nueva biblioteca.
TL;RD:
P: ¿Se pueden ejecutar contenedores de Windows en Linux?
R: No. No pueden.
Los contenedores utilizan los recursos y controladores del sistema operativo subyacente, por lo que los contenedores de Windows solo pueden ejecutarse en Windows y los contenedores de Linux solo pueden ejecutarse 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 VM de 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?
R: Depende. Siguiendo varias recomendaciones:
Si es posible, muévase a .NET Core. Dado que .NET Core brinda soporte para la mayoría de las funciones 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 dos versiones de la aplicación, una en .NET Framework 4.6.2 y otra en .NET Core, es no siempre obvio. Visual Studio lo admite bastante bien (con objetivos múltiples), pero algunas dependencias pueden requerir un cuidado especial.
(Menos recomendado) En algunos casos, puede ejecutar contenedores de Windows. Los contenedores de Windows son cada vez más maduros, con mejor soporte en plataformas como Kubernetes . Pero para poder ejecutar el código de .NET Framework, aún debe ejecutar la imagen base de "Server Core", que ocupa alrededor de 1,4 GB. En los mismos casos excepcionales, puede migrar su código a .NET Core, pero seguir ejecutándose en el servidor Windows Nano , con un tamaño de imagen de 95 MB.
Dejando también las actualizaciones antiguas para la historia.
Actualización 2: 08.2018
Si está utilizando Docker-for-Windows, ahora puede ejecutar contenedores de Windows y Linux simultáneamente : Ejecución simultánea de contenedores de Windows y Linux de Docker
Bonificación: no está directamente relacionado con la pregunta, pero ahora puede ejecutar no solo el contenedor de Linux en sí, sino también un orquestador como Kubernetes: Kubernetes ahora está disponible en Docker Desktop Stable Channel
Actualizado en 2018:
La respuesta original en general es correcta, PERO hace varios meses, Docker agregó la característica 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 de Linux o Windows, con soporte para contenedores de Linux a través de una máquina virtual Hyper-V Moby Linux (a partir de Docker para Windows 17.10, esta máquina virtual se basa en LinuxKit).
La configuración para ejecutar contenedores de 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 de Docker se ejecuta como un proceso de Windows (igual que cuando se ejecutan los contenedores de Windows de Docker), y cada vez que inicia un contenedor de Linux, Docker inicia un hipervisor Hyper-V mínimo que ejecuta una máquina virtual con un kernel de Linux, runc y los procesos del contenedor. corriendo en la parte superior.
Debido a que solo hay un demonio de Docker, y debido a que ese demonio ahora se ejecuta en Windows, pronto será posible ejecutar contenedores Docker de Windows y Linux en paralelo, en el mismo espacio de nombres de red . Esto desbloqueará una gran cantidad de emocionantes escenarios de desarrollo y producción para los usuarios de Docker en Windows.
Original:
Como se menciona en los comentarios de @PanagiotisKanavos, los contenedores no son para la virtualización y utilizan los recursos de la máquina host . Como resultado, por ahora un contenedor de Windows no puede ejecutarse "tal cual" en una máquina Linux.
Pero , puede hacerlo usando VM, ya que funciona en Windows. Puede instalar Windows VM en su host Linux, lo que le permitirá ejecutar contenedores de Windows.
Con él, en mi humilde opinión, ejecutarlo de esta manera en un entorno de producción no será la mejor idea.
Además, esta respuesta proporciona más detalles.
No, no puede ejecutar contenedores de Windows directamente en Linux.
Pero puedes ejecutar Linux en Windows.
Windows Server 2016 viene empaquetado con una 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. Echa un vistazo aquí. Finalmente, los contenedores de Linux podrían ejecutarse en Windows con LinuxKit de Docker
Puede cambiar entre los contenedores del sistema operativo Linux y Windows haciendo clic con el botón derecho en Docker en el menú de la bandeja.
Puede usar contenedores de Windows dentro de una máquina virtual (el sistema operativo invitado debe cumplir con los requisitos: Windows 10 Pro o Windows Server 2016 ).
Por ejemplo, puedes usar VirtualBox . Simplemente habilite Hyper-V dentro del Sistema → Aceleración → Interfaz de paravirtualización .
Después de eso, si Docker no se inicia debido a un error, use "Cambiar a contenedores de Windows..." en la configuración.
A diferencia de la virtualización , la creación de contenedores utiliza el mismo sistema operativo host. Entonces, el contenedor creado 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 su contenedor y luego debería poder ejecutar el mismo.
Docker para Windows es una aplicación similar que se basa en Hyper-V y ayuda a ejecutar contenedores Linux Docker en Windows. Pero hasta donde yo sé, no hay nada como tal que ayude a ejecutar contenedores de Windows en Linux.
Puede ejecutar SQL Server y .NET Core en Linux y, por lo tanto, dentro de los contenedores de Linux, hoy en día.
Consulte: Microsoft SQL Server de Microsoft | Centro acoplable
También: .NET Core de Microsoft | Centro acoplable
La respuesta directa a su pregunta es, por supuesto, a menos que haya una versión compilada especialmente para Linux, no.
Como sugirió Muhammad Sahputra en esta publicación , es posible ejecutar el sistema operativo Windows dentro de VirtualBox (usando VBoxHeadless, sin interfaz gráfica) dentro de un contenedor Docker .
Además, una configuración de NAT dentro de las configuraciones de red de VM puede realizar un reenvío de puertos que le brinda la capacidad de pasar cualquier tráfico que ingrese y provenga del contenedor Docker. Esto eventualmente, en una perspectiva amplia, le permite ejecutar cualquier servicio basado en Windows en la parte superior de la máquina Linux.
Tal vez este no sea un caso de uso típico de un contenedor Docker, pero definitivamente es un enfoque interesante para el problema.
Para aplicaciones simples y quizás más complicadas, puede intentar usar wine dentro de un contenedor docker .
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 docker-machine en Windows hace varios años.
Los contenedores utilizan el kernel del sistema operativo. Los contenedores de Windows utilizan procesos para ejecutarse. En teoría, los contenedores de Windows no pueden ejecutarse en Linux.
Sin embargo, existen soluciones que utilizan soluciones VMstyle.
Encontré 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 de Vagrant crea una Docker Machine para trabajar en su MacBook con contenedores de Windows. Puede cambiar fácilmente entre los contenedores de Docker para Mac Linux y los contenedores de Windows.
construyendo la caja Vagrant 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.boxCrear la máquina Docker
$ git clone https://github.com/StefanScherer/windows-docker-machine $ cd windows-docker-machine $ vagrant up --provider vmware_fusion 2019Cambiar a contenedores de Windows
$ eval $(docker-machine env 2019)
Si bien Docker para Windows es perfectamente capaz de ejecutar contenedores de Linux, lo contrario, aunque teóricamente posible, no se implementa por razones prácticas.
La más obvia es que, mientras que Docker para Windows puede ejecutar una VM Linux libremente, Docker para Linux requeriría una licencia de Windows para poder ejecutarlo dentro de una VM.
Además, Linux es completamente personalizable, por lo que la máquina virtual de Linux utilizada por Docker para Windows se ha reducido a unos pocos MB, y contiene solo el mínimo necesario para ejecutar los contenedores, mientras que la distribución de Windows más pequeña disponible es de aproximadamente 1,5 GB. Puede que no sea un tamaño impracticable, pero es mucho más engorroso que la contraparte de Linux en Windows.
Si bien es posible que alguien venda una variación de Docker para Linux incluida con una licencia de Windows y lista para ejecutar contenedores de Windows en Linux (y no sé si existe tal producto), la conclusión es que no puede evitar pagando el precio de bloqueo del proveedor de Windows: tanto en dinero como en espacio de almacenamiento.
Podemos ejecutar contenedores de Linux en Windows. Docker para Windows usa el Linux-Kit basado en Hyper-V o WSL 2 como backend para facilitar los contenedores de Linux.
Si alguna distribución de Linux tiene este tipo de configuración, podemos ejecutar contenedores de Windows. Docker para Linux solo admite contenedores de Linux.