Conda 가상환경

docker? conda? 20년 차 엔지니어가 딱 정해주는 파이썬 가상환경 선택

docker? conda? 20년 차 엔지니어가 딱 정해주는 파이썬 가상환경 선택

Conda 가상환경
Conda 가상환경

서버에만 올리면 에러나는 파이썬, 도대체 왜 그럴까?

엔터프라이즈 인프라를 운영하다 보면 개발팀과 운영팀 사이에 가장 자주 오가는 실랑이가 있습니다. 바로 “내 컴퓨터에서는 분명 잘 돌아갔는데, 왜 서버에만 올리면 에러가 나죠?” 라는 질문입니다.

특히 파이썬(Python) 기반의 데이터 사이언스나 머신러닝 파이프라인, 백엔드 앱을 다룰 때 이 문제가 극에 달합니다. 프로젝트가 늘어날수록 라이브러리 버전이 뒤엉키는 일명 ‘의존성 지옥(Dependency Hell)’에 빠지기 때문입니다.

[기존 A 프로젝트] ----> NumPy 1.19 버전 필요 (안정적으로 운영 중)
[신규 B 프로젝트] ----> NumPy 1.24 버전 필수 (AI 모델 학습용)

하나의 리눅스 서버에 두 라이브러리를 무턱대고 같이 설치하는 순간, 기존 서비스가 통째로 마비되거나 신규 서비스의 패키지가 깨지는 대참사가 일어납니다.

결국 해법은 하나뿐입니다. 서로 간섭할 수 없도록 완벽하게 격리된 ‘파이썬 전용 독립 공간’을 만드는 것입니다. 이때 가장 먼저 떠오르는 두 가지 무기가 바로 도커 컨테이너(Docker Container)와 콘다 가상환경(Conda Environment)입니다.

오늘은 제가 현업에서 수많은 시행착오를 겪으며 정리한 두 기술의 격리 메커니즘 차이를 쉽게 풀고, 기업에서 표준으로 많이 쓰는 RHEL 8(Red Hat Enterprise Linux 8) 환경에서 미니콘다(Miniconda)를 트러블 없이 깔끔하게 설치하고 최적화하는 실무 노하우를 공유해 드리겠습니다.

아파트를 분양받을 것인가, 방 하나를 작업실로 쓸 것인가

두 기술은 프로세스와 라이브러리를 격리한다는 목적은 같지만, 기술적으로 파고드는 깊이와 범위가 완전히 다릅니다. 개념이 조금 낯설게 느껴진다면 우리가 사는 ‘주거 공간’에 비유하면 이해하기 쉽습니다.

도커 컨테이너: 아예 다른 호수의 새 집 분양받기

도커는 아파트 단지 내에 옆집과 완전히 분리된 ‘새로운 집’을 하나 더 얻는 것과 같습니다. 현관문, 수도관, 전기 계량기, 화장실이 물리적·논리적으로 완전히 따로 존재합니다. 옆집에서 아무리 벽을 부수고 인테리어 공사를 해도 내 집에는 먼지 한 톨 날아오지 않는 완벽한 격리 상태입니다.

기술적으로는 운영체제(OS) 커널 수준의 격리입니다. 호스트 리눅스의 커널은 공유하지만, 리눅스 자체 기술(Namespace, cgroups)을 활용해 프로세스 ID, 네트워크, 파일 시스템 자체를 통째로 독립시킵니다. 컨테이너 안에는 독자적인 패키지 매니저(apt, yum 등)가 따로 존재하는 이유입니다.

콘다 가상환경: 지금 살고 있는 집에 ‘작업실’ 만들기

콘다는 지금 내가 살고 있는 집은 그대로 두고, 비어 있는 방 하나를 ‘파이썬 전용 작업실’로 지정하는 것입니다. 방 문에 문패를 걸어두고 안의 가구(라이브러리)는 마음대로 바꿀 수 있지만, 결국 거실(커널)과 현관문(호스트 OS 파일 시스템 및 네트워크)은 같이 씁니다.

