Is it not possible to run Linux and Windows docker containers simultaneously? - docker

Based on Microsoft's documentation, in order to run a Windows containers:
If you see an error message that says no matching manifest for linux/amd64 in the manifest list entries, make sure Docker isn't
configured to run Linux containers. To switch to Windows containers in
Docker, right-click the Docker icon, and select Switch to Windows
containers. To use the command line to switch between containers, run & $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon.
This seems problematic (I just tried it and got the error mentioned) since I want to run a test lab with Windows and Linux boxes interacting on a network. Is docker not capable of this or have I perhaps misunderstood something?

It is possible to run Windows containers and Linux containers. The only drawback is that you cannot manage (e.g. start, stop) Windows and Linux containers at the same time without switching.
If you select "Switch to Windows containers", you get this message:
You are about to switch to Windows containers. Existing containers will continue to run, but you will not be able to manage them until you switch back to linux containers. No data will be lost otherwise.
Do you want to continue?

Related

How to enable mixed platform on Docker on year 2022?

I checked out some tutorials but the Daemon tab is already missing with the current version of Docker Desktop(4.8.1). Under the "Docker Engine" tab, I set the 'experimental' field to 'true' but it looks like it is still not working.
The "platform" parameter isn't working.
What works:
Running linux based containers, Switch to Windows containers... and
run windows containers. Running containers will keep on running. You'll find it on right-click on system tray
of Docker Desktop.
Pull windows and linux based containers in Windows mode, but NOT in linux mode
Creating a compose file and use the keys platform: linux and platform: windows mixed, while running Windows container mode. Compose will choose the daemon for you.
You can not:
Build images on a daemon not supporting the OS of the image, see Roadmap
I don't know whats wrong in your case. In Windows Mode with
{
"experimental": true
}
(you have to set it again in Windows Mode, there are 2 different daemon settings)
you should be able to pull linux and windows images. Just checked with docker desktop 4.9.0 (prebuild), can't pull in 4.8.1 due to bug in proxy settings..

Is it possible to run Docker Desktop with existing Linux VM?

I have an Ubuntu VM using Hyper-V, specialized for server development with Docker daemon and docker compose already installed on it; is there any way to connect Docker Desktop on the Windows machine to the docker daemon in the Ubuntu VM?
Well, if I'm understanding correctly, you can't really 'connect' Windows Docker Desktop to the Linux Docker daemon; but, you can use various methods to control both of the daemons, and also link them into a single 'unit'.
To control them, my favorite way is to use Portainer (including the Portainer Agent), and to join the daemons I personally created a Docker Swarm for my small home network of Docker daemons on various OS's (I currently have 1 on Win 10, 1 on Raspberry Pi, and 1 on Kubuntu).
Docker Swarm is from my understanding, fading away these days though, in favor of Kubernetes. In my use case swarm was just easier, and had all I needed, so I opted for it over Kubernetes; you'll have to feel them both out on your own for your preference.
As mentioned in the other answer, this isn't really possible in docker for windows. You should probably migrate from your VM to WSL2 anyway now. It'll only get harder in the future. If your work is in git then you just have to reclone your repos and rebuild/pull your images.
However, I use docker professionally every day and I don't see a need for docker desktop. Which suggests that you probably don't need it either. What is it really? A UI that shows you what containers are running? Big deal -- I have docker ps to do that in bash...
I use windows because I'm working on a number of windows projects for clients and dual-boot into Linux for a reality check when windows is driving me insane or whenever I'm not being forced to run windows. I do all my server development in my pure-ubuntu environment (using K3D).
I'm also thinking of dumping ubuntu -- because of 'snap' -- I find it every bit as irritating as windows and I've been looking for an alternative for some time. I only use 3 GUI tools: a browser, postman, and IntelliJ -- if it wasn't for them I'd just install alpine on my laptop and be done.

Why does Docker for Windows make you pick either Windows or Linux containers?

