Visual Studio Code에서 Remote Containers로 C++ 개발 환경 격리하기

도입 문구


Visual Studio Code(VSCode)의 Remote Containers 기능을 사용하여 C++ 개발 환경을 격리하는 방법을 소개합니다. 이 기능을 활용하면 다양한 개발 환경을 독립적으로 관리할 수 있어, 프로젝트마다 환경을 다르게 설정하거나 여러 개발 환경을 한 시스템에서 효율적으로 관리할 수 있습니다.

Remote Containers란?


Remote Containers는 개발 환경을 Docker 컨테이너 내에서 격리하여 작업할 수 있는 VSCode의 기능입니다. 이를 통해 개발자는 프로젝트별로 독립된 환경을 설정하고, 동일한 환경에서 일관된 방식으로 코드를 작성하고 테스트할 수 있습니다. 컨테이너는 시스템 환경에 영향을 미치지 않으므로, 다양한 라이브러리와 툴체인을 요구하는 C++ 프로젝트에서도 유용하게 활용할 수 있습니다.

C++ 개발 환경을 컨테이너로 격리하는 이유


C++ 프로젝트는 다양한 라이브러리와 툴체인에 의존하는 경우가 많습니다. 이로 인해 프로젝트마다 다른 버전의 라이브러리나 설정을 요구할 수 있습니다. 이러한 환경을 일관되게 유지하는 것은 매우 중요하지만, 여러 프로젝트가 혼합된 환경에서는 충돌이나 설정 오류가 발생할 수 있습니다.

Remote Containers를 사용하면 각 프로젝트마다 독립적인 개발 환경을 제공할 수 있어, 다른 프로젝트에 영향을 미치지 않으며 안정적으로 작업을 진행할 수 있습니다. 또한, 동일한 환경을 여러 개발자와 공유할 수 있어 팀 협업에도 유리합니다.

Docker와 VSCode의 통합


Remote Containers 기능은 Docker와 통합되어 작동합니다. Docker는 애플리케이션을 격리된 환경에서 실행할 수 있도록 해주는 컨테이너 기술로, VSCode는 이를 이용해 컨테이너 내에서 코드를 작성하고 빌드할 수 있는 환경을 제공합니다.

VSCode의 “Remote – Containers” 확장 프로그램을 설치하면, VSCode 내에서 Docker 이미지를 쉽게 관리할 수 있으며, 개발자는 컨테이너에 연결하여 직접 개발 작업을 수행할 수 있습니다. 또한, Dockerfile을 활용하여 컨테이너 내에서 필요한 환경을 설정하고, 이를 VSCode에서 자동으로 인식할 수 있게 됩니다. 이를 통해 개발자는 설정된 환경을 그대로 사용하여 일관된 개발 환경을 유지할 수 있습니다.

필요한 도구와 설치 방법


Remote Containers 기능을 사용하기 위해서는 다음과 같은 도구들이 필요합니다:

1. Docker


Docker는 컨테이너화된 환경을 제공하는 필수 도구입니다. Docker는 애플리케이션을 격리된 컨테이너로 실행시킬 수 있어, 각 프로젝트마다 다른 환경을 설정할 수 있습니다.

설치 방법


Docker는 Docker 공식 웹사이트에서 다운로드할 수 있습니다. 설치 후, Docker가 정상적으로 실행되는지 확인합니다.

2. Visual Studio Code


VSCode는 편리한 개발 환경을 제공하는 텍스트 편집기입니다. Remote Containers 기능은 VSCode의 확장 프로그램을 통해 활성화할 수 있습니다.

설치 방법


VSCode는 Visual Studio Code 공식 웹사이트에서 다운로드할 수 있습니다. 설치 후, VSCode를 실행하고, 다음 단계로 진행합니다.

3. Remote – Containers 확장 프로그램


Remote – Containers 확장 프로그램은 VSCode 내에서 Docker 컨테이너와 연결하여 개발 환경을 관리할 수 있게 해줍니다.

설치 방법


VSCode에서 Extensions 탭을 열고, “Remote – Containers”를 검색하여 설치합니다. 설치가 완료되면, VSCode에서 Docker 컨테이너와의 연결이 가능해집니다.

Remote Containers 설정 파일 작성


