打包cpp后端代码进入docker
C++ 后端打包 Docker 镜像总结
将 C++ 的代码打包成 Docker 镜像的过程
步骤
-
静态编译
先使用静态编译,确保代码的依赖能被打包到最终的可执行文件中。
-
编写 Dockerfile
创建一个 Dockerfile,用于构建镜像。
-
构建 Docker 镜像
使用命令构建镜像:
1
docker build -t mywebproject:latest .
-
测试镜像
在本地构建后,使用
docker run
命令测试镜像是否能正常运行:1
docker run -it --name mywebproject_container -p 8080:8080 mywebproject /bin/bash
-
推送到镜像仓库
当本地测试通过后,可以将镜像推送到镜像仓库。
使用 Docker Compose 统一管理多个镜像
通过 Docker Compose 可以方便地管理多个服务,比如同时运行 MySQL
和 MinIO
镜像。在此过程中,我将数据库连接参数写死了,虽然不太灵活,但快速构建时是可接受的。
1 | version: '3' |
处理跨平台问题
目前的 CMake 配置并不完美,需要适应不同的 Linux 环境,特别是在动态库和头文件路径方面。由于依赖的环境不同,CMake 配置需要更通用一些,以便在不同平台下能成功构建。
关于镜像构建的优化
在构建镜像时,如果每次都要执行测试命令,重新构建会非常麻烦。为了避免每次都重建镜像,可以构建一个不执行测试命令的基础镜像:
1 | docker build -t mywebproject:latest . |
然后进入镜像内部,手动运行构建命令:
1 | docker run -it --name mywebproject_container mywebproject /bin/bash |
这样就避免了每次都需要重新构建的问题。
遇到的库路径问题
在容器内部,我遇到了一些关于库路径和版本的问题。通过运行 ldd ./main
,可以查看缺少的库,并根据实际情况安装对应版本的库。最终,我发现 Ubuntu 系统中库文件常常位于:
1 | /usr/lib/x86_64-linux-gnu |
版本依赖问题
即使编译成功,运行时依然可能会遇到库版本不匹配的问题,导致程序无法启动。这时,Docker 的优势得到了体现。通过指定 Docker 镜像的基础版本,可以避免版本不匹配的麻烦。

使用低版本 Ubuntu 解决依赖问题
为了应对版本不兼容的问题,我尝试使用低版本的 Ubuntu 镜像进行构建,这样可以下载较旧版本的依赖库。然而,这样做的缺点是,镜像中的 apt
下载速度较慢。为了减少构建过程中的问题,我最终选择了较为稳定的版本。
最终结果
经过一番尝试和修复,最终我成功构建了镜像,并且解决了端口映射的问题。使用以下命令运行容器,确保能够通过端口访问到应用:
1 | docker run -it --name mywebproject_container -p 8080:8080 mywebproject /bin/bash |
部署到服务器
当镜像构建完成并且本地测试通过后,我就可以尝试将镜像上传到服务器,进行部署和运行。
小结
通过这次构建 C++ 后端 Docker 镜像的过程,我不仅学到了 Docker 和 CMake 配置的技巧,还解决了多个跨平台的依赖和版本问题。使用 Docker 的优势尤为突出,尤其是在处理依赖版本不兼容时提供了极大的便利。