궁극적인 ‘It Works on My Machine’ 해결책: 폴리글롯(C++, Rust, Python) 구축, 원격 IDE 및 Jupyter-Ready Container

발행: (2025년 12월 14일 오후 02:49 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

TL;DR: 우리가 만들고자 하는 것

이 가이드는 의존성 지옥과 권한 오류를 해결하기 위해, 원칙부터 시작하는 전문‑급 개발 환경을 구축합니다.

핵심: “내 컴퓨터에서는 동작한다” 문제를 없애는 재현 가능한 Debian 12 컨테이너.

스택: GCC 15.2, Rust 1.89, 그리고 실험용 3.13 nogil 빌드를 포함한 여러 샌드박스 Python 버전을 갖춘 맞춤형 폴리글랏 툴체인.

워크플로우

  • 권한‑안전: 호스트 사용자 ID를 자동으로 컨테이너에 매핑해 루트 소유 파일 잠금을 방지합니다.
  • 원격 IDE 준비: SSH를 통해 VS CodeJetBrains IDE에 원활히 연결해 전체 데스크톱 환경을 제공합니다.
  • 인터랙티브: 자체 서명 TLS를 사용한 백그라운드 JupyterLab 서버가 포함되어 안전하게 데이터 탐색이 가능합니다.

GitHub repository

Introduction

대부분의 개발 환경은 타협입니다—시스템 패키지, 충돌하는 의존성, 그리고 고전적인 “내 컴퓨터에서는 동작한다” 문제의 얇은 조합이죠. Docker는 해결책을 제공하지만 파일 권한, 거대한 이미지, 맞춤화가 어려운 툴체인 등 자체적인 골칫거리를 만들곤 합니다. 이 가이드는 그런 타협을 거부합니다.

우리는 원칙‑기반 접근법을 사용해, C, C++, Python, Rust 등 다중 언어 개발 환경을 처음부터 구축합니다. 컨테이너가 전통적인 가상 머신보다 근본적으로 더 효율적인 이유를 배우고, 다음을 제공하는 Dockerfile을 만들게 됩니다:

  • 로컬 파일과 원활히 작동하는 권한‑안전 아키텍처.
  • 소스에서 직접 컴파일한 맞춤형 최신 툴체인.
  • 진정한 원격 개발을 위한 JupyterLabSSH 접근 통합.

마지막까지 진행하면 강력하고 재현 가능한 환경을 손에 넣고, 앞으로 필요할 모든 개발 컨테이너를 직접 구축·맞춤화하는 지식을 얻게 됩니다.

A Quick Note on Operating Systems

이 가이드는 Debian‑기반 Linux 시스템(Debian 12)을 전제로 합니다. 모든 명령어와 경로는 해당 네이티브 환경을 기준으로 작성되었습니다.

Windows를 사용한다면 Windows Subsystem for Linux (WSL) 안에서 설정을 실행해야 합니다. BIOS에서 가상화를 활성화하고 다음 명령으로 WSL을 설치합니다:

wsl --install

(Windows‑전용 상세 단계는 생략했습니다.)

Foundations

A Primer on Isolation

모든 개발자는 두려운 문구 “하지만 내 컴퓨터에서는 동작한다.” 를 들어본 적이 있을 겁니다. 이는 환경이 불안정하고, 일관성이 없으며, 재현이 불가능함을 의미합니다.

로컬 머신은 종종 서로 경쟁하는 의존성으로 가득 찬 전쟁터가 됩니다—다른 프로젝트가 서로 다른 Python 버전을 요구하고, 한 작업을 위해 시스템 라이브러리를 업그레이드하면 다른 작업이 깨지는 식이며, 새로운 개발자를 온보딩하는 과정이 오래된 스크립트를 파헤치는 고고학 작업이 되기도 합니다.

이 가이드의 목표는 다음과 같은 개발 환경을 만드는 것입니다:

  • 깨끗함
  • 재현성
  • 이식성

팀의 모든 개발자에게 동일하고, 궁극적으로 코드를 실행할 프로덕션 환경과도 동일합니다.

Traditional Virtualization (The Heavyweight Approach)

전통적인 가상화는 하이퍼바이저를 사용해 전체 하드웨어(CPU, RAM, 스토리지, 네트워크)를 에뮬레이션합니다. 각 가상 머신(VM)은 완전한 게스트 운영 체제를 포함하므로, 컴퓨터 안에 또 다른 컴퓨터를 실행하는 것과 같습니다. 이 방식은 견고하지만 시작 시간, RAM, 디스크 사용량 측면에서 큰 오버헤드를 발생시킵니다.

Linux에서는 보통 KVM(Kernel‑based Virtual Machine)과 QEMU 같은 도구가 사용됩니다. 강력하지만 개발 작업에는 과도한 경우가 많습니다.

Containerization (The Lightweight Approach)

컨테이너는 OS‑레벨 가상화 기술입니다. 하드웨어를 에뮬레이션하는 대신, 컨테이너는 호스트 커널을 공유하는 격리된 프로세스입니다. 이를 가능하게 하는 두 가지 커널 기능은 다음과 같습니다:

  • 네임스페이스 – 파일시스템, 네트워크 스택, 프로세스 ID 등을 격리합니다.
  • 컨트롤 그룹(cgroups) – CPU, RAM 등 자원을 제한합니다.

호스트 OS를 건물의 기초와 공유 인프라라 생각하고, 각 컨테이너는 개인 아파트라고 보면 됩니다. 네임스페이스가 벽과 잠긴 문이고, cgroups가 회로 차단기 역할을 합니다.

게스트 OS를 부팅할 필요가 없기 때문에 컨테이너는 밀리초 단위로 시작되며 자원 오버헤드도 최소에 불과합니다.

Why We Choose Docker

Docker는 컨테이너 자체를 발명한 것은 아니지만, 그 기반 기술을 개발자 친화적인 생태계로 패키징했습니다:

  • 이미지 빌드를 위한 청사진 역할을 하는 간단한 텍스트 기반 Dockerfile.
  • 이미지를 빌드·배포·실행할 수 있는 강력한 CLI를 제공하는 Docker Engine.
  • 사전 구축된 이미지를 공유할 수 있는 공개 라이브러리 Docker Hub.

이 도구들은 OS‑레벨 가상화의 속도와 효율성을 뛰어난 재현성과 결합하여, 우리 개발 환경에 Docker가 최적의 선택이 되게 합니다.

Back to Blog

관련 글

더 보기 »