DEV Community

Vinicius Brasil
Vinicius Brasil

Posted on

Developing on Windows: Docker, Linux VM, WSL or Cygwin?

(I'm currently a Mac user, switching to a Dell laptop)

Macs are expensive and Linux has some hardware compatibility problems. That leaves me with Windows.

Most developers I know hate to develop on Windows, unless they're developing .NET applications, which is not my case. Also, I'm very happy with my Unix shell and I don't want to use PowerShell or the terrible Windows CMD.

Don't get me wrong, Windows 10 is great. Microsoft is getting its groove back. And to develop on Windows as a main OS (without dual boot), there are some choices:

1) Docker for Windows
2) Linux VM (VMWare, Virtual Box, Hyper-V)
3) Windows Subsystem for Linux (that is pretty neat)
4) Cygwin

These options give my Unix shell back, and makes development much easier.

Have anyone used any of these options?

Top comments (16)

teacult profile image
Gediz GÜRSU • Edited

I only do functional prototype softwares to present ideas and then let a team develop it professionally. I use node.js - (i)python3 w/ jupyter mainly scipy sympy and use lots of bash commands to deal with hw, os and networking.

I am also a 40 years old honeybadger FPS and MMORPG gamer (god its tiring) and use windows for gaming purposes. Integration of two for both developing and gaming was one of my interest in last years.

Used these roads :
Staying on Linux
1) Lutris (wine bottle manager - with Directx to Vulkan API translation support) many games works even faster ..
2) Windows with cygwin on VmWare Player

3) Windows on qemu kvm with and without gpu passthrough --> virtual gpu and gpu passtrough so that you can open it on a windows with spice or connect it via reminna (RDP) or any vnc (teamviewer etc)
3.b) There is also LookingGlass in github for using accelerated passedthrough hw in windowed mode
4) Docker on both ... Works very good since first quarter of 2019

5) I connected some mainboards via pci-e and configured device lending so share cpu and gpu dynamically with some kernel virtual machines and trying communicate two system at very low level these days to use some microservices....They call it elastic cloud or something. I just want to make a giant machine with Linux windows and osx dynamically using hw as needed ...

Staying on Windows :
1) Linux VMware player , not bad ...
2) Cygwin ... very limited but practical
3) Remote connection to a linux box ...

Alternatives :
-- Developing on web so that you are platform independent
-- Developing for a vm with a very light kernel with customized such as archlinux ... (Security becomes better - worse , better because it works in your terms worse because its a vm and can spoof hardware ID's)

Best Solution in my opinion:
1) Keep your machine dual boot with 2 seperate hard drivers and keep a mac vm or a real mac laptop which can also triple boot all 3 os ... and take regular backups with dd | pigz and cp with cloud drives and use gits...

However I am a mechanical engineer (trying to invent new things) . I have macOS - iOS (wrote iphone apps) - Obj-C , C , python, javascript in my sleeve however my deal is matlab, anysy, cad cam via either software or open libraries... Keep in mind that I am not full-fledged developer... And my codes are just functional prototypes ...

bgadrian profile image
Adrian B.G.

I tried to do web dev on Windows 10 in 2018. I spent more then 40h on stackoverflow, github issues and google. Bottom line, because is not a popular platform for devs many libraries had issues and I ended up using C9 IDE for some nodeJS projects.

Docker had a missing feature on Windows, I forgot which one. WSL is useless because of the file system limitations, I could not put the project files with the IDE running in windows space.

Any container/VM will add a layer of complexity on debuging mostly and made everything a lot more complex.

I would deal with those hardware compatibilty issues rather than tring to use windows for dev.

sergiomeneses profile image
Sergio Meneses

Hi Vinicius, to be honest, I would recommend you only the first choice "Docker for Windows". But if you have the chance of using a Linux OS please go for it.

Docker for Windows has been growing very fast and the integration is pretty good.

teoulas profile image
Theodoros Orfanidis • Edited

I'm using Docker for everything. Having gone through the same transition (Mac to Dell XPS), on Windows, I settled for a combination of Docker and WSL. I've blogged about it here:

While the setup described in the post linked above is certainly workable, nothing beats a native Linux installation. Docker's file IO is slower (fortunately not as slow as on a Mac) and depending on the projects you work on, you might need to add docker-sync into the mix.

vinibrsl profile image
Vinicius Brasil

Great! Just a quick question: why WSL + Docker instead of Docker for Windows?

teoulas profile image
Theodoros Orfanidis

It is Docker for Windows. I use WSL for git, vim and all the Linux tools. If you don't need or use any Linux tools, you don't need WSL I guess.

