新操作系统下运行Docker中的旧操作系统GUI界面相关工具
新的操作系统自然功能更全、更多。但无奈要吃饭挣钱,因此做出来的软件还需要兼容旧系统,虚拟机能够解决很多问题,但性能不佳是最大的问题。
最近抽空研究了一下Docker中运行GUI程序。找到一种更好的解决办法:在Docker中安装旧系统的GUI套件,并运行起来。
基础系统是Kubuntu 22.04,希望最后的程序能够运行Ununtu 16.04上,相关编译工具Docker套件见:[https://www.cnblogs.com/eaglexmw/p/18586421]
运行时的Docker大体配置类似与编译Docker相似,只是构造容器时安装的包有差异。
相应在DockerFile为:
# 以最新的Ubuntu镜像为模板
FROM ubuntu:16.04
# 将本目录下的sources.list作为容器的一个文件
# 使用阿里Ubuntu源,更新快
ADD sources.list /root/sources.list && mv /etc/apt/sources.list /etc/apt/sources.list_bak && cp /root/sources.list /etc/apt/sources.list
# 安装ssh、安装GTK组件、同时安装一下gtk2的themes
RUN apt update && apt install -y openssh-server gtk2.0-examples python-gtk2 murrine-themes
# 创建目录、/data目录
RUN mkdir -p /var/run/sshd && mkdir -p /data
# 修改root密码,便于远程登录
RUN echo root:12345678 | chpasswd
# 配置ssh可以使用root登陆
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD run.sh /run.sh && chmod 755 /run.sh
# 开放22端口
EXPOSE 22
#设置自启动命令
CMD ["/run.sh"]
这里除安装了openssh以供本机ssh方式访问,然后安装了gtk2.0-examples python-gtk2 murrine-themes(因此,这个Docker支持运行gtk2.0的程序)
构建Docker很简单:
docker build -t ubunut_gtk2:16.04 .
运行容器则需要注意一下:
docker run -d \
-v /home:/home:rw \
-v /data:/data:rw \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
-p 16042:22 \
--name=ubunut_gtk2_16.04 \
ubunut_gtk2:16.04
容器启动起来后,如果是ssh登陆进去,则需要先设置一下环境变量,才能启动GUI程序
export DISPLAY=unix:0
启动GUI程序时,即使在/root/目录下添加了.gtkrc-2.0文件,且指定了相应的gtk-theme-name,界面依然丑陋。
使用strace跟踪一下gtk-demo,发现,gtk2程序会读取~/.themes/Breeze/gtk-2.0/gtkrc文件加载theme。
lstat("/usr/share/gtk-2.0/gtkrc", 0x7fff27500540) = -1 ENOENT (No such file or directory)
lstat("/etc/xdg/gtk-2.0/gtkrc", 0x7fff27500540) = -1 ENOENT (No such file or directory)
lstat("/etc/gtk-2.0/gtkrc", 0x7fff27500540) = -1 ENOENT (No such file or directory)
lstat("/root/.gtkrc-2.0", {st_mode=S_IFREG|0644, st_size=64, ...}) = 0
open("/root/.gtkrc-2.0", O_RDONLY) = 5
read(5, "gtk-theme-name = \"MurrinaBlue\"\ng"..., 4000) = 64
futex(0x7eff87df4428, FUTEX_WAKE_PRIVATE, 2147483647) = 0
read(5, "", 4000) = 0
close(5) = 0
futex(0x7eff87df4428, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7eff87df4428, FUTEX_WAKE_PRIVATE, 2147483647) = 0
access("/root/.themes/Breeze/gtk-2.0/gtkrc", F_OK) = 0
lstat("/root/.themes/Breeze/gtk-2.0/gtkrc", {st_mode=S_IFREG|0644, st_size=6780, ...}) = 0
open("/root/.themes/Breeze/gtk-2.0/gtkrc", O_RDONLY) = 5
read(5, "#MurrinaBlue theme by Yves-Alexi"..., 4000) = 4000
简单处理,在/root/目录下创建一个themes目录,然后简单建立一个目录链接,
ln -s /usr/share/themes/MurrinaBlue Breeze
这样就能使用到MurrinaBlue这个theme了