我用的是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