Docker与C++:应用容器化从A到Z

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Docker与C++:应用容器化从A到Z



容器化已成为现代软件开发中不可或缺的一部分。Docker允许将应用程序及其依赖项打包在一起,确保可重现性和可移植性。在本文中,我们将详细讲解如何使用Docker对C++应用程序进行容器化——从基本概念到高级优化技术。



1. 为什么要对C++应用进行容器化?



许多开发者错误地认为Docker仅适用于解释型语言(Python、Node.js)。然而,C++应用也能从容器化中受益:



  • 依赖隔离:库、编译器和系统工具不会与其他项目冲突
  • 构建可重现性:在开发、CI/CD、生产等所有阶段使用相同的环境
  • 简化部署:镜像包含运行所需的一切
  • 可扩展性:通过Docker Compose或Kubernetes轻松运行多个实例


让我们通过一个实际示例来了解整个过程。



2. C++的基础Dockerfile



从一个简单的C++应用开始。创建文件main.cpp:



#include <iostream>

int main() { std::cout << "Hello, Dockerized C++!" << std::endl; return 0;}


现在编写用于构建和运行的Dockerfile:



# 带有编译器的基础镜像FROM gcc:latest AS builder

WORKDIR /appCOPY main.cpp .

# 编译RUN g++ -o hello main.cpp

# 最终的最小化镜像FROM alpine:latest

WORKDIR /appCOPY --from=builder /app/hello .

CMD ["./hello"]


构建并运行:



docker build -t cpp-hello .docker run cpp-hello


结果:Hello, Dockerized C++!



说明:

  • 第一阶段(builder)使用完整的gcc镜像进行编译
  • 第二阶段使用最小的Alpine Linux作为最终镜像
  • 最终镜像仅包含编译后的二进制文件——这节省了空间


3. 使用CMake和依赖项进行构建



实际项目通常使用CMake和外部库。考虑一个使用fmt库的示例。



项目结构:



myapp/├── CMakeLists.txt├── main.cpp└── Dockerfile


CMakeLists.txt:



cmake_minimum_required(VERSION 3.14)project(MyApp)

find_package(fmt REQUIRED)

add_executable(myapp main.cpp)target_link_libraries(myapp fmt::fmt)


main.cpp:



#include <fmt/core.h>

int main() { fmt::println("Hello from {}!", "C++ with Docker"); return 0;}


使用多阶段构建的Dockerfile:



# 阶段1:构建依赖项和应用程序FROM ubuntu:22.04 AS builder

RUN apt-get update && apt-get install -y \ build-essential cmake libfmt-dev \ && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY CMakeLists.txt main.cpp ./RUN cmake -B build && cmake --build build

# 阶段2:最终镜像FROM ubuntu:22.04

RUN apt-get update && apt-get install -y libfmt9 \ && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY --from=builder /app/build/myapp .

CMD ["./myapp"]


重要事项:

  • 构建依赖项(build-essential, cmake)不会进入最终镜像
  • 运行时依赖项(libfmt9)单独安装
  • 最终镜像的大小显著减小


4. 优化C++的Docker镜像



优化对于C++应用尤其重要,因为带有编译器的镜像可能

博客

书籍推荐