WSL Containers: A Game Changer for Linux on Windows

At Microsoft Build 2026, Microsoft introduced WSL containers — a major evolution in Linux container development directly on Windows through the Windows Subsystem for Linux (WSL). Containers have become a cornerstone of modern development, from cloud-native applications and AI workloads to testing and deployment pipelines. WSL containers simplify this experience by providing a built-in, enterprise-ready way to create, run, and manage Linux containers on Windows, without requiring additional third-party tooling.

You can access the WSL container feature in the latest pre-release of WSL right away by running wsl --update --pre-release, or by downloading and installing it directly from GitHub.

Overview

WSL container adds two major new features to WSL:

  • A built-in Linux container CLI (wslc.exe)
  • An API for Windows applications to run Linux containers as part of their app logic

WSL Container CLI – wslc.exe

When you update to the latest WSL version, you get a new binary on your path: wslc.exe. This CLI tool supports full Linux container development workflows — running, debugging, testing, and more — with a familiar format that respects your existing muscle memory.

For example, you can run a full Linux desktop in a container:

wslc run -d --name=webtop -e PUID=1000 -e PGID=1000 -e TZ=Etc/UTC -p 3000:3000 -p 3001:3001 lscr.io/linuxserver/webtop:ubuntu-kde

Or check GPU access with a CUDA script:

wslc run --rm --gpus all pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

There is also a built-in alias container.exe that maps to wslc.exe, so you can use either command interchangeably.

WSL Container API

Windows applications can now directly use containers as part of their application logic. WSL ships a NuGet package (available on nuget.org and the WSL releases page) with support for C, C++, and C#.

This API integrates with MSBuild and CMake, meaning you can add a few lines to your project files and have container build and deploy steps become part of your application’s build process — no manual steps required. You can git clone and try a sample or check out the full API reference.

Integration with Enterprise Tools

Monitor Security Events with Microsoft Defender for Endpoint (MDE)

WSL’s existing MDE plugin has been updated to be aware of Linux container events, providing the same security coverage whether you are using a WSL distro or containers. This feature is currently available as part of a private preview which you can sign up for here.

Manage WSL Container Settings with Intune

New management settings for WSL container are being added, allowing organizations to:

  • Control whether users can use WSL distros or containers
  • Specify an allowlist of container registries for pulling images

This addresses the top customer ask: “How can I control which distros/Linux images are allowed in my organization?” Currently available via GPO and an ADMX policy, with official Intune dashboard support coming within a few weeks.

VS Code Dev Containers

WSLc support has been added to VS Code Dev Containers in version 0.462.0-pre-release. To set it up, open the VS Code Dev Container settings, find the “Docker Path” setting, and change it to wslc. This is currently in pre-release and will soon move to general availability.

Further WSL Improvements

Alongside the container feature, Microsoft is making significant improvements to the underlying technology powering both WSL and WSL container:

  • New default file system (virtiofs): Makes Windows file access 2x faster
  • New default networking mode (Consomme): Relays Linux network traffic through Windows, allowing Linux applications to benefit from the same networking environment, security policies, and enterprise integrations available to Windows applications
  • Improved memory reclaim techniques: Gradually and consistently releases memory back to the Windows host when not in use

These lower-level platform changes will also benefit other container tools built on WSL, such as Docker Desktop, Podman Desktop, and Rancher Desktop.

Learn More

You can view the presentation from Build 2026 to learn more about the use cases and see demos. Additionally, visit the WSL container docs page for in-depth guides and sample code.

Feedback and What’s Next

This feature is currently in the pre-release version of WSL as a public preview. Microsoft aims to make WSL containers generally available in fall 2026. Install it, try it out, and file issues and feedback at the WSL GitHub page.

Source: Microsoft Dev Blogs – WSL container is now available for public preview by Craig Loewen, Senior Product Manager

Deploy Flask Web App- Set up Apache as a reverse proxy to Gunicorn

Deploying a Flask app to a Fedora Linux server involves several steps to ensure your app runs smoothly and securely. Here’s a step-by-step guide:

Step-by-Step Guide to Deploy a Flask App to Fedora Linux Server

  1. Set Up Your Fedora Server: Ensure your server is up-to-date and has Python installed. You can update your server and install Python with the following commands: sudo dnf update sudo dnf install python3 python3-venv
  2. Create a Virtual Environment: Set up a virtual environment to manage your project’s dependencies: python3 -m venv myenv source myenv/bin/activate
  3. Install Flask and Gunicorn: Install Flask and Gunicorn within your virtual environment: pip install Flask gunicorn
  4. Create Your Flask App: Develop your Flask application and save it in a directory (e.g., myapp). Here’s a simple example (app.py):
    from flask import

    Flask app = Flask(__name__)

    @app.route('/')
    def home():
    return "Hello, World!"

    if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)
  5. Test Your Flask App Locally: Before deploying, test your app locally to ensure it works: python app.py Access your app at http://localhost:5000.
  6. Set Up Gunicorn: Configure Gunicorn to serve your Flask app:

    gunicorn --bind 127.0.0.1:5000 app:app

    Replace app:app with module_name:class_name if your app is structured differently.
    module_name is the python file which will act as the entry point for the web app in this example it is app.py so the module_name is app
    class_name : is the class that references a flask instance . In this example you can see
    Flask app = Flask(__name__) ” , so the class_name is app .
  7. Deploy Your App: Transfer your Flask app to the server and run it with Gunicorn:
    if your source code is checked in to git , then use the following , else copy the source files to a directory on a server . The following is the example with git .
    git clone https://your_repository_url.git
    cd your_repository_directory
    #activate virtual environment
    source myenv/bin/activate
    # run the app to verify if gunicorn is serving the web app by doing the following :
    sudo gunicorn --bind 127.0.0.1:5000 app:app
    Open your web browser and navigate to http://localhost:5000. to see your Flask app running on the Fedora server.

