
Executar Windows dentro de um container Docker com aceleração KVM, instalação automática e recursos personalizáveis. Suporta múltiplas versões do Windows, passagem de USB e rede macvlan.
<h1 align="center">Windows<br />
<div align="center">
<a href="https://github.com/dockur/windows"><img src="https://raw.githubusercontent.com/dockur/windows/master/.github/logo.png" title="Logo" style="max-width:100%;" width="96" /></a>
</div>
<div align="center">
[![Build]][build_url]
[![Version]][tag_url]
[![Size]][tag_url]
[![Package]][pkg_url]
[![Pulls]][hub_url]
</div></h1>
Windows dentro de um contentor Docker.
## Funcionalidades ✨
- Executa Windows dentro de um contentor Docker
- Transferência automática e instalação sem intervenção
- Suporte para versões modernas e legadas do Windows
- Desempenho quase nativo com aceleração KVM
- Alocação personalizável de CPU, memória e armazenamento
- Alocação dinâmica de memória com ballooning de memória
- Passagem de USB e partilha de pastas do anfitrião
- Suporte para redes NAT, modo de utilizador, macvlan e macvtap
## Vídeo 📺
[](https://www.youtube.com/watch?v=xhGYobuG508)
## Utilização 🐳
##### Docker Compose:
```yaml
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "11"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
volumes:
- ./windows:/storage
restart: always
stop_grace_period: 2m
```
##### Docker CLI:
```bash
docker run -it --rm --name windows -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 docker.io/dockurr/windows
```
##### Kubernetes:
```shell
kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml
```
##### GitHub Codespaces:
[](https://codespaces.new/dockur/windows)
##### Instalador gráfico:
[](https://winboat.app)
## Requisitos ⚙️
- Docker ou Podman num anfitrião Linux com suporte KVM.
- Docker Desktop ou Podman (Desktop) no Windows 11 com virtualização aninhada ativada.
- Pelo menos 4 GB de RAM disponível.
- Pelo menos 64 GB de espaço livre em disco.
> [!NOTE]
> O Docker Desktop no Linux, macOS e Windows 10 atualmente não fornece acesso KVM aos contentores e, portanto, não é suportado.
## FAQ 💬
### Como uso?
Muito simples! Estes são os passos:
- Inicie o contentor e conecte-se à [porta 8006](http://127.0.0.1:8006/) usando o seu navegador web.
- Relaxe enquanto a mágica acontece, toda a instalação será realizada de forma totalmente automática.
- Assim que vir a área de trabalho, a sua instalação do Windows está pronta para uso.
Aproveite a sua nova máquina e não se esqueça de dar uma estrela neste repositório!
### Como seleciono a versão do Windows?
Por padrão, o Windows 11 Pro será instalado. Mas pode adicionar a variável de ambiente `VERSION` ao seu ficheiro compose, para especificar uma versão alternativa do Windows a ser transferida:
```yaml
environment:
VERSION: "10"
```
Selecione entre os valores abaixo:
| **Valor** | **Versão** | **Tamanho** |
|---|---|---|
| `11` | Windows 11 Pro | 7,9 GB |
| `11l` | Windows 11 LTSC | 4,7 GB |
| `11e` | Windows 11 Enterprise | 6,6 GB |
||||
| `10` | Windows 10 Pro | 5,7 GB |
| `10l` | Windows 10 LTSC | 4,6 GB |
| `10e` | Windows 10 Enterprise | 5,2 GB |
||||
| `8e` | Windows 8.1 Enterprise | 3,7 GB |
| `7u` | Windows 7 Ultimate | 3,1 GB |
| `vu` | Windows Vista Ultimate | 3,0 GB |
| `xp` | Windows XP Professional | 0,6 GB |
| `2k` | Windows 2000 Professional | 0,4 GB |
||||
| `2025` | Windows Server 2025 | 7,6 GB |
| `2022` | Windows Server 2022 | 6,0 GB |
| `2019` | Windows Server 2019 | 5,3 GB |
| `2016` | Windows Server 2016 | 6,5 GB |
| `2012` | Windows Server 2012 | 4,3 GB |
| `2008` | Windows Server 2008 | 3,0 GB |
| `2003` | Windows Server 2003 | 0,6 GB |
> [!TIP]
> Para instalar versões ARM64 do Windows, use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
### Como altero a localização do armazenamento?
Para alterar a localização do armazenamento, inclua a seguinte montagem bind no seu ficheiro compose:
```yaml
volumes:
- ./windows:/storage
```
Substitua o caminho de exemplo `./windows` pela pasta de armazenamento ou volume nomeado desejado.
### Como altero o tamanho do disco?
Para expandir o tamanho padrão de 64 GB, adicione a definição `DISK_SIZE` ao seu ficheiro compose e defina-o para a capacidade pretendida:
```yaml
environment:
DISK_SIZE: "256G"
```
> [!TIP]
> Isso também pode ser usado para redimensionar um disco existente para uma capacidade maior sem perda de dados. No entanto, precisará [estender manualmente a partição do disco](https://learn.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume?tabs=disk-management) depois, pois o espaço de disco adicionado aparecerá como não alocado.
### Como partilho ficheiros com o anfitrião?
Após a instalação, haverá uma pasta chamada `Shared` na sua área de trabalho, que pode ser usada para trocar ficheiros com a máquina anfitriã.
Para selecionar uma pasta no anfitrião para este fim, inclua a seguinte montagem bind no seu ficheiro compose:
```yaml
volumes:
- ./example:/shared
```
Substitua o caminho de exemplo `./example` pela sua pasta partilhada desejada, que então se tornará visível como `Shared`.
### Como altero a quantidade de CPU ou RAM?
Por padrão, o Windows poderá usar 2 núcleos de CPU e 4 GB de RAM.
Se quiser ajustar isso, pode especificar a quantidade desejada usando as seguintes variáveis de ambiente:
```yaml
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
```
### Como configuro o nome de utilizador e a palavra-passe?
Por padrão, é criado um utilizador chamado `Docker` e a sua palavra-passe é `admin`.
Se quiser definir credenciais diferentes durante a instalação, pode configurá-las no seu ficheiro compose:
```yaml
environment:
USERNAME: "bill"
PASSWORD: "gates"
```
### Como seleciono o idioma do Windows?
Por padrão, a versão inglesa do Windows será transferida.
Mas pode adicionar a variável de ambiente `LANGUAGE` ao seu ficheiro compose, para especificar um idioma alternativo a ser transferido:
```yaml
environment:
LANGUAGE: "French"
```
Pode escolher entre: 🇦🇪 Árabe, 🇧🇬 Búlgaro, 🇨🇳 Chinês, 🇭🇧 Croata, 🇨🇿 Checo, 🇩🇰 Dinamarquês, 🇳🇱 Holandês, 🇬🇧 Inglês, 🇪🇪 Estónio, 🇫🇮 Finlandês, 🇫🇷 Francês, 🇩🇪 Alemão, 🇬🇷 Grego, 🇮🇱 Hebraico, 🇭🇺 Húngaro, 🇮🇹 Italiano, 🇯🇵 Japonês, 🇰🇯 Coreano, 🇱🇻 Letão, 🇱🇹 Lituano, 🇳🇴 Norueguês, 🇵🇹 Polaco, 🇵🇹 Português, 🇷🇴 Romeno, 🇷🇺 Russo, 🇷🇸 Sérvio, 🇸🇮 Eslovaco, 🇸🇮 Esloveno, 🇪🇸 Espanhol, 🇸🇪 Sueco, 🇹🇭 Tailandês, 🇹🇷 Turco e 🇺🇦 Ucraniano.
### Como seleciono o layout do teclado?
Se quiser configurar um layout de teclado ou localidade que não seja o padrão para o idioma selecionado, pode adicionar as variáveis `KEYBOARD` e `REGION` assim:
```yaml
environment:
REGION: "en-US"
KEYBOARD: "en-US"
```
### Como instalo uma imagem personalizada?
Para transferir uma imagem ISO não suportada, especifique o seu URL na variável de ambiente `VERSION`:
```yaml
environment:
VERSION: "https://example.com/win.iso"
```
Alternativamente, também pode saltar a transferência e usar um ficheiro local, vinculando-o no seu ficheiro compose desta forma:
```yaml
volumes:
- ./example.iso:/custom.iso
```
Substitua o caminho de exemplo `./example.iso` pelo nome do seu ficheiro ISO desejado. O valor de `VERSION` será ignorado neste caso.
### Como executo um script após a instalação?
Para executar o seu próprio script após a instalação, pode criar um ficheiro chamado `install.bat` e colocá-lo numa pasta juntamente com quaisquer ficheiros adicionais necessários (por exemplo, software a ser instalado).
Em seguida, vincule essa pasta no seu ficheiro compose assim:
```yaml
volumes:
- ./example:/oem
```
A pasta de exemplo `./example` será copiada para `C:\OEM` e o ficheiro `install.bat` dentro dessa pasta será executado durante o último passo da instalação automática.
### Como realizo uma instalação manual?
Recomenda-se manter a instalação automática, pois ajusta várias definições para evitar problemas comuns ao executar Windows dentro de um ambiente virtual.
No entanto, se insistir em realizar a instalação manualmente (por sua conta e risco), adicione a seguinte variável de ambiente ao seu ficheiro compose:
```yaml
environment:
MANUAL: "Y"
```
### Como me conecto usando RDP?
O visualizador web destina-se principalmente ao uso durante a instalação, pois é menos responsivo que o RDP e não suporta funcionalidades como partilha de área de transferência.
Assim, para uma melhor experiência, pode conectar-se usando qualquer cliente Microsoft Remote Desktop ao IP do contentor, usando o nome de utilizador `Docker` e a palavra-passe `admin`.
Existe um cliente RDP para [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) disponível na Play Store e um para [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) na Apple Store. Para Linux pode usar [FreeRDP](https://www.freerdp.com/) e no Windows basta escrever `mstsc` na caixa de pesquisa.
### Como ativo o áudio?
O áudio está desativado por padrão, a menos que esteja a usar RDP. Para transmiti-lo para o navegador, adicione a seguinte variável de ambiente:
```yaml
environment:
AUDIO: "Y"
```
Em seguida, ative **Áudio** em **Definições → Avançadas** no visualizador web. A transmissão está ativa apenas enquanto esta opção estiver ativada, portanto, não consome largura de banda extra caso contrário.
### Como atribuo um endereço IP individual ao contentor?
Por padrão, o contentor usa rede bridge, que partilha o endereço IP com o anfitrião.
Se quiser atribuir um endereço IP individual ao contentor, pode criar uma rede macvlan da seguinte forma:
```bash
docker network create -d macvlan \
--subnet=192.168.0.0/24 \
--gateway=192.168.0.1 \
--ip-range=192.168.0.100/28 \
-o parent=eth0 vlan
```
Certifique-se de modificar esses valores para corresponder à sua sub-rede local.
Após criar a rede, altere o seu ficheiro compose para o seguinte:
```yaml
services:
windows:
container_name: windows
..<snip>..
networks:
vlan:
ipv4_address: 192.168.0.100
networks:
vlan:
external: true
```
Uma vantagem adicional desta abordagem é que não precisará mais de fazer mapeamento de portas, pois todas as portas serão expostas por padrão.
> [!IMPORTANTE]
> Este endereço IP não será acessível a partir do anfitrião Docker devido ao design do macvlan, que não permite comunicação entre os dois. Se isso for uma preocupação, precisa de criar um [segundo macvlan](https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access) como solução alternativa.
### Como pode o Windows adquirir um endereço IP do meu router?
Após configurar o contentor para [macvlan](#como-atribuo-um-endereço-ip-individual-ao-contentor), é possível que o Windows se torne parte da sua rede doméstica solicitando um IP ao seu router, tal como um PC real.
Para ativar este modo, no qual o contentor e o Windows terão endereços IP separados, adicione as seguintes linhas ao seu ficheiro compose:
```yaml
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
```
### Como adiciono múltiplos discos?
Para criar discos adicionais, modifique o seu ficheiro compose assim:
```yaml
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- ./example2:/storage2
- ./example3:/storage3
```
### Como faço passagem de um disco?
Pode passar dispositivos de disco ou partições diretamente, adicionando-os ao seu ficheiro compose desta forma:
```yaml
devices:
- /dev/sdb:/disk1
- /dev/sdc1:/disk2
```
Use `/disk1` se quiser que se torne a sua unidade principal (que será formatada durante a instalação) e use `/disk2` e superiores para adicioná-los como unidades secundárias (que permanecerão intocadas).
### Como faço passagem de um dispositivo USB?
Para passar um dispositivo USB, primeiro procure os seus IDs de fabricante e produto através do comando `lsusb`, depois adicione-os ao seu ficheiro compose assim:
```yaml
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
- /dev/bus/usb
```
> [!AVISO]
> Adicionar um dispositivo de armazenamento USB antes da Configuração do Windows terminar pode fazê-la falhar. Ou pior: a unidade pode ser formatada como disco do sistema, e todos os seus dados serão perdidos! Portanto, mantenha-os sempre desconectados ao iniciar o contentor pela primeira vez.
### Estas são todas as opções disponíveis?
Não. Para uma visão geral completa de todas as definições suportadas, veja a página de [variáveis de ambiente](https://github.com/dockur/windows/blob/master/docs/environment.md).
### Como verifico se o KVM está disponível?
Primeiro, certifique-se de que a sua plataforma e runtime do contentor cumprem os [requisitos](#requisitos-️) listados acima.
Num anfitrião Linux, instale o `cpu-checker` e execute:
```bash
sudo apt install cpu-checker
sudo kvm-ok
```
Uma configuração funcional deve reportar:
```text
KVM acceleration can be used
```
Também pode verificar se o dispositivo KVM existe:
```bash
ls -l /dev/kvm
```
Se o KVM não estiver disponível, verifique se:
- A virtualização de hardware (`Intel VT-x` ou `AMD-V`) está ativada na sua BIOS ou UEFI.
- A virtualização aninhada está ativada quando o anfitrião é ele próprio uma máquina virtual.
- O seu VPS ou fornecedor de cloud suporta virtualização aninhada.
Se `kvm-ok` for bem-sucedido, mas o contentor ainda reportar que o KVM não está disponível, pode adicionar temporariamente `privileged: true` ao seu ficheiro Compose para descartar um problema de permissão ou acesso ao dispositivo.
### Como executo macOS num contentor?
Pode usar [dockur/macos](https://github.com/dockur/macos) para isso. Partilha muitas das mesmas funcionalidades, exceto a instalação automática.
### Como executo um ambiente de trabalho Linux num contentor?
Pode usar [qemus/qemu](https://github.com/qemus/qemu) nesse caso.
### Este projeto é legal?
Sim, este projeto contém apenas código de código aberto e não distribui o Windows propriamente dito. Quaisquer chaves de produto encontradas no código são chaves de instalação genéricas publicadas pela Microsoft para fins de teste e não são licenças de ativação válidas.
É responsável por garantir que possui uma licença válida do Windows e que o seu uso cumpre os termos de licenciamento da Microsoft.
## Estrelas 🌟
[](https://github.com/dockur/windows/stargazers)
## Aviso Legal ⚖️
*Os nomes de produtos, logótipos, marcas e outras marcas registadas referidas neste projeto são propriedade dos seus respetivos titulares. Este projeto não é afiliado, patrocinado ou endossado pela Microsoft Corporation.*
[build_url]: https://github.com/dockur/windows/
[hub_url]: https://hub.docker.com/r/dockurr/windows/
[tag_url]: https://hub.docker.com/r/dockurr/windows/tags
[pkg_url]: https://github.com/dockur/windows/pkgs/container/windows
[Build]: https://github.com/dockur/windows/actions/workflows/build.yml/badge.svg
[Size]: https://img.shields.io/docker/image-size/dockurr/windows/latest?color=066da5&label=size
[Pulls]: https://img.shields.io/docker/pulls/dockurr/windows.svg?style=flat&label=pulls&logo=docker
[Version]: https://img.shields.io/docker/v/dockurr/windows/latest?arch=amd64&sort=semver&color=066da5
[Package]: https://img.shields.io/badge/dynamic/json?url=https://ipitio.github.io/backage/dockur/windows/windows.json&query=$.downloads&logo=github&style=flat&color=066da5&label=pulls