기술적으로는 프로세스 및 환경 변수 수준의 격리입니다. 특정 폴더 안에 파이썬 실행 파일과 라이브러리를 몰아넣고, 우리가 환경을 활성화(conda activate)하는 순간 리눅스의 환경 변수(PATH) 맨 앞에 해당 폴더 경로를 슥 끼워 넣는 원리입니다. 시스템 명령어가 호스트 고유의 파이썬 대신 가상환경 내의 파이썬을 먼저 바라보도록 속이는 셈입니다.

아키텍트의 시선으로 본 도커 vs 콘다 핵심 비교

현업에서 장비 스펙을 산정하거나 배포 파이프라인을 설계할 때 가장 중요하게 보는 항목들을 기준으로 두 기술을 꼼꼼하게 비교해 봤습니다.

비교 항목도커 컨테이너 (Docker)콘다 가상환경 (Conda)
격리 계층OS 커널 위 전체 영역 (파일시스템, 네트워크 등)특정 폴더 및 환경변수 (PATH) 스위칭
자원 소모량상대적으로 큼 (베이스 이미지 때문에 수백 MB ~ 수십 GB)매우 가볍고 영리함 (순수하게 설치된 패키지 용량만 점유)
구동 속도컨테이너를 띄우는 데 수 초 ~ 수십 초 소요환경 활성화 명령어 입력 즉시(1초 이내) 반영
네트워크호스트와 독립된 가상 IP 할당 (포트 포워딩 필수)호스트 OS의 네트워크 스택 및 포트를 그대로 공유
주요 목적애플리케이션의 최종 패키징, 배포 및 클라우드 이식로컬/서버 개발 단계에서의 빠른 실험과 버전 관리

왜 데이터 과학과 AI 개발자들은 ‘콘다’를 고집할까?

파이썬에는 이미 자체적으로 내장된 가벼운 가상환경 도구인 venv가 있습니다. 그런데도 왜 딥러닝이나 대규모 AI 플랫폼을 구축할 때 굳이 무거운 콘다(Conda) 생태계를 사용할까요? 실제로 써보면 알 수 있는 결정적인 실무 이유 3가지가 있습니다.

1. 파이썬 버전 자체를 내 마음대로 체인지

venv나 내장 패키지 관리자인 pip 기반 가상환경은 서버 시스템에 설치된 파이썬 엔진을 그대로 상속받아 씁니다. 예를 들어 RHEL 8 서버에 파이썬 3.6이 기본으로 깔려 있다면, venv로 만든 가상환경도 무조건 3.6 기반 위에서 라이브러리만 쪼갤 수 있습니다.

반면 콘다는 파이썬 엔진 자체를 하나의 패키지로 취급합니다. 서버에 파이썬이 몇 버전이 깔려 있든 상관없이, 콘다 안에서 독립적으로 파이썬 3.8, 3.10, 3.12 버전을 통째로 다운로드해서 각 방에 개별적으로 꽂아줄 수 있는 엄청난 유연성을 자랑합니다.

2. 악명 높은 ‘C-라이브러리’ 컴파일 에러 예방

NumPy, PyTorch, TensorFlow 같은 고성능 데이터 분석 라이브러리들은 겉만 파이썬일 뿐, 실제 알맹이는 C/C++나 NVIDIA CUDA 하드웨어 가속 라이브러리와 끈끈하게 연결되어 있습니다.

이걸 일반 pip install로 설치하다 보면 서버의 gcc 컴파일러 버전이 안 맞거나 C-라이브러리(glibc) 버전이 낮다며 시뻘건 에러 메시지를 뿜고 멈추는 경우가 허다합니다.

하지만 콘다는 단순한 패키지 관리자가 아니라 이미 컴파일이 완료된 파일 형태로 제공하는 ‘이진 바이너리 패키지 매니저’입니다. C 라이브러리까지 가상환경 폴더 내에 통째로 안전하게 내려받아 매핑해 주기 때문에, OS 환경을 건드리지 않고도 딥러닝 환경을 매끄럽게 올릴 수 있습니다.

3. 서버 용량을 아끼는 ‘미니콘다(Miniconda)’의 슬림함

처음 배울 때는 보통 이것저것 다 들어있는 ‘아나콘다(Anaconda)’를 많이 설치합니다. 하지만 기업용 서버 환경에서 쓰지도 않는 수백 개의 데이터 과학 도구가 포함된 수 GB짜리 아나콘다를 까는 건 심각한 디스크 낭비이자 보안 취약점 관리의 적입니다.

