C++ 언어별 가이드

C++ 언어별 가이드 (C++ language-specific guide)

Docker로 C++ 애플리케이션을 컨테이너화하는 방법을 설명하는 가이드예요.

출처: 문서

본문

C++ 시작 가이드는 Docker로 컨테이너화된 C++ 애플리케이션을 만드는 방법을 알려줘요. 이 가이드에서 배울 내용은 다음과 같아요:

감사의 말: Docker는 이 가이드에 기여해 주신 Pradumna Saraf 님과 Mohammad-Ali A'râbi 님께 감사를 전해요.

  • 멀티-스테이지(multi-stage) Docker 빌드로 C++ 애플리케이션을 컨테이너화하고 실행하기
  • Docker Compose로 C++ 애플리케이션을 빌드하고 실행하기
  • 컨테이너로 C++ 애플리케이션을 개발할 로컬 환경을 구성하기

C++ 시작 모듈을 완료하면, 이 가이드의 예시와 설명을 바탕으로 자신만의 C++ 애플리케이션을 컨테이너화할 수 있게 될 거예요.

기존 C++ 애플리케이션을 컨테이너화하는 것부터 시작해 볼게요.

C++ 애플리케이션용 멀티-스테이지 빌드 만들기 (Create a multi-stage build for your C++ application)

사전 요구사항 (Prerequisites)

Git 클라이언트가 있어야 해요. 이 섹션의 예시는 커맨드라인 기반 Git 클라이언트를 사용하지만, 어떤 클라이언트를 써도 상관없어요.

개요 (Overview)

이 섹션에서는 C++ 애플리케이션용 멀티-스테이지 Docker 빌드를 만드는 과정을 함께 살펴볼게요.

멀티-스테이지 빌드는 빌드 과정의 서로 다른 단계에 서로 다른 기본 이미지를 사용할 수 있게 해주는 Docker 기능이에요. 그래서 최종 이미지의 크기를 최적화하고, 빌드 의존성과 런타임 의존성을 분리할 수 있어요.

C++ 같은 컴파일 언어의 일반적인 방식은 코드를 컴파일하는 빌드 스테이지와 컴파일된 바이너리를 실행하는 런타임 스테이지를 두는 거예요. 빌드 의존성은 런타임에 필요하지 않기 때문이죠.

샘플 애플리케이션 받기 (Get the sample application)

터미널에 Hello, World!를 출력하는 간단한 C++ 애플리케이션을 사용해 볼게요. 이렇게 하려면 이 가이드에 사용할 샘플 리포지토리를 클론하세요:

$ git clone https://github.com/dockersamples/c-plus-plus-docker.git

이 섹션의 예시는 리포지토리의 hello 디렉터리 아래에 있어요. 그 안으로 들어가 파일들을 살펴보세요:

$ cd c-plus-plus-docker/hello
$ ls

다음 파일들이 보일 거예요:

Dockerfile  hello.cpp

Dockerfile 확인하기 (Check the Dockerfile)

IDE나 텍스트 편집기에서 Dockerfile을 여세요. Dockerfile에는 Docker 이미지를 빌드하기 위한 지시문이 들어 있어요.

# 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"]

이 Dockerfile에는 두 개의 스테이지가 있어요:

  • 빌드 스테이지(Build stage): ubuntu:latest 이미지를 사용해 C++ 코드를 컴파일하고 정적 바이너리를 만들어요.
  • 런타임 스테이지(Runtime stage): 비어 있는 이미지인 scratch 이미지를 사용해 빌드 스테이지에서 정적 바이너리를 복사해 실행해요.

Docker 이미지 빌드하기 (Build the Docker image)

Docker 이미지를 빌드하려면 hello 디렉터리에서 다음 명령을 실행하세요:

$ docker build -t hello .

-t 플래그는 이미지에 hello라는 이름을 붙여줘요.

Docker 컨테이너 실행하기 (Run the Docker container)

Docker 컨테이너를 실행하려면 다음 명령을 사용하세요:

$ docker run hello

터미널에 Hello, World! 출력이 보일 거예요.

최종 이미지는 빈 scratch 기반을 사용하므로, 정적 바이너리만 들어 있고 빌드 의존성이나 일반적인 OS 도구는 포함되지 않아요. 예를 들어, 컨테이너에서 간단한 ls 명령도 실행할 수 없어요:

$ docker run hello ls

셸과 그 밖의 도구가 없다는 점 덕분에 이미지가 작아지고 공격 표면(attack surface)도 줄어들어요.

C++ 애플리케이션 컨테이너화하기 (Containerize a C++ application)

