在 Windows 上使用 Docker CLI
一般来说,在 Windows 上使用 Docker 最便捷的方式是通过 Docker Desktop,它提供了一个图形界面和命令行工具来管理 Docker 容器和镜像。但是 Docker Desktop 是一个商业产品,对于企业来说商业使用需要付费订阅。
另一种方式是安装 WSL 2,然后使用 Docker CLI 连接到虚拟机中的 Docker 引擎。以下是安装和配置 Docker CLI 的步骤:
# 启用必要的 Windows 功能
Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
winget install Docker.DockerCLI
在虚拟机中安装 Docker 后,需要配置 Docker 守护程序启用远程连接。编辑虚拟机中的 /etc/docker/daemon.json 文件:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
然后重启 Docker 服务:
sudo systemctl restart docker
TCP 方式
TCP 方式通过网络连接 Docker 守护程序,需要在 Windows 主机上设置 DOCKER_HOST 环境变量指向虚拟机的 IP 地址和端口。
首先获取虚拟机的 IP 地址。对于 WSL 2,可以在虚拟机内运行:
hostname -I
假设虚拟机的 IP 地址为 172.20.0.100,在 PowerShell 中设置环境变量:
$env:DOCKER_HOST = "tcp://172.20.0.100:2375"
这只是为当前 PowerShell 会话设置环境变量。为了永久设置,使用 setx 命令:
setx DOCKER_HOST "tcp://172.20.0.100:2375"
或者在用户环境变量设置中手动添加 DOCKER_HOST 变量。之后重新启动 PowerShell 或 CMD,就可以使用 Docker CLI 连接到虚拟机中的 Docker 守护程序。
验证连接:
docker version
docker ps
TCP 方式的优点是简单直接,缺点是需要手动维护虚拟机的 IP 地址,尤其是在 WSL 2 中虚拟机重启后 IP 地址可能会变化。为了避免 IP 地址变化的问题,可以为虚拟机分配静态 IP 地址。
管道方式
管道方式通过 Windows 命名管道(Named Pipe)连接 Docker 守护程序,相比 TCP 方式更加稳定,不需要依赖网络配置。
在虚拟机中需要安装 npiperelay 工具,用于将 Docker Socket 转发到 Windows 命名管道:
wget https://github.com/jstarks/npiperelay/releases/download/v0.1/npiperelay_windows_amd64.exe -O /tmp/npiperelay.exe
然后在 Windows 主机上创建一个转发脚本。创建一个 PowerShell 脚本来启动转发:
# docker-relay.ps1
$wslDistro = "Ubuntu" # 修改为你的 WSL 2 发行版名称
wsl -d $wslDistro npiperelay -ep -l \\.\pipe\docker-engine -s /var/run/docker.sock
运行这个脚本前需要修改执行策略:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
然后在 PowerShell 中运行脚本以启动转发。为了方便使用,可以创建一个后台任务来自动启动转发。使用 Windows 任务计划程序或者 nssm 工具来将脚本注册为服务。
设置 DOCKER_HOST 环境变量使用管道:
$env:DOCKER_HOST = "npipe:////./pipe/docker-engine"
类似地,使用 setx 命令进行永久设置:
setx DOCKER_HOST "npipe:////./pipe/docker-engine"
验证连接:
docker version
docker ps
管道方式的优点是不依赖 IP 地址配置,连接更加稳定。缺点是需要额外的工具支持和后台转发进程。