WSL中Docker替代Docker Desktop后Testcontainers无法识别Docker的解决方法
让Testcontainers识别WSL中运行的Docker(无需Docker Desktop)
问题描述
我在Windows 10中安装了WSL,并通过以下步骤部署Docker:
wsl sudo apt update sudo apt install docker.io -y wsl docker doskey docker=wsl docker wsl docker -v # 输出:Docker version 24.0.5, build 24.0.5-0ubuntu1~20.04.1
但在IDEA中使用Testcontainers运行自动化测试时,无法识别WSL中的Docker,报错如下:
o.t.d.DockerClientProviderStrategy : Loaded org.testcontainers.dockerclient.NpipeSocketClientProviderStrategy from ~/.testcontainers.properties, will try it first 2023-09-04 16:19:11.678 INFO 17864 --- [ main] .t.d.DockerMachineClientProviderStrategy : docker-machine executable was not found on PATH ([C:\Program Files\Docker\Docker\resources\bin, C:\ProgramData\DockerDesktop\version-bin, C:\Program Files\Docker, c:\oraclex64\product\12.1.0\client\bin, C:\Program Files\Common Files\Oracle\Java\javapath, C:\Program Files (x86)\Common Files\Oracle\Java\javapath, C:\WINDOWS\system32, C:\WINDOWS, C:\WINDOWS\System32\Wbem, C:\WINDOWS\System32\WindowsPowerShell\v1.0\, C:\WINDOWS\System32\OpenSSH\, C:\Program Files\PuTTY\, C:\Program Files\TortoiseGit\bin, C:\utils, C:\utils\confluent-7.0.1, C:\ProgramData\chocolatey\bin, C:\Gradle\gradle-6.8\bin, C:\Program Files\Git\cmd, C:\Program Files\JetBrains\PyCharm 2020.2.3\bin, C:\Program Files\JetBrains\PyCharm Community Edition 2020.2.3\bin, C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.2.1\bin]) 2023-09-04 16:19:41.696 ERROR 17864 --- [ main] o.t.d.DockerClientProviderStrategy : Could not find a valid Docker environment. Please check configuration. Attempted configurations were: 2023-09-04 16:19:41.696 ERROR 17864 --- [ main] o.t.d.DockerClientProviderStrategy : NpipeSocketClientProviderStrategy: failed with exception TimeoutException (Timeout waiting for result with exception). Root cause NoSuchFileException (\\.\pipe\docker_engine) 2023-09-04 16:19:41.696 ERROR 17864 --- [ main] o.t.d.DockerClientProviderStrategy : NpipeSocketClientProviderStrategy: failed with exception TimeoutException (Timeout waiting for result with exception). Root cause NoSuchFileException (\\.\pipe\docker_engine) 2023-09-04 16:19:41.696 ERROR 17864 --- [ main] o.t.d.DockerClientProviderStrategy : As no valid configuration was found, execution cannot continue
请问如何配置才能让Testcontainers识别到WSL中的Docker?注:无法使用Docker Desktop。
解决方案
1. 配置WSL中的Docker监听TCP端口
默认Docker仅监听Unix套接字,需修改配置让它同时监听TCP端口,以便Windows侧的Testcontainers访问:
- 在WSL终端执行,编辑Docker守护进程配置:
sudo nano /etc/docker/daemon.json - 添加以下JSON内容(如果文件已有内容,确保
hosts字段存在并包含TCP地址):{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] } - 重启Docker服务使配置生效:
sudo systemctl restart docker - 验证监听状态:执行
ss -tulpn | grep docker,应看到127.0.0.1:2375的监听记录
2. 设置Windows环境变量指定Docker地址
让Testcontainers知道要连接到WSL中的Docker服务:
- 打开Windows环境变量设置(右键「此电脑」→「属性」→「高级系统设置」→「环境变量」)
- 添加系统变量:
- 变量名:
DOCKER_HOST - 变量值:
tcp://localhost:2375
- 变量名:
- 重启IntelliJ IDEA,确保环境变量生效
3. 备选:通过Testcontainers配置文件指定地址
如果环境变量未生效,可在用户目录下创建/编辑~/.testcontainers.properties文件,添加:
docker.host=tcp://localhost:2375
原理说明
Testcontainers默认优先尝试连接Windows平台的Docker npipe套接字(\\.\pipe\docker_engine),这是Docker Desktop的默认配置。而你在WSL中独立安装的Docker不使用该套接字,因此需要显式指定TCP连接地址,让Testcontainers指向WSL中的Docker服务。
安全提示
如果你的设备处于公共网络环境,建议将WSL中Docker的监听地址从0.0.0.0改为127.0.0.1(如上配置),仅允许本地访问,避免暴露Docker服务到公网。
内容的提问来源于stack exchange,提问作者Stitch
相关产品推荐
相关产品推荐

