C++ language-specific guide
This guide explains how to containerize C++ applications using Docker.
The C++ getting started guide teaches you how to create a containerized C++ application using Docker. In this guide, you'll learn how to:
Acknowledgment
Docker would like to thank Pradumna Saraf and Mohammad-Ali A'râbi for their contribution to this guide.
- Containerize and run a C++ application using a multi-stage Docker build
- Build and run a C++ application using Docker Compose
- Set up a local environment to develop a C++ application using containers
After completing the C++ getting started modules, you should be able to containerize your own C++ application based on the examples and instructions provided in this guide.
Start by containerizing an existing C++ application.
Create a multi-stage build for your C++ application
Prerequisites
- You have a Git client. The examples in this section use a command-line based Git client, but you can use any client.
Overview
This section walks you through creating a multi-stage Docker build for a C++ application. A multi-stage build is a Docker feature that allows you to use different base images for different stages of the build process, so you can optimize the size of your final image and separate build dependencies from runtime dependencies.
The standard practice for compiled languages like C++ is to have a build stage that compiles the code and a runtime stage that runs the compiled binary, because the build dependencies are not needed at runtime.
Get the sample application
Let's use a simple C++ application that prints Hello, World! to the terminal. To do so, clone the sample repository to use with this guide:
$ git clone https://github.com/dockersamples/c-plus-plus-docker.gitThe example for this section is under the hello directory in the repository. Get inside it and take a look at the files:
$ cd c-plus-plus-docker/hello
$ lsYou should see the following files:
Dockerfile hello.cppCheck the Dockerfile
Open the Dockerfile in an IDE or text editor. The Dockerfile contains the instructions for building the Docker image.
# Stage 1: Build stage
FROM ubuntu:latest AS build
# Install build-essential for compiling C++ code
RUN apt-get update && apt-get install -y build-essential
# Set the working directory
WORKDIR /app
# Copy the source code into the container
COPY hello.cpp .
# Compile the C++ code statically to ensure it doesn't depend on runtime libraries
RUN g++ -o hello hello.cpp -static
# Stage 2: Runtime stage
FROM scratch
# Copy the static binary from the build stage
COPY --from=build /app/hello /hello
# Command to run the binary
CMD ["/hello"]The Dockerfile has two stages:
- Build stage: This stage uses the
ubuntu:latestimage to compile the C++ code and create a static binary. - Runtime stage: This stage uses the
scratchimage, which is an empty image, to copy the static binary from the build stage and run it.
Build the Docker image
To build the Docker image, run the following command in the hello directory:
$ docker build -t hello .The -t flag tags the image with the name hello.
Run the Docker container
To run the Docker container, use the following command:
$ docker run helloYou should see the output Hello, World! in the terminal.
Because the final image uses an empty scratch base, it contains only the
static binary and none of the build dependencies or usual OS tools. For
example, you can't run a simple ls command in the container:
$ docker run hello lsThe absence of a shell and other tools keeps the image small and reduces its attack surface.
Containerize a C++ application
Prerequisites
- You have a Git client. The examples in this section use a command-line based Git client, but you can use any client.
Overview
This section walks you through containerizing and running a C++ application, using Docker Compose.
Get the sample application
We're using the same sample repository that you used in the previous sections of this guide. If you haven't already cloned the repository, clone it now:
$ git clone https://github.com/dockersamples/c-plus-plus-docker.git
You should now have the following contents in your c-plus-plus-docker (root)
directory.
├── c-plus-plus-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── ok_api.cpp
│ └── README.mdTo learn more about the files in the repository, see the following:
Run the application
Inside the c-plus-plus-docker directory, run the following command in a
terminal.
$ docker compose up --build
Open a browser and view the application at http://localhost:8080. You will see a message {"Status" : "OK"} in the browser.
In the terminal, press ctrl+c to stop the application.
Run the application in the background
You can run the application detached from the terminal by adding the -d
option. Inside the c-plus-plus-docker directory, run the following command
in a terminal.
$ docker compose up --build -d
Open a browser and view the application at http://localhost:8080.
In the terminal, run the following command to stop the application.
$ docker compose down
For more information about Compose commands, see the Compose CLI reference.
Use containers for C++ development
Prerequisites
Complete Containerize a C++ application.
Overview
In this section, you'll learn how to set up a development environment for your containerized application. This includes:
- Configuring Compose to automatically update your running Compose services as you edit and save your code
Get the sample application
Clone the sample application to use with this guide. Open a terminal, change directory to a directory that you want to work in, and run the following command to clone the repository:
$ git clone https://github.com/dockersamples/c-plus-plus-docker.git && cd c-plus-plus-docker
Automatically update services
Use Compose Watch to automatically update your running Compose services as you edit and save your code. For more details about Compose Watch, see Use Compose Watch.
Open your compose.yml file in an IDE or text editor and then add the Compose Watch instructions. The following example shows how to add Compose Watch to your compose.yml file.
| |
Run the following command to run your application with Compose Watch.
$ docker compose watch
Now, if you modify your ok_api.cpp you will see the changes in real time without re-building the image.
To test it out, open the ok_api.cpp file in your favorite text editor and change the message from {"Status" : "OK"} to {"Status" : "Updated"}. Save the file and refresh your browser at http://localhost:8080. You should see the updated message.
Press ctrl+c in the terminal to stop your application.
Summary
In this section, you also learned how to use Compose Watch to automatically rebuild and run your container when you update your code.
Related information: