Is it possible to run Docker Windows container and edit registry (regedit)? - windows

I'm new to Docker and started to read the official documentation & googled around the internet but couldn't find conclusive answer.
I'll describe my situation, I have a program (in C++) that runs as a service on Windows 10 Pro and have configuration details in windows registry (regedit).
Currently if I want to debug it I have a virtual machine of Win 10 Pro and use remote debug.
The reason I don't debug it on my machine is because my program always runs on my machine as a service and I don't want to stop it, also on the VM I edit/change the registry configuration.
So I was thinking using Docker instead of VM, but a question has arisen:
Is it possible to edit the container registry without changing/harming the host machine registry?
Thanks in advance for the help.

There is passing mention in Microsoft Docs:
While a container shares the host operating system's kernel, the container doesn't get unfettered access to it. Instead, the container gets an isolated–and in some cases virtualized–view of the system. For example, a container can access a virtualized version of the file system and registry, but any changes affect only the container and are discarded when it stops. To save data, the container can mount persistent storage such as an Azure Disk or a file share (including Azure Files).
https://learn.microsoft.com/en-us/virtualization/windowscontainers/about/#how-containers-work

Related

Docker won't start on Windows: Not Enough memory to start docker

I am trying to get started with Docker on Windows. My machine has 4GB of RAM and a 1.9GHz - 2.5GHz Intel i5 processor, running Windows 10 Pro x64. I know these aren't powerful specs, but I would have thought I should be able to run Docker?
However, having downloaded Docker, I get the error message:
Not Enough memory to start docker
I have seen various forum posts and github issues about this and followed all the advice I can see, such as modifying the settings in Docker, I tried these:
They also mentioned changing the settings of the Hyper-V VM however, this seems to be deleted and recreated with the Docker specified settings on every attempted launch. I tried 2048MB, 1792MB, 1536MB, 1280MB and 1024MB of RAM, all of which failed.
What else can I do? Surely I can run docker in some form on my machine? NB: I have closed all non-essential background apps. There doesn't seem to be many other suggestions for what seems to be a fairly common issue, where the given solutions don't work?
I have also encountered the same problem. Tried everything from giving dynamic memory to enabling and disabling Hyper V and many more. But with all that, I got no success.
Then I tried these steps for
Docker won't start on Windows: Not Enough memory to start docker:
From System Tray menu, right click on Docker icon
Select Switch to Windows containers...
Restart the system.
There you go after restarting your docker status should be showing as: Docker is running
PS: Switching back to Linux container should work now after switching to Windows Containers for most of the users as said by rfay.
Updates (May 01, 2019)
Despite of the above methods if you're still unable to start docker on your Windows Machine, try with the following things:
Download RAMMap from Microsoft's Official website
Open the application and select Empty menu
From the sub-menu list select the first option Empty Working Sets
Now refresh it by pressing F5
Now try running docker and I believe this should work.
I solved this issue by right clicking on the docker tray icon chose settings and then tapped on the "Advanced" section.
Then I lowered the memory from the default 2048 to 1536 and works like charm.
Another option is try to switch to Windows Containers then Restart the Machine and switch back to Linux Containers.
Below is my docker settings with Advanced tab open. Note the Memory is 1536 and My laptop has 4GB Ram.
Also the virtual machine "MobyLinuxVM" is running as shown below;
I hope this helps someone one day even if was a late answer :)
if you are on window and got this error,
Go to Search box
#1 type Hyper-V Manager
Click on it,
a window like attached screenshot open,
#2 Select MobilinuxVM(normally same name if running windows docker)
#3 Right click and open - Setting
2 The second window will open(setting for MobiLinux) i.e to the screenshot.
#4 Go to Memory Tab in left Pane.
#5 click on a dynamic checkbox and set minimum value to some lower amount say 512, and max value to the desired one,
#6 apply
now it will start running as well after few minutes take the amount it required as well.
It is not the problem of RAM. It is the allocated disk memory to docker.
It means there is not enough space for docker to create an image or any other docker related operations.
Open the docker settings >> advanced >> disk image max size
Increase this size and apply the changes.
It will restart automatically and then you're good to go.
In Settings, I did a reset to factory defaults.
And restarted the laptop.
It Worked for me
Posting what worked for me:
Open Resources settings in docker
Set memory to lowest setting, in my case 1024MB
Open Task manager, verify that I've at least the memory I specified above free
Restart docker, switch to linux containers
In my case this worked because I was using almost all of my RAM with VScode and firefox, so closed them and tried and it worked
Have you enabled NUMA spanning in your HyperV settings? if not enable it i bet that will solve your issue.
By default, Windows Server enables NUMA spanning, which provides the most flexibility as virtual machines (VMs) can access and use memory in any NUMA node. But it may result in lower performance compared to forcing VMs to use memory on the same NUMA node as the processor cores.
By disabling NUMA spanning, you ensure that VMs use memory and processor cores in the same NUMA node, giving the best performance.
This should only be changed once, if, as an administrator, you feel comfortable with NUMA and the implications of disabling and also if you have some additional management suite that can help ensure best configuration.
To configure NUMA spanning, open the Hyper-V Settings and select the NUMA Spanning option and disable it, I am sure, it will get solved; I struggled with the issue for a week and resolved it by disabling NUMA.
I am sure this would be marked as resolved by disabling NUMA in Hyper-V Manager.
I lowered my memory and swap to the lowest it would go as well as the disk image size to 32gb and it finally started without switching to windows containers or having to reboot.
To fix this issue, you need (but firstly see Note #4 below):
Back up the DockerDesktopVM virtual drive
To find this path, open Hyper-V manager and Open setting of DockerDesktopVM, and find path. Usually it exists in vm-data folder in DockerDesktop ProgramData folder.
Switch to Windows containers via tray icon
Usually this file is locked. To unlock it, for me works, turning of all services with name Hyper-V and with name docker: Docker and Docker Desctop. Also, Docker Desctop UI should be turned off via tray icon right click on it.
Back up the file DockerDesktopVM !!!
When the file DockerDesktopVM was back up, so all folder vm-data with this file maybe deleted (be aware and careful this file contains all your containers and images.)
Starts all services back and run docker desktop UI.
Switch back to Linux containers
At this moment you will see the settings in DockerDesktop UI and new file was created in vm-data folder with name DockerDesktopVM
Stop the all services again and replace the new file DockerDesktopVM with your old file which was backed up at the step 5.
Start all services and Docker Desktop UI.
Note #1: most of difficulties ware with locked file DockerDesktopVM. Reboot is not required during manipulations with locked file. Updated: This file maybe acidentially attached as a disk to the host system. So, you need diskmgmt.msc on the host server. The disk was listed there, right click and choose detach. It prompts for confirmation that you have the correct file. At that point, process explorer confirms that the file is no longer open by pid 4 (nt kernel & system) and I am able to work freely with the .vhdx file. Updated 2: Or you need to run command net stop vmms. Manipulate with file and start the vmms back with command net stop vmms (origin https://community.spiceworks.com/topic/603713-solved-vhdx-can-t-be-deleted) Update 3: Anyway the vhdx file maybe locked due to VM is still running or hang. To determine this you can open vhdx file permission and see in the list of user one user with strange name similar to GUID - this is NT VIRTUAL MACHINE{GUID}. So, this is a virtual user under which your VM's process is running in windows. Then you can find the process vmwp.exe under this user in Taskmanager -> Details. Another way, you can find this process from Process Explorer latest version in Find Handler or DLL section by a search keyword 'vhdx'. You need to kill this process! After that, the vhdx file will be unlocked.
Note #2: If you backed up your DockerDesktopVM.vhdx file, so you can probably reset Docker to default for instance after step 7, or just reinstall the Docker Desktop
Note #3: Sometimes DockerDesktopVM.vhdx will be unlocked when it was deleted from Hyper-V Mager UI
Note #4: If your docker was able to start with wrong settings some how, but now it does not able to start. So, probably, you can try to avoid all manipulations above and just close all applications which consume a lot of memory, like chrome. And, try start docker again.
But the core idea run Docker with fresh DockerDesktopVM file and replace it with the old one after when settings UI will be unlocked.
I have also the same problem. Maybe you have other virtual machine in Hyper-v, other Virtual machin need memory too. please stop all other Hyper-v Virtual machine and test again. for me worked
My Hyper-v Manager
When I experienced this problem I modified the PowerShell script MobyLinux.ps1 found in the resources folder on the Docker install in C:\Program Files\Docker\Docker\resources. Essentially I forced the values for the $CPUs to 2 and the $Memory to 512, which worked for my dev box's limited resources!
At this point when Docker drops the MobyLinuxVM instance in Hyper-V and re-creates it from the PowerShell script it now uses my values:
This time the VM remains up and stable, and Docker successfully switches from the Windows Containers to the Linux Containers:
Hope this helps someone.
Issue resolved after just restarting the PC -_-. Dont know what is that.
So to begin with I normally start off with opening Visual Studio Code then my terminal and finally Docker Desktop WSL2. The problem being is that Visual Studio Code is a chunky memory hogger and initially requires a lot of memory to run. Especially if you used the integrated terminal, multiple tabs, and ultimately multiple windows.
When I open Docker Desktop last it gives me not enough resources error. After a little messing and testing, I found out that Docker initially needs to load first because it needs to obtain a certain amount of memory for your containers and images to run. So starting Docker Desktop manually, not on windows startup, then your other programs and tools should, I am saying should as everyone's environment and problems are different from mine and I am not expecting them to be the same, work fine.
So here are the steps:
On opening your computer, mine is Windows 10 using WSL2 with Home, do not immediately have Docker open on startup. Instead, run the program manually by double-clicking the icon or searching in your start menu and clicking on Docker Desktop.
Next, we then want to open Windows Visual Studio Code and other programs after that.
Before running any commands, as I do run them through node js with specific package.json defined commands, check docker desktop as sometimes your containers and images are already running and therefore shouldn't need to run any commands to bring them up again.
If all this fails try going into your settings and allocating specific memory. Check your task manager processes and see what is taking up all of your resources. I hope this helps. Again everyone's environment is not the same so do not expect similar results as I have had. This SHOULD work doesn't mean it will. Read the documentation as well as it does help with identifying problems faster.
Just follow the step:
Go to Troubleshoot in the Docker dashboard.
Click on Clean/Purge data.
Select all options and press delete.
It takes a few minutes.
(that's work for me)
I had the same problem. In my case I had another VM running on Hyper-V that was consuming all the resources. Even after system restart the VM was always active. I opened Hyper-V Administrator and deactivated the problematic VM. Then I could start Docker properly.
My Windows 10 Laptop has 8 GB of RAM. I also use virtual memory.
When i start my OS and immediately run some RAM hungry applications, I can't start Docker until i stop most of the applications.
Yet: https://stackoverflow.com/a/45816385/7082956 helped me as well.
This may happen because the ram is not free at the time you starting docker
I had opened 20 tabs of the browser, that leads to no free ram so I closed all the tabs refresh the computer several times, and tried restarting once again and it works for me
I have faced same issue: Docker out of memory in windows.
I have solved issue, by following three steps.
1. Quit Docker Desktop by clicking mouse right button.
2. Now run Docker Desktop as Administrator.
3. Now restart your windows system.
Now Docker will work properly. This solution has worked for me. :)
Problem:
Installed Docker Desktop.
Got Out of Memory error upon starting with linux instance.
Details:
OS: Windows 10 Professional
Host: Lenovo ThinkPad Carbon X1, 4GB RAM
Docker Desktop: Version 2.1.0.1 (37199)
Docker advanced settings:
CPUs: 2
Memory: 2048MB (this is the maximum)
Swap: 2048MB
Disk Image Size: 59.6GB (4MB used)
Hyper-V settings for DockerDesktopVM:
Settings > Memory > RAM: 2048MB (tried to increase to 4096; still doesn't work)
Settings > Memory > Enable Dynamic Memory (checked/un-checked; both doesn't work)
Under variations of the above settings, Docker Desktop gives this error when starting/ re-starting:
Not enough memory to start Docker Desktop
You are trying to start Docker Desktop but you don't have enough memory.
Free some memory or change your settings.
The problem resolutions reported in the following links, e.g. starting with Windows instance, then switching back to Linux, don't work for me, regardless of how much memory I allocate via Hyper-V or Docker settings.
It is utterly frustrating because apparently people are reporting being able to start with linux instances on host machines with 4GB of RAM. So I wonder what I am doing wrong.
Resources researched/ tried:
https://forums.docker.com/t/not-enough-memory-to-start-docker/13512/24
Docker won't start on Windows: Not Enough memory to start docker
Questions:
Can I even run Docker Desktop with linux instance on my host machine?
If (1) is yes, then what settings will allow me to do this?

How to capture Azure VM Image with "Specialized" VM creation type using power shell? or How to create a Specialized image of a RM VM?

I know that there are two types of virtual machine images, Generalized and Specialized.
If the OS has been generalized/de-provisioned, the virtual machine must be shut down in order to capture it as a VM Image. Once the VM has been captured as a VM Image, the virtual machine will automatically be deleted.
If the OS is specialized, the virtual machine can be captured while it is running or shut down. The captured virtual machine remains untouched. If an application consistent or cross-disk capture is needed, we recommend the virtual machine is shut down prior to capturing the VM Image.
Here I am trying to capture the image without shutting down the VM (Specialised).
I have the below code to capture the image using PowerShell.
Save-AzureRmVMImage -ResourceGroupName $rgame -VMName $vmname -DestinationContainerName $container -VHDNamePrefix $vhdname
but the above code throws the error as below
Save-AzureRmVMImage : Capture operation cannot be completed because the VM is not generalized.
ErrorCode: OperationNotAllowed
ErrorMessage: Capture operation cannot be completed because the VM is not generalized.
StatusCode: 409
I found I can set VM to Generalized using Set-AzureRmVM
Set-AzureRmVM -ResourceGroupName 'CaptureVmImageRG' -Name 'CaptureVmImage' -Generalized
Is there anyway so that I can set VM to Specialized and capture the image. Can someone please provide a working Powershell command to create a Specialized capture of a running VM for backup 'point in time' purposes, or any other mechanism e.g. resource explorer.
Thanks in advance.
The commands Save-AzureRmVMimage and Set-AzureRmVM are used for captureing Generalized images. Before you run the two cmdlet, you should log on to VM and use Sysprep to prepare the hard disk.
On ARM mode, for Specialized image, I don’t think you need use cmdlet to capture the image. You could copy your VHD to another storage account. The copied VHD is a Specialized image. You could use the VHD to recreate a new VM which has your data.
Based on my knowledge, you had better copy the VHD when the VM is stopped. More information please refer to the article
I think using Azure recovery services vault is a better solution. Azure supports backup your VM automatically and no need to stop your VMs. It is easy for you to recovery your VMs. More information please refer to the article.
With classic azure, you can capture specialized VMs as use the resulting image as a quick backup. With ARM azure, the capture command expects the VM to be sysprep'ed/generalized and will actually make the original VM not boot normally anymore. We had a few scary moments when using 'capture' in ARM thinking it was like Classic.
Invoking a manual backup through Recovery Services is an option, but it takes too long! You may say that once the snapshot phase is complete and the process is in the transferring to vault phase, you can continue to use the original VM. But if the backup fails, which may not happen until many hours later, there is no snapshot or new backup to recover from.
So fastest and most reliable way to copy a VM is to just shutdown the VM and then make a copy of the vhds.

How to create a customizable environment that can be rapidly distributed to a local machine?

I am looking for a way to be able to do the following:
Create an instance of Windows with installed prerequisites and configuration
An isolated environment would be recommended (As in it will not modify the existing configuration on local machine only in that VM-like environment)
Ability to use the internet within that environment
Using it sort of like a "check-point" (Start working on it, doing something wrong and being able to start once again from the instance that we created)
Ability to share the environment
Possibility of creating multiple different environments
Low disk usage if possible
Fast deployment of environment on local machine
I have looked into Docker which seems pretty good for what I need, but I want to investigate other options as well because it requires Windows 10 x64 Enterprise
.
Something that works on Windows 7/Server/8/8.1 would be nice
I would also love to get arguments on why X option is better than Y option.
Thanks in advance!
If you want a completely separate environment, creating a Virtual Machine will be worth considering.
There are products from VMware and Oracle to create your virtual machine. I have been using Oracle Virtualbox (Oracle's virtual machine software) for some time now and find it pretty useful.
With a virtual machine it addresses all your concerns:
Create an instance of Windows with installed prerequisites and
configuration - A virtual machine will run on top of your installed OS without making
any modifications in current installation
An isolated environment would be recommended (As in it will not
modify the existing configuration on local machine only in that
VM-like environment) - It runs completely isolated like a separate
machine.
Ability to use the internet within that environment - You can use
internet inside of a virtual machine
Using it sort of like a "check-point" (Start working on it, doing
something wrong and being able to start once again from the instance
that we created) - You can take a snapshot and save the state. Next time when you start the VM it will be started from this state only.
Ability to share the environment - Export a created VM and it can be
reused.
Possibility of creating multiple different environments - You can run
multiple VMs on your machine. Configure the disk usage and RAM
accordingly.
Low disk usage if possible - Configurable while creating a virtual
machine.
Fast deployment of environment on local machine - Yes, you'll need
the .iso image of your Operating System

Run normal Win32 applications in Docker for Windows

I'm a little bit confused about the concept of Docker for Windows.
Can I create a docker container for windows (and a windows host like Server 2016) and install a normal windows application into that container (simple: notepad.exe; advanced some more complex application programmed in Delphi)?
And can I run this container on every Docker enabled (windows) Host? Does the container starts automatically the application inside? Or can a windows docker container only provide service or webbased applications like an IIS website?
if you have Windows Server 2016, you will be able to launch Windows containers (and you will need a Linux server to launch Linux containers).
See those links
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_docker
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/container_setup
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/containers_welcome
In Windows, your Dockerfile will start with
FROM windowsservercore
instead of the more usual
FROM debian
or
FROM ubuntu
See some examples of IIS in (Windows) docker
https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_docker
or a SQL Server in docker
http://26thcentury.com/2016/01/03/dockerfile-to-create-sql-server-express-windows-container-image/
The types of application that are candidates for docker are applications that do not have a UI.
Unlike a VM docker images are very slim having only enough codebase to service a particular use case. You can however create a docker image and use VNC to view a desktop like environment; but you have to go through hoops to configure it. Far easier to have a VM if you need a gui surface.
The strength of docker is to easily create containers of servers and DB back ends. You can even run email servers, or a stack of restful services.
On my laptop I had installed mysql, IIS and PHP. With docker I migrated all of these into an image. I spin it up when I need it and in less than 10 seconds i have a working db backend, an IIS server with PHP interface. I can maintain different versions of mysql, IIS and PHP for different iterations, they are all isolated from each other and run in their own container. When I upgrade my laptop I will not need to install any of these, just the image will work.
I know the topic is a bit old, but since I just tried I thought I'll add my 2ct.
No, you cannot start a Windows application inside a container and expect its windows to appear on your desktop.
While starting such an application is possible, in fact, it's of little use because you won't be able to see or interact with the UI.
For example, you can start notepad.exe in your Windows Core Server container and verify that the process is running (using tasklist instead of taskmanager, which cannot be seen as well).
But you cannot type anything into this notepad instance or access the menu.
Hth,
mav
No. Docker is essentially Linux. Yes, you can run Docker on Windows, but what it in fact does is to install VirtualBox and run a Linux VM inside it. Docker servers generally run on Linux VM's in the cloud. The programs you can put in a Docker container are Linux programs.

Load an AWS instance upon local windows booting up

Our company in moving into Amazon WorkSpaces. We all currently have normal desktop computers winning Windows 7. There are a couple of us who will need local windows and will also be working in the WorkSpace. There are others who will only need to work in there Amazon WorkSpace environment. Is there a way to automatically boot the workspace instance upon windows loading and then when the instance is closed it will shut down windows. Essentially denying those users access to the local copy of windows.
Would also need a way for an administrator to access the local Windows..
Thanks
Looks like what i am trying to do is available in a function that Windows provides. I will look into the functionality of the "Kiosk" function that is available in Windows 7.

Resources