C++ 개발 환경을 Docker 컨테이너 내에서 설정하려면 .devcontainer라는 폴더를 프로젝트 디렉토리에 생성하고, 그 안에 Dockerfiledevcontainer.json 파일을 작성해야 합니다. 이 파일들은 컨테이너 내에서의 환경을 정의하고, VSCode가 해당 컨테이너에 접근할 수 있도록 설정합니다.

1. .devcontainer 폴더 생성


프로젝트 루트 디렉토리에 .devcontainer라는 폴더를 생성합니다. 이 폴더 안에 Docker 설정 파일을 두어야 합니다.

2. Dockerfile 작성


Dockerfile은 컨테이너 내에서 사용할 환경을 설정하는 파일입니다. C++ 개발에 필요한 라이브러리와 툴체인, 디버깅 도구 등을 여기서 정의할 수 있습니다. 예시 Dockerfile은 다음과 같습니다:

# Base image
FROM ubuntu:20.04

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    gdb \
    clang \
    libboost-all-dev \
    && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /workspace

# Set default command
CMD ["bash"]

이 Dockerfile은 기본 Ubuntu 이미지를 기반으로 C++ 개발에 필요한 툴을 설치하고, 작업 디렉토리를 /workspace로 설정합니다.

3. devcontainer.json 작성


devcontainer.json은 VSCode가 해당 컨테이너와 상호작용하는 방식을 정의하는 파일입니다. 예를 들어, 이 파일은 어떤 Dockerfile을 사용할지, 필요한 포트, 확장 프로그램 등을 정의합니다. 예시 설정은 다음과 같습니다:

{
    "name": "C++ Development Container",
    "context": "..",
    "dockerFile": "Dockerfile",
    "appPort": [3000],
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },
    "extensions": [
        "ms-vscode.cpptools",
        "ms-vscode.cmake-tools",
        "twxs.cmake"
    ]
}

devcontainer.json 파일은 Dockerfile을 기반으로 컨테이너를 설정하고, C++ 개발을 위한 VSCode 확장 프로그램들을 자동으로 설치합니다.

C++ 개발 환경 설정 예시


Dockerfile과 devcontainer.json을 설정한 후, C++ 개발 환경을 구체적으로 설정할 수 있습니다. 이 섹션에서는 실제 C++ 개발 환경을 컨테이너 내에서 구성하는 예시를 다룹니다.

1. C++ 툴체인 설치


C++ 개발 환경에서 필수적인 툴체인과 라이브러리를 Dockerfile에 추가해야 합니다. 예를 들어, CMake는 빌드 시스템으로 매우 중요하며, GDB는 디버깅 도구로 필요합니다. Dockerfile에 다음과 같이 툴체인을 추가할 수 있습니다:

