Instalace virtuálního počítače s Windows do kontejneru Linux Docker

Podrobný průvodce kontejnerováním virtuálního počítače s Windows – s přístupem RDP – na platformě Linux Docker s KVM Hypervisor

Obrázek pro příspěvek

Pozadí

Proč Containerizing a VM: Our Use Case

Obrázek pro příspěvek

Obrázek pro příspěvek

Obrázek pro příspěvek

Obrázek pro příspěvek

Obrázek pro příspěvek

Obrázek pro příspěvek

Výzvy

Vyzvěte 1 kontejnery Windows na platformě Windows a kontejnery Linux na platformě Linux

Ke kontejnerům výzvy 2 Windows Docker nelze přistupovat prostřednictvím protokolu RDP nebo VNC, tj. Bez grafické plochy

Přehled architektury

Obrázek pro příspěvek

Obrázek pro příspěvek

Instalace Dockeru na hlavní platformu

sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fSSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add 
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce -y
sudo systemctl start dockersudo systemctl enable docker

Vytváření správného obrazu Dockeru

sudo egrep -c '(vmx|svm)' /proc/cpuinfo

Vytváření obrazu bez souboru Docker

sudo docker pull ubuntu:18.04
sudo docker run --privileged -it --name ubuntukvm --device=/dev/kvm --device=/dev/net/tun -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cap-add=NET_ADMIN --cap-add=SYS_ADMIN ubuntu:18.04 /bin/bash
root@<container_id>:/#
root@<container_id>:/# apt-get update -y
root@<container_id>:/# apt-get install -y qemu-kvm libvirt-daemon-system libvirt-dev
root@<container_id>:/# chown root:kvm /dev/kvm
root@<container_id>:/# service libvirtd startroot@<container_id>:/# service virtlogd start
root@<container_id>:/# apt-get install -y linux-image-$(uname -r)
root@<container_id>:/# apt-get install curl -y
root@<container_id>:/# apt-get install net-tools -y
root@<container_id>:/# apt-get install jq -yroot@<container_id>:/# vagrant_latest_version=$(curl -s https://checkpoint-api.hashicorp.com/v1/check/vagrant  | jq -r -M '.current_version')root@<container_id>:/# echo $vagrant_latest_versionroot@<container_id>:/# curl -O https://releases.hashicorp.com/vagrant/$(echo $vagrant_latest_version)/vagrant_$(echo $vagrant_latest_version)_x86_64.debroot@<container_id>:/# dpkg -i vagrant_$(echo $vagrant_latest_version)_x86_64.deb
root@<container_id>:/# vagrant plugin install vagrant-libvirt
root@<container_id>:/# mkdir /win10root@<container_id>:/# cd /win10root@<container_id>:/win10# vagrant init peru/windows-10-enterprise-x64-evalroot@<container_id>:/win10# VAGRANT_DEFAULT_PROVIDER=libvirt vagrant up
root@< container_id >:/win10# vagrant rdp==> default: Detecting RDP info…
 default: Address: 192.168.121.68:3389
 default: Username: vagrant
==> default: Vagrant will now launch your RDP client with the connection parameters
==> default: above. If the connection fails, verify that the information above is
==> default: correct. Additionally, make sure the RDP server is configured and
==> default: running in the guest machine (it is disabled by default on Windows).
==> default: Also, verify that the firewall is open to allow RDP connections.
An appropriate RDP client was not found. Vagrant requires either
`xfreerdp` or `rdesktop` in order to connect via RDP to the Vagrant
environment. Please ensure one of these applications is installed and
available on the path and try again.
Image for post

Image for post

root@<container_id>:/# iptables -A FORWARD -i eth0 -o virbr1 -p tcp --syn --dport 3389 -m conntrack --ctstate NEW -j ACCEPTroot@<container_id>:/# iptables -A FORWARD -i eth0 -o virbr1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTroot@<container_id>:/# iptables -A FORWARD -i virbr1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTroot@<container_id>:/# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to-destination 192.168.121.68root@<container_id>:/# iptables -t nat -A POSTROUTING -o virbr1 -p tcp --dport 3389 -d 192.168.121.68 -j SNAT --to-source 192.168.121.1
root@<container_id>:/# iptables -D FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachableroot@<container_id>:/# iptables -D FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachableroot@<container_id>:/# iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachableroot@<container_id>:/# iptables -D FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
root@<container_id>:/# sudo iptables-save > $HOME/firewall.txt
root@<container_id>:/# sudo iptables -X
root@<container_id>:/# sudo iptables -t nat -F
root@<container_id>:/# sudo iptables -t nat -X
root@<container_id>:/# sudo iptables -t mangle -F
root@<container_id>:/# sudo iptables -t mangle -X
root@<container_id>:/# sudo iptables -P INPUT ACCEPT
root@<container_id>:/# sudo iptables -P FORWARD ACCEPT
root@<container_id>:/# sudo iptables -P OUTPUT ACCEPT
root@<container_id>:/win10# exit$ sudo docker ps -a
$ sudo docker commit <container_id> ubuntukvm

Vytváření obrazu pomocí souboru Docker

sudo chmod +x startup.shsudo docker build -t ubuntukvm:latest -f Dockerfile .
sudo docker run --privileged -it --name kvmcontainer1 --device=/dev/kvm --device=/dev/net/tun -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cap-add=NET_ADMIN --cap-add=SYS_ADMIN ubuntukvm bash

Testování přístupu RDP

root@<container_id>:/win10# <Ctrl+p+q>$ sudo nmap -Pn -p 3389 172.17.0.2
sudo apt-get install rdesktop
sudo rdesktop 172.17.0.2
Obrázek pro příspěvek

Obrázek pro příspěvek

Závěr

Source: https://medium.com/axon-technologies/installing-a-windows-virtual-machine-in-a-linux-docker-container-c78e4c3f9ba1