Now in production deployments we need to ensure that the app is accessible through a url , so we can do that by setting up a reverse proxy . This setup uses Apache as a reverse proxy and Gunicorn as the WSGI server to serve your Flask app. The steps are described below :

Using Apache as a Reverse Proxy to Gunicorn in Fedora Linux(same applies for other distros too)

Create a system d service

Create a system d service for gunicorn so that it runs continuously in the back ground listening to the port of your web app .
For example Create a systemd service file for Gunicorn, for example, /etc/systemd/system/myapp.service

Example systemd Service File for Gunicorn:

```ini
[Unit]
Description=Gunicorn instance to serve my Flask app
After=network.target

[Service]
User=flaskuser
Group=flaskgroup
WorkingDirectory=/var/www/myproject
Environment="PATH=/var/www/myproject/myenv/bin"
ExecStart=/var/www/myproject/myenv/bin/gunicorn --workers 3 --bind 127.0.0.1:5000 app:app

[Install]
WantedBy=multi-user.target
```
Reload systemd and Start the Gunicorn Service:
sudo systemctl daemon-reload
sudo systemctl start myapp.service
sudo systemctl enable myapp.service

Configure Reverse Proxy in Apache web server

  1. Install Apache2: If you haven’t installed Apache2 yet, you can do so with the following command:
    bash sudo apt install apache2
  2. Enable Necessary Apache Modules: Enable the required Apache modules for proxying HTTP requests.
    sudo a2enmod proxy
    sudo a2enmod proxy_http
    sudo a2enmod headers
    sudo a2enmod deflate
  3. Create a Virtual Host Configuration: Create or edit your Apache virtual host configuration file. For example, create a configuration file named myapp.conf in the /etc/apache2/sites-available/ directory.
    sudo vi /etc/apache2/sites-available/myapp.conf
    Add the following configuration . Let us say we use port 8035 which inturn routes the traffic to port 8000 where the gunicorn serves the web app
    <VirtualHost *:8035>
    ServerName myhobby.com
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/
    ErrorLog ${APACHE_LOG_DIR}/myapp_error.log CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
    </VirtualHost>
    This configuration will forward requests from myhobby.com to the Gunicorn server running on http://127.0.0.1:8000.
  4. Enable the Site Configuration: Enable your new site configuration and disable the default site configuration if necessary.
    sudo a2ensite myapp.conf
    sudo a2dissite 000-default.conf (if we are using port 80 used by default conf)
  5. Restart Apache: Restart Apache to apply the new configuration.
    sudo systemctl restart apache2
  6. Reload Apache: Restart Apache to apply the new configuration.
    sudo systemctl restart httpd
  7. Verify the app : Ensure your Flask app is running by opening a browser session with url
    http://localhost : 8035/. This should display a web page with hello world.

By setting up Apache as a reverse proxy to Gunicorn, Apache will handle incoming HTTP requests, pass them to Gunicorn, and then return the responses to the clients. This setup allows you to leverage Apache’s robust features while efficiently serving your Flask application with Gunicorn.

WSL Error- Processing fstab with mount -a failed

i installed windows subsystem for linux + now i am gettign the following error <3>WSL (8) ERROR: CreateProcessParseCommon:754: getpwuid(0) failed 2
Processing fstab with mount -a failed.
<3>WSL (8) ERROR: CreateProcessEntryCommon:331: getpwuid(0) failed 2
<3>WSL (8) ERROR: CreateProcessEntryCommon:502: execvpe /bin/sh failed 2
<3>WSL (8) ERROR: CreateProcessEntryCommon:505: Create process not expected to return

To resolve the issue:
The reason for this error could be if the default WSL distribution is set to an incorrect value
Open PowerShell as an administrator.
For e.g if you had installed ubuntu then you can set it as default distribution
Run the command wsl –setdefault Ubuntu to set the default WSL distribution to Ubuntu. Replace Ubuntu with the name of the distribution you want to use.
Restart your computer.
Open PowerShell as an administrator again.
Run the command wsl to start the default WSL distribution.

Linux Series

What is Linux ?

Linux is an Free / Open source Operating system . It is named after Linus Torvalds – the creator of Linux kernel . It is also referred to as GNU/Linux (GNU slash Linux) giving credit to the GNU project components that the make the OS complete in addition to the kernel .Linux has various distributions owned and supported by various communities . To name a few are as follows – Arch Linux , Fedora Linux , Linux Mint,Android ,Debian Linux etc.,

What is a linux Kernel ?

Kernel is the heart of the Operating System . It is mostly Composed of Device Drives Supporting Various hardware that is ported to the OS .

Linux File System

Linux follows a hierarchical file system starting from “/” which is referred to as root .