When using Docker for Windows, you must choose to either use Windows or Linux containers, but you can't use both at the same time. What is the technical reason(s) for this? It's a little counter-intuitive, since each container has its own isolated operating system.
Linux containers on Docker for Windows are not handled by windows itself, but they are using Hyper-V Linux VM - MobyLinuxVM. Hence the necessity to switch between Linux and Windows.
However starting from Windows 1709 and Docker in edge version you can try out linux containers on windows - see: https://blog.docker.com/2017/09/docker-windows-server-1709/
Update
As #v.karbovnichy brought up, technically on Docker for Windows you "can" run linux and windows containers simultanously - you can use docker-machine command to create additional linux-based virtual machine that will run your linux containers. Then, you can connect them into one swarm and, with a dose of good will, you will run linux and windows containers simultaneously on same machine.
docker client command itself can connect to both linux or windows docker-server and "manage" both of them - check docker login - it's widely used in server configurations.
However as stated above, true running linux and windows containers next to each other is in preview state.
Docker ecosystem on your Windows machine contains several components.
One is Docker command line: the docker command that you use for everything-management. The second one is Docker daemon - A self-sufficient runtime for containers, the core.
Docker daemons for Linux Containers and Windows Containers are different, but they listen for connections from the docker client on the same pipe. So one needs to be stopped for other to be started. This is the technical reason that you asked for.
However, you can observe that containers started for ex. in MobyLinuxVM is still running and available for connections when you switch to Windows containers. The only thing here is that you cannot manage them because the Docker daemon for Windows does not know how to manage Linux containers in MobyLinuxVM.
UPDATE: As described in this post,
Docker for Windows 18.02 now supports Linux and Windows containers running side-by-side via LCOW, using a single Docker daemon.
So actually now you can use one docker daemon to manage both worlds, it's just about using the new --platform flag in docker pull.

Windows and Linux Containers simultaneously Windows 10

I have a solution that includes about 5 containers. Most of them are alpine linux based, but one has to be a windows container. Unfortunately, the windows container relies on one of the linux containers for authentication and must be able to run alongside it. I am trying to set things up so I can develop locally with both containers running at the same time but I am having some trouble. Is it possible to run both Windows and Linux containers simultaneously on a Windows 10 Pro host using Docker for Windows (Hyper-V version)?
Essentially what I am looking for is the equivalent of running a docker compose file with both linux and windows containers in it (although everything I have researched says this isn't possible).
It looks like docker edge version 18.02 has the ability to run windows and linux containers next to each other using LCOW (Linux Containers on Windows). It hasn't made it into docker-compose yet, but I think it will very soon. Can't wait for the stable version to have this!

Docker and specifying a target OS

I've read that:
Docker is a system for management and deployment of application containers, not operating system containers.
However, in several resources (e.g. around 1:20 into https://www.youtube.com/watch?v=pGYAg7TMmp0) it gives an example of "problems" you might encounter if you've developed a web application on a Windows PC or Mac, and are deploying it to a Linux server.
So, how does Docker help in this situation? If we take a web application I understand Docker could help you make a container with the source, and say a specific version of PHP. But could you specify a target OS for it to run on, if it's different from the server that Docker is running on?
The Docker FAQ (https://docs.docker.com/engine/faq/) says
You can run both Linux and Windows programs and excutables in Docker containers.
Does this mean you need Docker installed on a Linux and Windows machine separately to do this, or is it possible to specify any OS within your Docker image and have any machine run it?
Please can someone explain how - or if - Docker deals with specifying a particular OS for your application?
Docker started as a way to run containers on Linux hosts, and this remains the dominate target for docker containers. Developer environments include an embedded VM to run Linux under the covers on Mac and Windows. Originally this was VirtualBox, but newer releases use xhyve and hyperv. The host OS in all of these are Linux so you are not building your image on one OS and running it on another OS.
Since that start, Docker has expanded target OS's. This requires that you have a docker installation for that OS, and it requires that your image be designed to run on that architecture/OS. This started with other architectures of Linux like arm64, and now zLinux. The Microsoft partnership is a rather large rewrite, partially in Windows itself, but also in the Docker code, and especially in the images designed to run natively on Windows. To run these, you have to change the settings on Docker for Windows to run Windows containers instead of Linux containers, you cannot run them both concurrently on the same host. At present, running Windows binaries can only be done on a Windows host, Microsoft isn't shipping free VMs for Linux hosts. And as a new target platform, it still lags behind in features from the Linux hosts.

Resources