사전 요구사항 (Prerequisites)

Git 클라이언트가 있어야 해요. 이 섹션의 예시는 커맨드라인 기반 Git 클라이언트를 사용하지만, 어떤 클라이언트를 써도 상관없어요.

개요 (Overview)

이 섹션에서는 Docker Compose를 사용해 C++ 애플리케이션을 컨테이너화하고 실행하는 과정을 함께 살펴볼게요.

샘플 애플리케이션 받기 (Get the sample application)

이 가이드의 앞부분에서 사용한 것과 같은 샘플 리포지토리를 쓸 거예요. 아직 리포지토리를 클론하지 않았다면 지금 클론하세요:

$ git clone https://github.com/dockersamples/c-plus-plus-docker.git

이제 c-plus-plus-docker (root) 디렉터리에 다음과 같은 내용물이 있어야 해요.

├── c-plus-plus-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── ok_api.cpp
│ └── README.md

리포지토리의 파일들에 대해 더 알고 싶다면 다음을 참고하세요:

  • Dockerfile
  • .dockerignore
  • compose.yml

애플리케이션 실행하기 (Run the application)

c-plus-plus-docker 디렉터리 안에서 터미널에 다음 명령을 실행하세요.

$ docker compose up --build

브라우저를 열고 http://localhost:8080 에서 애플리케이션을 확인하세요. 브라우저에 {"Status" : "OK"} 메시지가 보일 거예요.

터미널에서 ctrl+c를 눌러 애플리케이션을 중지하세요.

애플리케이션을 백그라운드에서 실행하기

터미널에서 분리(detached)해 애플리케이션을 실행하려면 -d 옵션을 추가하면 돼요. c-plus-plus-docker 디렉터리 안에서 다음 명령을 실행하세요.

$ docker compose up --build -d

브라우저를 열고 http://localhost:8080 에서 애플리케이션을 확인하세요.

터미널에서 다음 명령으로 애플리케이션을 중지하세요.

$ docker compose down

Compose 명령에 대한 자세한 내용은 Compose CLI 레퍼런스를 참고하세요.

C++ 개발에 컨테이너 사용하기 (Use containers for C++ development)

사전 요구사항 (Prerequisites)

"C++ 애플리케이션 컨테이너화하기"를 완료하세요.

개요 (Overview)

이 섹션에서는 컨테이너화된 애플리케이션의 개발 환경을 구성하는 방법을 배워요. 내용은 다음과 같아요:

  • 코드를 편집하고 저장할 때 실행 중인 Compose 서비스를 자동으로 업데이트하도록 Compose를 구성하기

샘플 애플리케이션 받기 (Get the sample application)

이 가이드에 사용할 샘플 애플리케이션을 클론하세요. 터미널을 열고 작업할 디렉터리로 이동한 다음, 다음 명령을 실행해 리포지토리를 클론하세요:

$ git clone https://github.com/dockersamples/c-plus-plus-docker.git && cd c-plus-plus-docker

서비스 자동 업데이트하기 (Automatically update services)

Compose Watch를 사용해 코드를 편집·저장할 때 실행 중인 Compose 서비스를 자동으로 업데이트하세요. Compose Watch에 대한 자세한 내용은 Use Compose Watch를 참고하세요.

IDE나 텍스트 편집기에서 compose.yml 파일을 열고 Compose Watch 지시문을 추가하세요. 다음 예시는 compose.yml 파일에 Compose Watch를 추가하는 방법을 보여줘요.

services:
  ok-api:
    image: ok-api
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    develop:
      watch:
        - action: rebuild
          path: .

다음 명령을 실행해 Compose Watch로 애플리케이션을 실행하세요.

$ docker compose watch

이제 ok_api.cpp를 수정하면 이미지를 다시 빌드하지 않아도 실시간으로 변경 사항이 반영되는 걸 볼 수 있어요.

직접 확인해 보려면 좋아하는 텍스트 편집기에서 ok_api.cpp 파일을 열고 메시지를 {"Status" : "OK"}에서 {"Status" : "Updated"}로 바꿔 보세요. 파일을 저장하고 브라우저를 http://localhost:8080 에서 새로고침하면 업데이트된 메시지가 보일 거예요.

터미널에서 ctrl+c를 눌러 애플리케이션을 중지하세요.

요약 (Summary)

이 섹션에서는 코드를 업데이트할 때 컨테이너를 자동으로 다시 빌드·실행하는 Compose Watch 사용법도 배웠어요.

관련 정보:

  • Compose file reference
  • Compose file watch
  • Multi-stage builds