그래서 현업에서는 아나콘다에서 무거운 패키지를 싹 덜어내고, 꼭 필요한 코어 엔진만 남긴 미니콘다(Miniconda)를 씁니다. 용량이 50~100MB 내외로 가볍기 때문에 서버 용량을 극도로 아끼면서 깔끔하게 환경을 관리하기에 최적입니다.

RHEL 8 환경에 미니콘다 설치 및 최적화 3단계

그렇다면 엔터프라이즈 리눅스의 표준이라고 할 수 있는 RHEL 8 인프라에서 미니콘다를 가장 안정적으로 설치하는 정석 프로세스를 살펴보겠습니다.

💡 실무 엔지니어의 보안 팁

보안과 시스템 안정성을 위해 가상환경은 절대 root 권한으로 설치하지 마세요. 서비스 운영 계정이나 개별 개발자 계정의 홈 디렉터리(~/) 하위에 격리해서 설치하는 것이 보안상 훨씬 안전합니다.

1단계: 인스톨러 다운로드하기

먼저 다운로드에 필요한 wget 도구가 있는지 확인하고 설치한 뒤, 아나콘다 공식 저장소로부터 최신 64비트 리눅스용 미니콘다 쉘 스크립트를 다운로드합니다.

Bash

# 1. wget 유틸리티가 없다면 설치 (sudo 권한 필요)
sudo dnf install wget -y

# 2. 사용자 계정의 홈 디렉터리로 이동
cd ~

# 3. 미니콘다 공식 최신 리눅스 인스톨러 다운로드
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

2단계: 설치 스크립트 실행 및 옵션 지정

다운로드가 끝났다면 bash 명령어로 인스톨러를 실행합니다. 설치 도중 몇 가지 질문이 나오는데, 아래 가이드를 따라 진행하시면 됩니다.

Bash

# 다운로드한 쉘 스크립트 실행
bash Miniconda3-latest-Linux-x86_64.sh
  • 라이선스 약관 동의: 안내문이 나오면 Enter를 계속 눌러 최하단으로 이동한 뒤, 동의 여부를 묻는 질문에 소문자로 yes를 입력하고 엔터를 누릅니다.
  • 설치 경로 지정: 기본값으로 현재 로그인한 계정의 홈 디렉터리 하위 폴더(/home/유저명/miniconda3)를 제안합니다. 계정 간 간섭을 막는 가장 좋은 경로이므로 아무것도 입력하지 않고 그대로 Enter를 누릅니다.
  • 콘다 환경 초기화 (Conda Init): 설치 막바지에 Do you wish the installer to initialize Miniconda3...? 라는 질문이 나옵니다. 터미널에 로그인할 때마다 콘다 명령어를 바로 쓸 수 있게 자동화 스크립트를 등록하겠냐는 뜻입니다. 편의를 위해 yes를 입력해 줍니다.

3단계: 환경 변수 반영 및 정상 설치 확인

설치가 끝나도 현재 열려 있는 터미널 세션에는 바로 반영되지 않습니다. 서버를 껐다 켤 필요 없이 아래 명령어로 설정을 새로고침해 줍니다.

Bash

# 시스템 쉘 환경 설정 파일 새로고침
source ~/.bashrc

정상적으로 반영되면 터미널 프롬프트 맨 왼쪽에 현재 활성화된 가상환경 이름인 (base)라는 표식이 마법처럼 나타납니다. 마지막으로 버전이 잘 나오는지 확인하면 끝입니다.

Bash

# 설치된 콘다 엔진 버전 확인
conda --version

20년 차 엔지니어가 정리한 실무 명령어 & 트러블슈팅

설치를 마쳤다면 이제 현업에서 매일 쓰게 될 알짜배기 명령어와 팁을 익힐 차례입니다. 매뉴얼에 나오는 딱딱한 설명 대신, 실제 프로젝트에서 겪은 트러블슈팅 경험을 녹여냈습니다.

[트러블슈팅] 터미널 켤 때마다 (base) 자동 활성화 끄기

