💻 Docker 컨테이너 내 Windows
Vagrant VM, libvirt, docker-compose의 힘을 이용하여 리눅스 시스템에서 Windows OS(x64)를 배포하는 혁신적이고 효율적인 방법을 발견하세요. 이 기술들은 함께 Windows OS를 컨테이너화하여, Windows 인스턴스를 Docker 컨테이너처럼 관리할 수 있게 합니다. 기존 워크플로우에 원활하게 통합되어 편리함을 크게 향상시키고 자원 할당을 최적화합니다.⭐ 도움이 되셨다면 프로젝트에 별점을 꼭 남겨주세요!
📋 전제 조건
시스템이 다음 요구 사항을 충족하는지 확인하세요:
- Docker: 버전 20 이상 (Docker 설치)
- 호스트 OS: 리눅스
- 가상화 활성화:
- 확인 명령:
lscpu | grep -i Virtualization- 출력 결과:
VT-x→ Intel 가상화 지원 및 활성화AMD-V→ AMD 가상화 지원 및 활성화- 가상화가 활성화되어 있지 않으면 BIOS/UEFI 설정에서 활성화하세요.
- compose 파일에
cgroup: host필요: libvirt와 관련 데몬들이 완전한 cgroup 접근 권한이 필요하며, 그렇지 않으면 cgroup v2 호스트에서 컨테이너가 시작되지 않습니다.
🚀 배포 가이드
- 환경 파일
.env를 생성하거나 업데이트하세요.
# Vagrant image settings
MEMORY=8000 # MiB (~8 GB)
CPU=4
DISK_SIZE=100 # GiB
docker-compose.yml생성하기
services:
win10:
image: docker.io/vaggeliskls/windows-in-docker-container:latest
platform: linux/amd64
env_file: .env
stdin_open: true
tty: true
privileged: true
cgroup: host
restart: always
ports:
- 3389:3389
- 2222:2222
docker-compose.override.yml을 생성하세요services:
win10:
volumes:
- libvirt_data:/var/lib/libvirt
- vagrant_data:/root/.vagrant.d
- vagrant_project:/app/.vagrant
- libvirt_config:/etc/libvirt
volumes:
libvirt_data:
name: libvirt_data
vagrant_data:
name: vagrant_data
vagrant_project:
name: vagrant_project
libvirt_config:
name: libvirt_config
- Run:
docker compose up -d
docker compose logs -f로 확인하세요.모든 것을 삭제하려면 docker compose down -v
🌐 접근
원격 데스크톱 (RDP)
디버깅이나 테스트를 위해 포트3389에서 원격 데스크톱을 사용하여 VM에 연결할 수 있습니다. #### 원격 데스크톱 접속용 소프트웨어
| 운영체제 | 소프트웨어 |
|----------|----------------|
| 리눅스 | rdesktop → rdesktop 또는 Remmina |
| 맥OS | Microsoft Remote Desktop |
| 윈도우 | 내장된 원격 데스크톱 연결 |
SSH
administrator 또는 Vagrant 사용자 자격증명을 사용하여 SSH로 연결할 수 있습니다.ssh @ -p 2222
🔑 사용자 로그인
Vagrant 이미지 기반 기본 사용자는 다음과 같습니다:- 관리자
- 사용자 이름: Administrator
- 비밀번호: vagrant
- 사용자
- 사용자 이름: vagrant
- 비밀번호: vagrant
⚠️ 제한 사항
- Linux 호스트 전용 —
/dev/kvm및 libvirt에 의존; macOS 및 Windows 호스트는 지원하지 않습니다. - 평가판 라이선스 — 기본 박스는 Windows Server 2022 평가판을 제공합니다. Microsoft의 평가 조건에 따라 활성화가 만료됩니다.
- 동기화 폴더 없음 —
rsync,smb,nfs모두 Vagrantfile에서 비활성화되어 있습니다 (rsync는 프로비저닝 실행 전 Windows 측 설치가 필요; SMB 동기화 폴더는 Linux 호스트에서 지원하지 않음; 컨테이너 내 NFS는현재 커널에서 지원하지 않음오류 발생). - 성능 — Docker에 중첩 KVM이 없으면(예: KVM을 노출하지 않는 클라우드 VM) 게스트는 일반 QEMU로 대체되어 여러 배 느려집니다.
🔧 문제 해결
- 로그에
KVM 가속을 사용할 수 없음표시 → 호스트가/dev/kvm을 노출하지 않음. BIOS에서 가상화가 활성화되어 있는지,kvm모듈이 로드되었는지(lsmod | grep kvm), 호스트에/dev/kvm이 존재하는지 확인하세요. 시작 스크립트는 자동으로 QEMU로 대체되며, 큰 속도 저하가 예상됩니다. - 포트 3389 / 2222가 이미 사용 중 → 호스트에서 다른 RDP/SSH 서비스가 바인딩되어 있습니다. 서비스를 중지하거나
docker-compose.yml에서 호스트 쪽 포트 매핑을 변경하세요. - 컨테이너가 즉시 종료됨 → 거의 항상 cgroup 또는 권한 문제입니다.
privileged: true와cgroup: host가 설정되어 있는지 확인한 후docker compose logs win10을 확인하세요. vagrant up이 "도메인이 IP 주소를 받는 중"에서 멈춤 → libvirt 기본 NAT 네트워크가 실행 중이지 않습니다. 컨테이너를 재시작하거나 내부에서virsh net-start default를 실행하세요.
📚 추가 자료 및 참고 문서
- Windows Vagrant 튜토리얼
- Vagrant 이미지: peru/windows-server-2022-standard-x64-eval
- HashiCorp의 Vagrant
- Linux Docker 컨테이너 내 Windows 가상 머신
- 컨테이너 내 GPU