gazzonyx profile image
Scott Lovenberg

I use a Fedora Linux desktop VM for development. Formatted as VMDK, I can run under just about any virtualization or containerization platform with at most a format change of the disk image, by using virtualbox's dish format utilities to change from VMDK to raw or others. Virtual box, VMware player, VMware server, etc. are available for Linux, Mac and Windows. That means I also backup my Dev desktop by simply copying the file and compressing it. Inside the VM I can run libvirt with docker, lxc, vagrant, and what have you with hardware support for nested virtualization. Also, it makes upgrades of my Dev machine a snap. Whichever platform I'm on, I start up the VM on login and see it to full screen on all screens. It's seamless, maintainable, easy, and works everywhere.

Also, it gives me the ability to snapshot clean builds after I add my timing and after Dev stack upgrades that could go sideways. Never again do I have to completely uninstall and reinstall Ruby after a "yum upgrade" borks my build. Try it, you'll thank me. ;)

ferricoxide profile image
Thomas H Jones II

Depends on the nature of the development you're doing. If there's any likelihood that what you're planning to do will require running in a native space, then a VM is going to be your best bet (whether hosted locally or "in the cloud"). The first three options you list fall under the "VM" heading, to a greater or lesser degree.

I've used Cygwin/X for over a decade. However, that use has mostly been as a management interface. It's good for things like SSH'ing to remote systems, running tools like the AWS CLI, basic editing of programs (that will be run elsewhere) or displaying remote X-clients' output to. For actual coding that is influenced by the environment it runs in, it's not adequately insulated/abstracted from the host it's running on as it's really just a shell (you'll especially see this in code that relies on multi-threading or low-level I/O manipulation).

yorodm profile image
Yoandy Rodriguez Martinez

Don't, just don't, I've been using Windows for quite a while now (work mandated) and I spend more time figuring out how to deal with it's quirks.

bgadrian profile image
Adrian B.G.

I meant it did not supported file watcher and also it was highly recommended to not modify the files under the linux mounts in WSL with windows processes (IDE), which beats the purpose of WSL for a dev.

Thread Thread
egherrmann profile image
Eric Herrmann

If it didn't work for you I have no interest in trying to convert you but I've had nothing but success developing using WSL for the past few years. It's true that you shouldn't access anything under WSL "/" from windows but I'm able to work exclusively out of the Windows space (/mnt/c) for everything. I can read and write those files from Windows VScode, etc. and from my Linux utilities running in WSL. And you can create symlinks in WSL-land to conveniently access My Documents, Downloads, etc. in Windows. Obviously your success will depend on the kind of work you're doing but for my needs I'm 100% satisfied with WSL

Thread Thread
bgadrian profile image
Adrian B.G.

Sounds good,maybe I will try it again in a few years.

For now I no longer need windows so I can stay on a linux for full time. In that time I was on Unity3D too which is awful on Linux.

juanfrank77 profile image
Juan F Gonzalez

I'm currently using WSL for developing purposes, a really cool feature in the latest update of Windows is the ability to share Env variables across your bash and cmd CLI. If it helps I'm working on a project which uses a PHP framework and Angular with some JQuery.

hutnejp profile image
hutnej pomlask

0) Docker under Win - as soon as I found out that Docker doesn't like any other Hypervisor solutions anywhere near itself, it was a nope from me. I mean, virtualising apps as containers is tremendous idea but ey.. I need to virtualise entire platforms and Docker will tell you that you need to uninstall your Hypervisors before its deploy. Yeah.. Naah.

1) Honestly? I'd rather go with VirtualBox rather than Hyper-V. Virtualbox is pretty neat, capable and free. Most corporations prefer Hyper-V though. I think it's just my subjective opinion but Hyper-V always finds it's way how to create cheeky like obstacle or tricky/weird issue here and there for me. VMware is a complex solution. If you mean business, it's the weapon of choice. I run half of the company's IT on that shit as well as debian distros on my laptop.

2) Drivers mate.. For the odd SSH job, quick bits and bobs it's fine. Don't expect you gonna run IDE on it. That would be just pain.

3) Can't tell. I don't have an experience in Cygwin.

Conclusion: Windows is for Visual Studio. For everything else there is Linux VM.

PS: XPS is for kids. Big boys do Precision.

aghost7 profile image
Jonathan Boudreau

Just wanted to say, if you're going to be using a Dell Laptop, Linux will most likely work perfectly fine. Dell even sells laptops with Ubuntu pre-installed.

stonefruit profile image

Visual Studio Code has a new remote-ssh that acts like c9. You can use a server in a VM with this.