# Install C++ build tools
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    gdb \
    clang \
    libboost-all-dev \
    && rm -rf /var/lib/apt/lists/*

이 코드는 C++ 개발에 필요한 기본 빌드 도구인 build-essential, cmake, gdb, clang, 그리고 Boost 라이브러리를 설치합니다.

2. CMake 설정


CMake는 C++ 프로젝트의 빌드를 관리하는 도구로, 컨테이너 내에서도 필수적으로 설정해야 합니다. devcontainer.json에서 CMake 설정을 추가하여, VSCode 내에서 CMake를 자동으로 인식하고 사용할 수 있도록 합니다:

{
    "name": "C++ Development Container",
    "context": "..",
    "dockerFile": "Dockerfile",
    "extensions": [
        "ms-vscode.cpptools",
        "ms-vscode.cmake-tools",
        "twxs.cmake"
    ],
    "settings": {
        "cmake.configureOnOpen": true,
        "cmake.buildDirectory": "${workspaceFolder}/build"
    }
}

여기서 "cmake.configureOnOpen": true 설정은 VSCode가 프로젝트를 열 때 자동으로 CMake 구성을 실행하게 합니다. cmake.buildDirectory는 빌드 디렉토리를 설정하는 항목입니다.

3. Boost 라이브러리 설치


Boost는 C++에서 매우 널리 사용되는 라이브러리로, 프로젝트에 포함하여 사용할 수 있습니다. 위 Dockerfile에서 libboost-all-dev를 설치하는 방법을 다루었으며, 추가적인 Boost 라이브러리를 사용하려면 CMakeLists.txt에 다음과 같이 Boost 라이브러리를 링크할 수 있습니다:

find_package(Boost REQUIRED)
target_link_libraries(${PROJECT_NAME} Boost::Boost)

이렇게 설정하면, CMake가 Boost 라이브러리를 자동으로 찾아서 프로젝트와 연결합니다.

4. 디버깅 설정


컨테이너 내에서 디버깅을 수행하려면, gdb와 같은 디버깅 툴을 설치해야 합니다. 또한, VSCode에서 디버깅 환경을 자동으로 설정할 수 있도록 launch.json 파일을 작성해야 합니다. 예시 설정은 다음과 같습니다:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/your_program",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "/usr/bin/gdb",
            "preLaunchTask": "build",
            "minimized": false
        }
    ]
}

이 설정은 C++ 프로그램을 GDB 디버거를 사용하여 실행하고, VSCode에서 디버깅을 수행할 수 있게 합니다.

컨테이너에서 C++ 코드 빌드 및 실행


C++ 프로젝트를 Docker 컨테이너에서 빌드하고 실행하는 과정은 로컬 환경에서와 비슷하지만, 모든 작업이 격리된 환경에서 이루어집니다. 이를 통해 개발자는 환경에 관계없이 동일한 방식으로 빌드하고 테스트할 수 있습니다.

1. 컨테이너 시작 및 연결


VSCode에서 Remote Containers 기능을 통해 Docker 컨테이너에 연결하려면, 먼저 프로젝트 디렉토리에서 VSCode를 실행하고, 왼쪽 하단에 있는 “Reopen in Container” 옵션을 선택합니다. 이 옵션을 선택하면 VSCode가 자동으로 Docker 컨테이너를 시작하고, 프로젝트를 컨테이너 내에서 열어줍니다.

명령어

Ctrl+Shift+P > Remote-Containers: Reopen in Container

이후, VSCode가 컨테이너와 연결되면, 컨테이너 내에서 C++ 코드 작성, 빌드, 실행을 진행할 수 있습니다.

2. CMake를 통한 빌드


컨테이너 내에서 CMake를 사용하여 C++ 프로젝트를 빌드할 수 있습니다. 프로젝트가 열리면, VSCode의 CMake 확장이 자동으로 CMakeLists.txt 파일을 인식하고, 빌드 디렉토리를 설정합니다. 이후, “Build” 옵션을 사용해 프로젝트를 빌드합니다.

VSCode 내에서 다음 명령을 통해 빌드를 진행할 수 있습니다:

Ctrl+Shift+P > CMake: Build

또는, 터미널에서 직접 CMake 명령어를 사용하여 빌드할 수도 있습니다:

cmake -S . -B build
cmake --build build

3. 실행 및 디버깅


빌드가 완료된 후, C++ 프로그램을 실행하려면, VSCode의 디버그 창을 사용하여 프로그램을 실행할 수 있습니다. launch.json 파일에서 지정한 program 경로에 해당하는 실행 파일을 실행합니다.

디버깅을 시작하려면, VSCode의 디버그 버튼을 눌러 실행하거나, 터미널에서 직접 실행할 수 있습니다:

./build/your_program

디버깅을 위해 GDB와 같은 디버깅 툴을 사용하여, 코드 중단점 설정, 변수 값 추적 등을 진행할 수 있습니다.

4. 문제 해결


컨테이너에서 빌드하거나 실행 중 오류가 발생할 경우, VSCode의 “Terminal” 탭에서 로그를 확인하여 문제를 해결할 수 있습니다. 또한, Dockerfiledevcontainer.json 파일에서 필요한 툴체인이나 라이브러리가 제대로 설치되어 있는지, 설정이 올바르게 구성되어 있는지 점검해야 합니다.

VSCode는 다양한 오류 메시지를 제공하여, 문제의 원인을 쉽게 파악할 수 있도록 도와줍니다.

Remote Containers 활용한 협업 및 배포


Remote Containers는 C++ 개발 환경을 표준화하고 팀 간 협업을 원활하게 만드는 데 유용합니다. 개발 환경을 컨테이너 내에서 정의하고 공유함으로써, 팀원들은 동일한 환경에서 코드를 작성하고, 빌드하며, 디버깅할 수 있습니다. 또한, 컨테이너화된 환경은 코드의 배포에도 큰 이점을 제공합니다.

1. 협업 환경 구축


팀에서 프로젝트를 진행할 때, 각 개발자가 동일한 환경을 갖추는 것이 매우 중요합니다. Docker와 Remote Containers 기능을 사용하면, 팀원들이 동일한 Dockerfiledevcontainer.json 파일을 사용하여 컨테이너 환경을 설정할 수 있습니다. 이렇게 하면 로컬 개발 환경에 차이가 생길 염려 없이 모든 팀원이 동일한 조건에서 작업할 수 있습니다.

협업 단계

  1. Dockerfile 및 devcontainer.json 공유: 프로젝트의 버전 관리 시스템(Git)을 통해 Dockerfiledevcontainer.json 파일을 팀원과 공유합니다.
  2. VSCode에서 컨테이너 실행: 각 팀원은 VSCode를 사용하여 해당 컨테이너를 실행하고, 동일한 환경에서 개발을 시작합니다.
  3. 환경 설정 자동화: VSCode는 자동으로 필수 확장 프로그램을 설치하고, CMake 등의 빌드 도구도 자동으로 구성합니다.

2. CI/CD 파이프라인에 통합


Remote Containers는 CI/CD 파이프라인에도 통합할 수 있습니다. GitHub Actions, GitLab CI 등과 같은 도구와 함께 사용하면, 코드 변경 시마다 자동으로 테스트 및 빌드를 실행할 수 있습니다. 이 과정에서 컨테이너 환경을 그대로 사용하면, CI 서버와 로컬 개발 환경의 차이를 줄일 수 있습니다.

예시: GitHub Actions 설정


GitHub Actions에서 Docker 컨테이너를 사용한 CI 파이프라인을 설정할 수 있습니다. 다음은 기본적인 설정 예시입니다:

name: C++ Build and Test

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up Docker
        uses: docker/setup-buildx-action@v1

      - name: Build the container
        run: |
          docker build -t cpp-development -f .devcontainer/Dockerfile .

      - name: Run tests in container
        run: |
          docker run cpp-development cmake --build build

이 설정은 코드가 main 브랜치에 푸시될 때마다 Docker 이미지를 빌드하고, 컨테이너 내에서 테스트를 실행하는 방식입니다.

3. 배포 환경으로의 확장


C++ 애플리케이션을 Docker 컨테이너로 배포하는 것도 Remote Containers의 이점을 살릴 수 있는 방법입니다. 개발 환경을 완전히 Docker로 격리했기 때문에, 해당 환경을 배포 서버로 그대로 옮길 수 있습니다. 이를 통해 애플리케이션을 실행하는 서버와 개발 환경 간의 차이를 최소화할 수 있습니다.

배포 파이프라인에서 Docker 이미지를 빌드하고, 이를 실제 서버나 클라우드 서비스(AWS, GCP 등)에 배포하는 과정은 기존의 환경에 영향을 주지 않으면서 간편하게 수행할 수 있습니다.

요약


본 기사에서는 Visual Studio Code와 Remote Containers를 활용하여 C++ 개발 환경을 격리하고 효율적으로 설정하는 방법에 대해 다뤘습니다. Docker와 Remote Containers 기능을 사용하면, 개발 환경을 표준화하고 팀원 간 협업을 용이하게 만들 수 있습니다.

먼저, Dockerfiledevcontainer.json 파일을 설정하여 C++ 개발에 필요한 툴체인과 라이브러리를 자동으로 설치하고, 개발 환경을 구성할 수 있음을 설명했습니다. 또한, VSCode의 CMake 통합, 디버깅, 빌드 시스템 설정을 통해 개발자가 컨테이너 내에서 C++ 프로젝트를 손쉽게 관리할 수 있다는 점을 강조했습니다.

협업 환경에서의 이점은 물론, CI/CD 파이프라인에 Docker 컨테이너를 통합하여 자동화된 빌드와 테스트 환경을 구성하는 방법도 살펴보았습니다. 마지막으로, 동일한 컨테이너 환경을 배포 서버로 옮길 수 있어, 일관된 개발과 배포 환경을 유지할 수 있다는 점에서 큰 장점을 제공합니다.

Remote Containers를 활용한 C++ 개발 환경 구축은 팀워크와 생산성을 크게 향상시킬 수 있으며, 모든 개발자가 동일한 환경에서 작업할 수 있도록 보장합니다.