How docker desktop runs linux containers on Windows machine - docker

I have installed Docker for Windows on my Windows 10 laptop. Now because of this "Docker for Windows" I can run Linux containers too on my windows 10 Laptop. How is it made possible? I have some queries, am I missing something here?
See image for better visibility
1) My machine which is Windows 10 has Windows Kernel. Right?
2) When I select option to RUN Linux containers, I think a Linux VM is run on top of my Windows 10 machine and on top of that Linux Containers are run. Is that correct?
3) If a Linux VM is run on TOP of Windows machine, whose kernel is used? Linux VM kernel or windows 10 kernel?
4) And then how can we say containers doesn't include operating system, for windows they are running a Linux VM.
5) Now if I run a second container, will it run on top of the already running Linux VM or will it launch a new linux VM again? I think it will run on the same running linux VM but asking so that there isn't any confusion.
6) If a Linux VM is run on TOP of Windows machine, then do we have any control on the Linux VM being run like version of Linux VM, etc or it's always the same and we don't have any control over it?
7) If a Linux VM is run on top of Windows machine, then is the windows resources not visible to the Linux VM and hence to the container? If it's visible then how can Linux VM talk to Windows Host?

1) My machine which is Windows 10 has Windows Kernel. Right?
A: Yes.
2) When I select option to RUN Linux containers, I think a Linux VM is run on top of my Windows 10 machine and on top of that Linux Containers are run. Is that correct?
A: Yes. A hyper-v linux vm with the name mobylinux will be there, you can see it in hyper-v manager.
3) If a Linux VM is run on TOP of Windows machine, whose kernel is used? Linux VM kernel or windows 10 kernel?
A: The hyper-v vm use linux kernel.
4) And then how can we say containers doesn't include operating system, for windows they are running a Linux VM.
A: Not sure where you get information. The docker image only has file system, e.g. ubuntu16.04 filesystem, but do not have kernel. When container run, it will use the filesystem of image & share the kernel of host(Maybe you just mean it not have own kernel, so you call it not have operation system?)
5) Now if I run a second container, will it run on top of the already running Linux VM or will it launch a new linux VM again? I think it will run on the same running linux VM but asking so that there isn't any confusion.
A: Yes, it will run on the same linux vm again.
6) If a Linux VM is run on TOP of Windows machine, then do we have any control on the Linux VM being run like version of Linux VM, etc or it's always the same and we don't have any control over it?
A: No, see this discussion, seems cannot ssh to the vm, just some workaround to access the filesystem of the vm, so not find any way to change the kernel or linux distribution.
7) If a Linux VM is run on top of Windows machine, then is the windows resources not visible to the Linux VM and hence to the container? If it's visible then how can Linux VM talk to Windows Host?
A: In theory, you can mount the windows folder to linux vm, then container can use the linux folder with volume. And docker for windows have done this for you, right click the icon in your taskbar, you could see something like follows, just do like the picture:

Related

How does a Windows or non Linux OS container work in Docker?

How does a windows container in a docker system run on top of a Linux host. Who handles the system call translations?
Quoting from the Windows Server Core image documentation:
Windows requires the host OS version to match the container OS version
In short, your proposed scenario doesn't work. You need to run Windows containers on a Windows host.

How can a linux container work on windows without a linux virtual machine (ie: native support)

