C++ 后端打包 Docker 镜像总结

将 C++ 的代码打包成 Docker 镜像的过程

步骤

  1. 静态编译

    先使用静态编译,确保代码的依赖能被打包到最终的可执行文件中。

  2. 编写 Dockerfile

    创建一个 Dockerfile,用于构建镜像。

  3. 构建 Docker 镜像

    使用命令构建镜像:

    1
    docker build -t mywebproject:latest .
  4. 测试镜像

    在本地构建后,使用 docker run 命令测试镜像是否能正常运行:

    1
    docker run -it --name mywebproject_container -p 8080:8080 mywebproject /bin/bash
  5. 推送到镜像仓库

    当本地测试通过后,可以将镜像推送到镜像仓库。


使用 Docker Compose 统一管理多个镜像

通过 Docker Compose 可以方便地管理多个服务,比如同时运行 MySQLMinIO 镜像。在此过程中,我将数据库连接参数写死了,虽然不太灵活,但快速构建时是可接受的。

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
minio:
image: minio/minio
ports:
- "9000:9000"
command: server /data

处理跨平台问题

目前的 CMake 配置并不完美,需要适应不同的 Linux 环境,特别是在动态库和头文件路径方面。由于依赖的环境不同,CMake 配置需要更通用一些,以便在不同平台下能成功构建。

图片1

图片1

关于镜像构建的优化

在构建镜像时,如果每次都要执行测试命令,重新构建会非常麻烦。为了避免每次都重建镜像,可以构建一个不执行测试命令的基础镜像:

1
docker build -t mywebproject:latest .

图片1
然后进入镜像内部,手动运行构建命令:

1
docker run -it --name mywebproject_container mywebproject /bin/bash

这样就避免了每次都需要重新构建的问题。


遇到的库路径问题

在容器内部,我遇到了一些关于库路径和版本的问题。通过运行 ldd ./main,可以查看缺少的库,并根据实际情况安装对应版本的库。最终,我发现 Ubuntu 系统中库文件常常位于:

1
/usr/lib/x86_64-linux-gnu

图片1

版本依赖问题

即使编译成功,运行时依然可能会遇到库版本不匹配的问题,导致程序无法启动。这时,Docker 的优势得到了体现。通过指定 Docker 镜像的基础版本,可以避免版本不匹配的麻烦。
图片1

使用低版本 Ubuntu 解决依赖问题

为了应对版本不兼容的问题,我尝试使用低版本的 Ubuntu 镜像进行构建,这样可以下载较旧版本的依赖库。然而,这样做的缺点是,镜像中的 apt 下载速度较慢。为了减少构建过程中的问题,我最终选择了较为稳定的版本。


最终结果

经过一番尝试和修复,最终我成功构建了镜像,并且解决了端口映射的问题。使用以下命令运行容器,确保能够通过端口访问到应用:
图片1

1
docker run -it --name mywebproject_container -p 8080:8080 mywebproject /bin/bash

部署到服务器

当镜像构建完成并且本地测试通过后,我就可以尝试将镜像上传到服务器,进行部署和运行。


小结

通过这次构建 C++ 后端 Docker 镜像的过程,我不仅学到了 Docker 和 CMake 配置的技巧,还解决了多个跨平台的依赖和版本问题。使用 Docker 的优势尤为突出,尤其是在处理依赖版本不兼容时提供了极大的便利。