Docker中运行Qt应用程序
目录
1.简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
参考网站:
菜鸟:https://www.runoob.com/docker/docker-tutorial.html
中文:https://www.docker.org.cn/index.html
知乎:https://www.zhihu.com/topic/19950993/hot
QQ交流群:https://www.docker.org.cn/page/dockerqq.html
2.环境
凝思安全操作系统V6.0.80(Debian 8)
3.从软件包安装
官网教程:https://docs.docker.com/engine/install/debian/
(1)选择版本:
以我的系统Debian jessie(Debian8)为例,去https://download.docker.com/linux/debian/dists/下选择Debian的版本jessie,如下图:
然后选择pool/stable/,然后选择amd64,最终跳转到如下界面,选择最后一个下载即可:
(2)安装:
sudo dpkg -i ./docker-ce_18.06.3_ce_3-0_debian_amd64.deb
安装完成后,可以使用命令查看版本信息:
(3)设置国内镜像源:
当你想用命令获取镜像时,可能报链接超时等错误,是因为国内访问官网镜像太慢,使用加速器即可解决:
参考:https://blog.csdn.net/wudawei071193/article/details/96168172
(4)运行hello world:
获取一个镜像后,即可使用命令打印:
docker pull learn/tutorial
docker run learn/tutorial echo "hello word"
4.常用命令
(1)镜像:
列出镜像列表:
docker images
查找镜像:
docker search amd64/debian:8
获取镜像:
docker pull amd64/debian:8
删除镜像:
docker rmi amd64/debian:8
运行镜像:
docker run -it amd64/debian:8 /bin/bash
从已创建的容器中提交镜像:
docker commit -m="提交的描述信息" -a="镜像作者" 容器ID 要创建的目标镜像名
使用 Dockerfile 指令来创建一个新的镜像
docker build -t debian/test .
(2)容器:
查看所有容器:
docker ps -a
从已有镜像启动一个未启动过的容器(第一次启动后该容器会保存下来,才能ps查看到,后续再启动应使用start):
docker run -it amd64/debian:8 /bin/bash
退出启动的容器:
exit
启动已存在的容器:
docker start 容器id
停止已存在的容器:
docker stop 容器id
后台运行容器:
docker run -itd --name ubuntu-test ubuntu /bin/bash
进入后台运行的容器:
docker attach 容器id
docker exec -it 容器id /bin/bash
第二种方式使用exit退出时,容器不会停止。
导出容器:
docker export 容器id > ubuntu.tar
导入容器:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
删除容器:
docker rm -f 容器id
5.在docker中运行Qt应用程序
(1)打包Qt应用程序
Qt应用程序的开发环境为Ubuntu 20.04.1+Qt 5.12.10,如图所示:
我的test应用简单的使用了一个QLable显示hello world,应用名为test,如下图所示:
打包参考:https://blog.csdn.net/qq_27350133/article/details/83445258 ,这里打包后的程序不能在容器中运行,缺少一些文件,第四步会详细说明。
(2)编写Dockfile文件
文件目录结构如下图:
Dockfile文件内容如下:
#基础镜像,当前latest为Ubuntu 20.04.1
FROM amd64/ubuntu:latest
#替换阿里云镜像源,否则下载很慢
COPY ./sources.list /etc/apt/
#设置环境为非交互模式,否则在安装某个库时需要选择配置
ENV DEBIAN_FRONTEND=noninteractive
#安装依赖包
RUN apt-get update && apt-get install -y libxcb-keysyms1-dev libxcb-image0-dev \
libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev \
libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev \
libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev \
libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev x11vnc \
xauth build-essential mesa-common-dev libglu1-mesa-dev libxkbcommon-dev \
libxcb-xkb-dev libxslt1-dev libxkbcommon-x11-0
#拷贝Qt应用程序
COPY ./qtdemo /usr/local/testdir/
#设置工作目录
WORKDIR /usr/local/testdir/qtdemo
#修改权限
RUN /bin/chmod -R 755 /usr/local/testdir/qtdemo
#运行脚本
CMD ./test.sh
Dockfile拷贝文件夹注意:COPY指令如果是拷贝一个文件夹,那么只会拷贝文件夹的内容。如果想要拷贝文件夹,有一个比较笨的方法,也就是改变原来的文件结构,将要拷贝的文件夹移到同一个文件夹下,然后将该文件夹COPY到容器里,容器里面就是你要拷贝的那些文件夹了。
ubuntu 20.04阿里云镜像源文件sources.list:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
(3)创建镜像
docker build -t qt:base .
(4)启动容器验证Qt应用程序是否打包完整
直接运行第1步打包好的程序,会报错如下图:
直接看的话,不知道什么原因造成的,我们可以设置export QT_DEBUG_PLUGINS=1来打印详细的错误信息,如下图:
可以看出是找不到platforms文件夹,我们将Qt安装目录下的opt/Qt5.12.10/5.12.10/gcc_64/plugins/platforms文件夹拷贝到可执行文件的同级目录即qtdemo中即可,重新编译镜像,运行看到还是报错,不过是其它错误,如下图:
按照提示将缺少的库,从Qt安装目录/opt/Qt5.12.10/5.12.10/gcc_64/lib下将库拷贝到qtdemo目录下即可。我这里缺少:libQt5XcbQpa.so.5、libQt5DBus.so.5这两个库。
(5)在linux宿主机中运行Qt应用程序
docker run -it --net=host --env="DISPLAY" qt:base /usr/local/testdir/qtdemo/test.sh
参数解释:
--env="DISPLAY": 将主机的显示环境变量共享到容器;
--net=host:使用主机网络驱动程序运行容器;
最终运行效果如下图:
(6)参考:
docker中运行GUI原理:https://www.cnblogs.com/larva-zhh/p/10531824.html
docker中搭建Qt环境:https://nicroland.wordpress.com/2015/12/06/running-qtcreator-in-docker/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界