我用的是ubuntu 22.04环境下 qt c++ 写的应用程序,是终端程序,不是界面,然后用linuxdeployqt
工具将其打包成了AppImage可执行文件,以上是部署前的准备工作,需要确保AppImage可执行文件在自己的ubuntu上可以运行才能执行以下操作。
docker部署详细步骤
第一步:新建一个文件夹
mkdir myhttp-server
cd myhttp-server
第二步:
将生成的AppImage可执行文件
放入新建的文件夹中,具体移动的方式这里不再详细叙述
第三步:新建一个Dockerfile文件
sudo vim Dockerfile
在文件中加入以下内容,有详细的注释
# 使用与构建环境匹配的Ubuntu版本 这里使用了镜像源 很重要
FROM docker.1ms.run/ubuntu:22.04# 设置非交互模式
ENV DEBIAN_FRONTEND=noninteractive# 安装AppImage运行所需的依赖和FUSE
RUN apt-get update && apt-get install -y \fuse \libfuse2 \libqt5core5a \libqt5network5 \# 根据需要添加其他Qt模块依赖&& rm -rf /var/lib/apt/lists/*# 允许非root用户使用FUSE
RUN echo "user_allow_other" >> /etc/fuse.conf# 创建应用目录
WORKDIR /app# 复制AppImage到容器中
COPY Application-x86_64.AppImage ./# 赋予执行权限
RUN chmod +x Application-x86_64.AppImage# 暴露HTTP服务器端口(根据你的实际端口修改)
EXPOSE 8888# 运行AppImage(使用--appimage-extract-and-run参数避免FUSE权限问题)
CMD ["./Application-x86_64.AppImage", "--appimage-extract-and-run"]
第四步:运行如下指令构建容器
注意最后面有个.呢
docker build -t qt-http-server:latest .
Docker
的构建命令,用于根据当前目录下的Dockerfile
文件创建镜像。-t
是--tag
的缩写,用于给构建的镜像添加标签(名称和版本)
Dockerfile
必须存在于该目录下(否则需要用-f
参数指定路径)
第五步:运行如下指令启动容器
docker run -d -p 8888:8888 --restart=always --name qt-http-server qt-http-server:latest
第六步:查看运行状态
- 运行如下指令查看运行状态
docker ps
docker images
- 持续查看运行日志,也就是终端打印 没有
-f
就不会持续追踪
docker logs -f qt-http-server
错误解决
如果docker容器已经存在,那么运行如下指令
# 停止容器(如果正在运行)
docker stop qt-http-server# 删除容器
docker rm qt-http-server# 重新运行新的容器 端口指定为自己的端口
docker run -d -p 8080:8080 --restart=always --name qt-http-server qt-http-server:latest
如果想要保留原来的容器,运行如下指令
# 使用新名称运行,比如 qt-http-server-new
docker run -d -p 8080:8080 --restart=always --name qt-http-server-new qt-http-server:latest