From what I understand, the container includes all dependencies to run, but all containers running on the same platform whether it's a VM, or bare-metal will share the underlying kernel.
I believe I read somewhere that in order to run linux containers on windows, the Docker client spins up a linux based VM, and runs the container in that.
But now I see that docker for windows runs linux containers natively (ie, without hyper-v).
My question is: How can an image that was built to run on linux run on a system that has a windows kernel?
This is the original source that my question arose from:
https://www.hanselman.com/blog/DockerAndLinuxContainersOnWindowsWithOrWithoutHyperVVirtualMachines.aspx
With the latest version of Windows 10 (or 10 Server) and the beta of
Docker for Windows, there's native Linux Container support on Windows.
That means there's no Virtual Machine or Hyper-V involved (unless you
want), so Linux Containers run on Windows itself using Windows 10's
built in container support.
I saw some similar questions, but they explained how a linux container runs on a windows platform by utilising a vm/hyper-v
How docker desktop runs linux containers on Windows machine
Does "Docker On Windows" launch a linux virtual machine?
Perhaps I didn't understand their answers, but from what I understood, it still seems like the linux container is sitting on-top of the windows kernel.
this is the magic of LCOW (https://github.com/linuxkit/lcow)
you are right to run a container the base KERNEL should be same , since container is just an abstraction , so to run a linux container on windows there are two options
either use moby linux on hyperv and run containers there
use lcow to run light weight linux vm for each container. (lcow)
https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers
with WSL in windows in future we might be able to get a third method don't know if already someone is working on it .

Does "Docker On Windows" launch a linux virtual machine?

I'm aware that the old Docker Toolbox uses VirtualBox to run a minimal linux virtual machine for Docker using boot2docker which is a minimal light-weight Linux OS. Now, with the new Docker on Windows they claim that they use HyperVisor on Windows 10 Pro directly.
Does this mean the Docker on Windows package got rid of the Linux virtual machine totally, or is there still a Linux virtual machine being used on Windows?
A container is considered “native”, if it can run directly on the host operating system.
Linux Container - A Linux application that runs in an isolated Linux environment.
This same container can be run on a Windows OS using virtualization to emulate a Linux environment, but the container is still running on Linux.
Windows (Server) Container - A Windows application that runs in an isolated Windows environment.
Docker on Windows to run a Linux container requires virtualization. The available options are:
VirtualBox (Docker Toolbox)
Hyper-V backend (Docker Desktop)
WSL2 backend (Docker Desktop)
The Container (and Docker) terminology is very confusing, especially with Windows nuances. See Docker Container in Linux and Windows for an overview with many useful reference links.

Can a linux app run on windows using Docker?

I am aware of this question (Can Windows Containers be hosted on linux?), but it doesn't really answer my question.
I am new to Docker, but my question is such - if I take any windows application, put it inside a Docker container, can it run now on Linux and vice versa?
Confluent claims that it can run only on linux, but my colleague installed it on Windows using Docker. So if you can install it with Docker, then the whole application would surely be regarded as cross platform?
I think I am missing some important point here.
Docker is not a VM, it's a way to run applications on a shared kernel that isolate those applications from each other. Windows binaries don't run on a Linux kernel, and vice versa (ignoring the Linux runtime for Windows for the time being). So if you build a container with your Windows application, it will only run if you did so on Dockers Windows runtime and windows base image. It's won't run on a Linux host.
What docker does provide is an embedded VM running Linux (originally this was VirtualBox, but current versions are HyperV). By running Docker for Windows, by default, this VM was used and you would only be running Linux containers, so your windows application would not even run inside the container. To run the Windows binaries, you need to toggle Docker for Windows to use the Windows runtime, and presently that's a toggle, you can't run both Linux and Windows runtimes concurrently on the same host.
There also is no Windows VM packaged with Docker's Linux install. You would need to install your own copy of Windows (and get the licensing which is why Docker doesn't ship this) inside a VM on a Linux host and run your containers inside that VM if you need Windows support.

Can I run Docker in a Virtual Machine?

I tried to run Docker on a virtual machine.
Host : MacBook
VM : Parallels Windows 7
And error occurs:
Is it possible?
If the VM is a Linux, you can do this without any problem - on Linux, the Docker is essentially a well-worked chroot. Thus, the Linux docker is not virtualization.
In the case of Windows, it is not so easy. Windows Docker internally uses Hyper-V to emulate the containers. Which means that you can only run, if you can use nested virtualization:
On your host machine runs a Windows VM
Inside your Windows VM, runs a HyperV
HyperV is managed by the docker installed on your virtual Windows.
I tried qemu/kvm, virtualbox and vmware player. I configured them deeply and strongly, I've hacked them, I did every possible to do. Only the last worked (VMWare).
There are significant speed costs, but it may be useful for development on Linux, and then trial-test on Windows configurations.
You will need a lot of ram. At least 16G. 32G is better. A relative useful configuration would be:
32GB physical RAM for the physical host
12GB virtual RAM for the Windows VM running on it
8GB virtual RAM inside the Windows VM for the HyperV Linux host.
Sometimes it will be a little bit buggy, but only your HyperV will crash out, your virtual Win, or your host machine won't. It is okay for testing a docker container on a Windows machine, what you've developed on a Linux. Don't create mission critical servers on this way. :-)
You're using Docker Machine in your Windows VM, which is actually going to create a Linux VM inside the Windows VM on your Mac. You can do that, but you need to enable nested virtualization - which I'm not sure you can do in Parallels 7.
Instead you can run Docker Machine on the Mac directly and use Parallels to create the Linux VM - which means Docker is running in a Linux VM on your Mac, and you don't need nested virtualization.
Or preferably use Docker for Mac if your OS supports it, it's the latest product and has much better host integration than Docker Machine.
If you would be using Windows 10/11 Pro or Enterprise and Hyper-V, then all you must do is to enable nested virtualization. On your host, just run (with your guest off):
> Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Now you can start your guest and run Docker Desktop as normal.
According to Docker's terms I don't think it's allowed. Section 4.1(b)(vii) says you shall not "use the Service on virtual machines." For clarification, "'Service' refers to the applications, software (including any Open Source Software), products and services provided by Docker, including any beta or trial versions."
If I am reading this right, that means it's illegal to run Docker on any VM.
Worked perfectly fine. Base OS win 10 pro with VirtualBox Version: 6.1 and vagrant with ubuntu 20.04. Using vagrant box follow docker instructions. With vagrant public network no need for port forwarding all apps were accessible.
Previous persons comment is very concerning considering on Windows and Mac you run docker inside a virtual machine lul. Windows uses WSL2 and Mac uses an arm linux machine to manage its docker.
Also, you can run docker in a vm, but it must be linuxOS vm as windows 7 does not support docker.

Resources