Linux wine使用Windows版docker

wine我就不多介绍了,本篇文章主要是介绍如何在wine下使用Windows版docker。原因就是有些windows app有使用docker的需求,但是在wine下运行win版docker好像很难:win版docker desktop依赖wsl2,wine是没有wsl功能的,故此方案直接放弃;旧版的DockerToolbox呢?DockerToolbox需要安装VirtualBox,这就需要在linux下用wine运行vbox,然后再用vbox创建linux虚拟机运行boot2docker……,这个方案虽然理论可行,但是感觉很不值得,这样一套下来,又是转译又是虚拟,性能不知道要损失多少,所以这个方案我就不尝试了。有没有其他更好的方案呢?我摸索了一下,发现了另一种非常好的方案。

docker Expose daemon

docker Expose daemon功能可以将 dockerd api开放到hostip:2375上,教程参考 Linux Expose docker daemon

完成后可以通过curl http://localhost:2375/version测试

90e495ac5ff01b9d77e3d51f8b51a201/20230318173315.png

下载安装windows版本docker

前往 https://download.docker.com/win/static/stable/x86_64/ 下载最新版docker。将其解压到~/.wine/drive_c/bin

e2888d2a20541d539f13448597f20809/20230318173333.png

配置wine的环境变量

wine regedit 启动wine注册表编辑器,前往如下路径,这里的项目就是wine的环境变量

857bb7394d340f5bc7ca71dd8437e3ad/20230318173345.png

修改PATH变量,在最后添加;C:\bin ,这是docker.exe存放的路径

b82c979ccfdca1f4add6e30c0f3f644e/20230318173410.png

然后右键空白处选择新建==>字符串项,添加DOCKER_HOST变量如下

7f64e1d5cffc876353c86cbd084bc232/20230318173450.png

测试

docker version

ae28f89adea161fb2b3d329b015334cb/20230318173511.png

新建一个容器也ok

docker run -it --rm debian

e50d5140ddb25146bd39aa1b5414a177/20230318173530.png

完善

windows app调用docker时,可能会使用windows path,这样就会导致docker命令执行失败,写个c++小程序就可以解决这个问题;将原来的docker.exe更名为dockerb.exe,再将这段代码编译为docker.exe放入C:\bin ,然后把wine的c盘链接到根目录ln -s /home/user/.wine/driver_c /c。这段代码不能解决路径中含空格的问题,使用时需注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<string>
#include<fstream>

using namespace std;

string ReplaceAll(string str, const string& from, const string& to) {
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length();
}
return str;
}


int main(int argc, char* argv[]){

string cmd="";

for (size_t i = 0; i < argc; i++)
{
string s = argv[i];
if(s == "docker" | s == "docekr.exe") {
s = "dockerb.exe";
cmd = s;
continue;
}
s = ReplaceAll(s, "C:", "/c");
s = ReplaceAll(s, "\\", "/");
cmd += ( " " + s );
}

// 输出最后执行的docker指令,便于调试,如果不需要可以删掉
ofstream ofs;
ofs.open("docker-debug", ios::out);
ofs << cmd << endl;
ofs.close();

system(cmd.c_str());

return 0;
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2025 lorzzn
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信