미니콘다를 깔고 나면 리눅스 서버에 로그인할 때마다 무조건 시스템 기본 환경인 (base) 가상환경이 강제로 켜집니다. 문제는 이게 서버 본연의 리눅스 시스템 데몬이나 다른 스크립트와 예기치 못한 경로 충돌(PATH)을 일으킬 수 있다는 점입니다.

그래서 엔터프라이즈 환경에서는 이 자동 활성화를 꺼두는 것이 관례(Best Practice)입니다.

Bash

# 터미널 시작 시 base 가상환경 자동 로드 옵션을 비활성화로 변경
conda config --set auto_activate_base false

# 변경된 설정을 즉각 반영
source ~/.bashrc

이렇게 해두면 터미널을 새로 열어도 무분별하게 (base)가 켜지지 않으며, 내가 원할 때만 명시적으로 켜서 사용할 수 있어 휴먼 에러를 막아줍니다.

프로젝트별 완전 격리 공간 만들고 들어가기

실제 프로젝트를 진행할 전용 공간을 만들어 보겠습니다. 여기서는 파이썬 최신 안정화 버전인 3.10 버전을 탑재한 my_env라는 이름의 방을 만듭니다.

Bash

# 1. 파이썬 3.10 버전을 탑재한 독립 가상 공간 생성 (-y로 확인 절차 패스)
conda create -n my_env python=3.10 -y

# 2. 생성된 독립 가상 공간으로 입장 (활성화)
conda activate my_env

명령어를 치면 프롬프트가 (my_env) [유저명@rhel8 ~]$ 형태로 바뀝니다. 이제부터 설치하는 모든 패키지는 오직 이 방 안에만 안전하게 갇혀 저장됩니다.

가상환경 통째로 백업해서 동료에게 넘겨주기 (협업 팁)

내가 열심히 세팅한 완벽한 라이브러리 조합과 버전 명세서를 그대로 패키징해서 동료 엔지니어나 운영 서버로 이식하고 싶을 때 쓰는 핵심 기능입니다.

Bash

# 1. 현재 가상환경의 도면을 yaml 파일로 추출해서 저장
conda env export > environment.yml

# 2. [다른 서버나 동료 PC에서] 제공받은 도면 파일을 기반으로 똑같은 환경 복제하기
conda env create -f environment.yml

가상환경에서 안전하게 나오기

작업을 모두 마치고 깨끗한 리눅스 시스템 순정 상태의 쉘로 돌아가고 싶을 때 사용하는 명령어입니다.

Bash

# 현재 활성화된 가상환경 세션을 안전하게 닫기
conda deactivate

결론: 상황에 맞는 영리한 선택이 답입니다

결론적으로 도커 컨테이너와 콘다 가상환경 중 무엇을 골라야 하는가는 기술의 우열이 아니라, “내 프로젝트가 현재 어떤 단계에 있느냐”에 따라 달라집니다.

  • 연구 및 개발 초기, 데이터 분석, AI 모델링, 잦은 패키지 실험 단계: 굳이 무거운 도커 이미지를 매번 빌드할 필요 없이, 가볍고 빠르게 움직이면서 C 라이브러리 의존성까지 제어해 주는 미니콘다 가상환경이 압도적으로 편리합니다.
  • 개발 완료 후 서비스 배포, 멀티 클라우드 이식성 보장, 쿠버네티스 운영 단계: 실행에 필요한 OS 미들웨어와 네트워크 환경까지 통째로 패키징해서 변하지 않도록 만드는 도커 컨테이너가 정답입니다.

실제 현업에서는 이 둘을 따로 쓰기보다, 도커 컨테이너라는 튼튼한 집을 먼저 짓고 그 컨테이너 내부의 패키지 관리를 위해 미니콘다로 방을 쪼개 쓰는 ‘하이브리드 조합’을 가장 많이 씁니다.

오늘 소개해 드린 RHEL 8 미니콘다 실무 구축법을 가이드 삼아, 지긋지긋한 파이썬 의존성 지옥에서 벗어나 한층 더 쾌적한 개발 인프라를 구축해 보시길 바랍니다.

전문가의 인사이트 : 함께 읽어 보세요.

VM vs Container, 무조건 유행을 따라야 할까?

참조 및 출처 URL:

https://docs.anaconda.com/miniconda