Docker on Windows
AMD Ryzen 9 3900x, Ryzen 7 5800H supports virtualization. Almost every processors released since a long time have Virtualization. For Windows it's VT-x, SVM(in some AMD motherboard vtx is renamed as SVM), Vanderpool or AMD-V.
PowerShell
run as administrator 1. Press ⊞ + R 2. Type in PowerShell 3. Press Ctrl + Shift + Enter 4. Choose Yes and Press Enter
# powershell
net start com.docker.service
net stop com.docker.service
Windows 10 Home
# powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
# powershell
docker pull hello-world
docker run -it --rm --name hello hello-world:latest
# gitbash
winpty docker pull hello-world
winpty docker run -it --rm --name hello hello-world:latest
Networking
cat <<EOF > /mnt/c/Users/shahed/.docker/daemon.json
{
"bip": "10.20.13.1/24",
"mtu": 1500,
"dns": [
"10.19.83.100",
"10.19.83.1"
],
"registry-mirrors": [],
"insecure-registries": [],
"debug": true,
"experimental": false,
"features": {
"buildkit": true
},
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "20GB"
}
}
}
EOF
|
cat <<EOF > /mnt/c/Users/shahed/.docker/daemon.json
{
"mtu": 1500,
"debug": true,
"experimental": false,
"default-address-pools": [
{
"base": "10.20.0.0/16",
"size": 24
}
]
}
EOF
|
docker run --rm --detach --publish 1983:80 nginx
docker run --rm --detach --net=host nginx
docker run --rm --detach --publish 1983:80 --net=ckn.b00 --ip 10.20.15.10 nginx
docker run --rm --detach --publish 1983:80 --net=ckn.b01 --ip 10.20.16.10 nginx
Cache or Mirror
mkdir -p /etc/docker/registry
cat <<EOF > /etc/docker/registry/config.yml
proxy:
remoteurl: https://hub.chorke.org
username: academia
password: sadaqah!
EOF
Troubleshoot
docker run --rm --net=host busybox nslookup google.com
docker run --rm --net=host alpine cat /etc/resolv.conf
docker run --rm --net=host alpine nslookup google.com
docker run --rm --net=host alpine ping google.com
docker run --rm --net=host alpine cat /etc/hosts
docker run --rm --net=host alpine ifconfig
docker run --rm --net=host alpine ip addr
docker run --rm --net=host alpine route
|
docker run --rm busybox nslookup google.com
docker run --rm alpine cat /etc/resolv.conf
docker run --rm alpine nslookup google.com
docker run --rm alpine ping google.com
docker run --rm alpine cat /etc/hosts
docker run --rm alpine ifconfig
docker run --rm alpine ip addr
docker run --rm alpine route
|
Images Path
Ubuntu: /var/lib/docker/
Fedora: /var/lib/docker/
Debian: /var/lib/docker/
Windows: C:\ProgramData\DockerDesktop
MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/
wsl -l -v
wsl -d docker-desktop
wsl -d docker-desktop-data
Backup Docker
New-Item D:\var\lib\docker -Type Directory -Force
Set-Location -Path D:\var\lib\docker
wsl --export docker-desktop docker_engine.tar
wsl --export docker-desktop-data docker_images.tar
Move Engine Path
wsl --shutdown
wsl --unregister docker-desktop
Set-Location -Path D:\var\lib\docker
New-Item D:\var\lib\docker\engine -Type Directory -Force
wsl --import docker-desktop D:\var\lib\docker\engine docker_engine.tar --version 2
Set-Location -Path D:\var\lib\docker\engine
Get-ChildItem
wsl -l -v
net stop com.docker.service
net start com.docker.service
Move Images Path
wsl --shutdown
wsl --unregister docker-desktop-data
Set-Location -Path D:\var\lib\docker
New-Item D:\var\lib\docker\images -Type Directory -Force
wsl --import docker-desktop-data D:\var\lib\docker\images docker_images.tar --version 2
Set-Location -Path D:\var\lib\docker\images
Get-ChildItem
wsl -l -v
net stop com.docker.service
net start com.docker.service
Move Ubuntu Path
You can move your Ubuntu distro to elsewhere as following. The drawback is it will be login root
user by default. It's lost the integrity, consistency and other features. If you are aware about the risk then now worries else leave it as usual. It's recommended don't make changes or any engineering over there. Leave it as it's. Following example for experimental purpose nothing else.
New-Item D:\var\wsl\ubuntu -Type Directory -Force
Set-Location -Path D:\var\wsl\ubuntu
wsl --export ubuntu ubuntu.tar
wsl --shutdown
wsl --unregister ubuntu
wsl --import ubuntu D:\var\wsl\ubuntu ubuntu.tar --version 2
Get-ChildItem
wsl -l -v
net stop com.docker.service
net start com.docker.service
Knowledge
wslconfig /l
wslconfig /u 'Ubuntu'
wslconfig /u 'Ubuntu-18.04'
docker network ls
docker network prune
docker network rm ckn.b00 ckn.b01
docker inspect nginx|grep "IPAddress"
docker network inspect bridge|grep "Gateway"
docker run --rm -dit --network \
none --name alpine alpine:latest ash;\
docker exec -it alpine ip link show
docker network connect ckn.b00 nginx
docker exec -it nginx cat /etc/hosts
docker inspect nginx|grep "IPAddress"
docker exec -it nginx cat /etc/resolv.conf
docker exec -it nginx ls -lah /sys/class/net/
docker cp ~/.m2/settings.xml alpine:~/.m2/settings.xml
docker cp alpine:~/.m2/settings.xml ~/.m2/settings.xml
if [[ "$(</proc/sys/kernel/osrelease)" == *microsoft* ]];then echo 'WSL enabled';fi
if grep -qEi '(Microsoft|WSL)' /proc/version &>/dev/null;then echo 'WSL enabled';fi
if [[ "$(</proc/version)" == *microsoft* ]];then echo 'WSL enabled';fi
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}"
docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}"
docker ps --format "table {{.ID}}\t{{.Labels}}"
docker ps --format '{{.Names}}\t{{.Image}}'
docker ps --format "{{.ID}}: {{.Command}}"
docker ps --filter publish=80/udp