Docker中运行Qt应用程序

 

目录

 

1.简介

2.环境

3.从软件包安装

(1)选择版本:

​(2)安装:

(3)设置国内镜像源:

(4)运行hello world:

 4.常用命令

(1)镜像:

(2)容器:

5.在docker中运行Qt应用程序

(1)打包Qt应用程序

(2)编写Dockfile文件

(3)创建镜像

(4)启动容器验证Qt应用程序是否打包完整

(5)在linux宿主机中运行Qt应用程序

(6)参考:


1.简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

参考网站:

官网:https://www.docker.com/

菜鸟: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/

 

  • 9
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值