부록 E20: Conda, Docker, 환경관리
이 장에서 배울 것
이번 장에서는 환경관리(environment management)를 배웁니다. 환경은 코드가 실행될 때 필요한 파이썬 버전, R 버전, 패키지, 외부 도구의 조합입니다. 같은 코드라도 환경이 다르면 결과가 달라지거나 아예 실행되지 않을 수 있습니다.
핵심 용어를 먼저 정리하겠습니다.
- 환경(environment): 코드 실행에 필요한 언어, 패키지, 도구, 버전의 묶음입니다.
- 패키지(package): 남이 만들어 둔 코드 묶음입니다. 예를 들어 pandas, numpy, scanpy가 있습니다.
- 의존성(dependency): 어떤 패키지가 실행되기 위해 필요한 다른 패키지입니다.
- Conda: 독립된 분석 환경을 만들고 패키지를 설치하는 도구입니다. 앞으로는 Conda라고 부르겠습니다.
- 가상환경(virtual environment): 프로젝트별로 따로 만든 실행 공간입니다.
- Docker: 실행 환경을 통째로 이미지로 포장하고 컨테이너로 실행하는 도구입니다. 앞으로는 Docker라고 부르겠습니다.
- 이미지(image): 실행 환경을 담은 설계도입니다.
- 컨테이너(container): 이미지를 실제로 실행한 격리된 공간입니다.
가장 쉬운 비유: 요리 레시피와 주방
코드가 레시피라면 환경은 주방입니다. 레시피가 같아도 오븐 온도, 재료, 도구가 다르면 결과가 달라질 수 있습니다. 생물정보학 분석도 같습니다. 코드가 같아도 pandas 버전이나 samtools 버전이 다르면 오류가 나거나 결과 형식이 달라질 수 있습니다.
왜 환경관리가 필요한가
연구실에서 흔한 문제는 이런 것입니다.
내 컴퓨터에서는 됐는데 서버에서는 안 됩니다.
작년에는 돌아갔는데 올해 다시 실행하니 오류가 납니다.
동료가 보낸 코드가 내 환경에서는 패키지 충돌로 실행되지 않습니다.
이런 문제를 줄이기 위해 환경을 명시적으로 기록해야 합니다.
Conda 기본 흐름
Conda로 프로젝트 전용 환경을 만들 수 있습니다.
conda create -n rnaseq python=3.11
conda activate rnaseq
conda install pandas numpy scipy
여기서 rnaseq는 환경 이름입니다. 이 환경 안에 설치한 패키지는 다른 프로젝트 환경과 섞이지 않습니다.
환경 목록은 다음처럼 볼 수 있습니다.
conda env list
환경을 나갈 때는 다음 명령을 씁니다.
conda deactivate
environment.yml로 환경 기록하기
환경을 문서로 남기려면 environment.yml 파일을 만들 수 있습니다.
name: rnaseq
channels:
- conda-forge
- bioconda
dependencies:
- python=3.11
- pandas
- numpy
- samtools
이 파일이 있으면 다른 사람은 다음 명령으로 비슷한 환경을 만들 수 있습니다.
conda env create -f environment.yml
생물정보학에서는 bioconda 채널이 자주 등장합니다. bioconda는 생물정보학 도구를 Conda로 설치할 수 있게 모아 둔 저장소입니다.
Docker는 환경을 통째로 포장합니다
Conda가 패키지를 정리하는 도구라면, Docker는 실행 공간을 더 통째로 포장하는 도구에 가깝습니다. Docker 이미지는 “이 분석을 실행하기 위한 작은 컴퓨터 설계도”처럼 생각하면 됩니다.
간단한 Dockerfile은 다음처럼 생길 수 있습니다.
FROM python:3.11
RUN pip install pandas numpy scipy
WORKDIR /analysis
COPY analysis.py .
CMD ["python", "analysis.py"]
이 파일은 파이썬 3.11을 바탕으로 패키지를 설치하고 analysis.py를 실행하는 환경을 정의합니다.
버전 고정이 중요한 이유
패키지는 계속 업데이트됩니다. 업데이트는 좋은 일이지만, 연구 재현성에는 위험이 될 수 있습니다. 예를 들어 어떤 함수의 기본 옵션이 바뀌면 같은 코드도 다른 결과를 낼 수 있습니다.
그래서 중요한 분석에서는 버전을 적어 두는 것이 좋습니다.
python=3.11
pandas=2.2.0
samtools=1.19
모든 버전을 영원히 고정할 필요는 없지만, 논문 결과나 중요한 보고서를 재현해야 한다면 환경 기록은 필수입니다.
Conda와 Docker의 차이
Conda는 상대적으로 배우기 쉽고 연구실 서버에서 많이 씁니다. Docker는 환경을 더 강하게 격리하지만, 일부 HPC 환경에서는 권한 문제로 바로 쓰기 어려울 수 있습니다. 이때는 Singularity 또는 Apptainer 같은 컨테이너 도구를 쓰기도 합니다. 입문 단계에서는 “Conda는 패키지 환경, Docker는 실행 환경 포장” 정도로 이해하면 충분합니다.
실전 보강: environment.yml만으로 끝이 아닐 수 있다
environment.yml은 환경 재현에 큰 도움이 되지만 완벽한 마법은 아닙니다. 같은 패키지 이름이라도 채널, 운영체제, 하위 의존성 버전에 따라 결과가 달라질 수 있습니다.
name: rnaseq
channels:
- conda-forge
- bioconda
dependencies:
- python=3.11
- pandas=2.2
- samtools=1.19
이 파일은 “어떤 환경을 만들려고 했는지”를 기록합니다. 더 강한 재현성이 필요하면 lock file, Docker image tag, 실행한 운영체제, 주요 도구 버전까지 함께 남깁니다.
실전 보강: HPC에서는 Docker가 바로 안 될 수 있다
Docker는 편하지만 많은 HPC에서는 보안상 일반 사용자가 Docker를 직접 실행하지 못합니다. 대신 Apptainer/Singularity 같은 컨테이너 도구를 쓰는 경우가 많습니다. 입문 단계에서는 “로컬이나 클라우드에서는 Docker, HPC에서는 Apptainer 계열을 만날 수 있다” 정도로 이해하면 됩니다.
Docker 이미지도 latest 태그만 쓰면 시간이 지나 이미지 내용이 바뀔 수 있습니다. 가능하면 명시적인 버전 태그를 사용해야 합니다.
숫자 감각: 버전 조합이 많아지는 이유
환경관리는 단순히 패키지 이름을 적는 일이 아닙니다. 패키지 5개가 있고 각 패키지가 가능한 버전 3개씩만 있어도 조합은 3^5 = 243가지가 됩니다.
패키지 5개 × 각 3개 버전 후보 → 3×3×3×3×3 = 243가지 조합
실제 생물정보학 도구는 여기에 운영체제, 채널, 컴파일 옵션, 외부 바이너리 버전까지 얽힙니다. 그래서 environment.yml, lock file, Docker/Apptainer 이미지, 도구 버전 기록이 필요합니다.
초보자가 자주 하는 오해
- 오해 1: Conda를 쓰면 무조건 재현된다. 채널과 하위 의존성 차이로 달라질 수 있습니다.
- 오해 2: Docker면 운영체제까지 완전히 같은 컴퓨터가 된다. host 커널, 파일 경로, 권한, GPU 설정 등은 여전히 영향을 줄 수 있습니다.
- 오해 3: 패키지 충돌은 내 실력 부족 때문이다. 생물정보학 도구 의존성은 실제로 복잡합니다.
- 오해 4: 버전 기록은 논문 끝나고 해도 된다. 분석할 때 바로 기록해야 나중에 재현됩니다.
이전 개념과 다음 개념의 연결
환경관리는 E21 워크플로우와 결합될 때 강해집니다. 같은 규칙이 같은 환경에서 실행되어야 결과를 믿을 수 있습니다. E24 재현성의 핵심 구성요소도 코드, 데이터, 환경, 파라미터입니다.
생물정보학에서 왜 중요한가
생물정보학 분석은 여러 도구를 이어 붙입니다. Python, R, samtools, STAR, DESeq2, scanpy가 한 프로젝트 안에 함께 들어갈 수 있습니다. 환경을 기록하지 않으면 나중에 같은 분석을 다시 실행하기 어렵습니다.
미니 실습 블록: Conda 환경과 Dockerfile로 실행 환경 기록하기
이 실습은 Conda 환경과 Dockerfile로 실행 환경 기록하기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, 같은 코드도 Python, R, 패키지 버전이 달라지면 실행 결과가 달라지거나 아예 실행되지 않을 수 있기 때문입니다.
name: rnaseq-mini
channels:
- conda-forge
- bioconda
dependencies:
- python=3.11
- pandas
- snakemake
- fastqc
- multiqc
각 코드 요소의 의미를 풀어보면 다음과 같습니다. environment.yml은 conda 환경의 이름, 채널, 패키지 목록을 기록합니다. 다른 사람은 이 파일로 비슷한 실행 환경을 만들 수 있습니다.
생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. FASTQC, MultiQC, Snakemake, pandas를 한 프로젝트에서 같이 쓸 때 환경을 공유하는 데 필요합니다.
흔한 오해 또는 주의점도 있습니다. 패키지 이름만 있고 버전이 전혀 없으면 시간이 지나며 다른 버전이 설치될 수 있습니다. 중요한 도구는 버전을 고정하거나 보고서에 기록합니다.
핵심 정리
환경관리는 코드가 같은 조건에서 다시 실행되도록 만드는 작업입니다. Conda는 프로젝트별 패키지 환경을 만들고, Docker는 실행 환경을 통째로 포장합니다. 좋은 연구 코드는 코드뿐 아니라 환경 파일도 함께 남깁니다.
문제 풀이
Conda, Docker, 환경관리
주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.
-
1. [객관식] 객관식
환경(environment)의 설명으로 적절한 것은?
-
2. [객관식] 객관식
패키지(package)의 설명으로 적절한 것은?
-
3. [객관식] 객관식
의존성(dependency)의 의미로 적절한 것은?
-
4. [객관식] 객관식
Conda의 대표적 역할은?
-
5. [객관식] 객관식
conda create -n rnaseq python=3.11의 의미는? -
6. [객관식] 객관식
conda activate rnaseq의 역할은? -
7. [객관식] 객관식
environment.yml의 역할로 적절한 것은?
-
8. [객관식] 객관식
bioconda의 설명으로 적절한 것은?
-
9. [객관식] 객관식
Docker 이미지(image)의 설명으로 적절한 것은?
-
10. [객관식] 객관식
Docker 컨테이너(container)의 설명으로 적절한 것은?
-
11. [객관식] 객관식
버전 고정이 중요한 이유는?
-
12. [객관식] 객관식
conda env create -f environment.yml의 역할은? -
13. [객관식] 객관식
Conda와 Docker 차이에 대한 설명으로 적절한 것은?
-
14. [객관식] 객관식
HPC에서 Docker를 바로 쓰기 어려울 수 있는 이유로 적절한 것은?
-
15. [객관식] 객관식
Singularity/Apptainer가 언급되는 상황으로 적절한 것은?
-
16. [객관식] 객관식
환경관리가 “내 컴퓨터에서는 됐는데 서버에서는 안 됨” 문제를 줄이는 이유는?
-
17. [객관식] 객관식
Dockerfile의 역할로 적절한 것은?
-
18. [객관식] 객관식
분석 재현성을 위해 기록할 것으로 적절한 것은?
-
19. [객관식] 객관식
프로젝트마다 가상환경을 따로 쓰는 이유는?
-
20. [객관식] 객관식
중요 분석에서 패키지 버전을 전혀 기록하지 않으면 생길 수 있는 문제는?
-
21. [객관식] 객관식
environment.yml에 패키지 버전을 적는 주된 이유는? -
22. [객관식] 객관식
다음 YAML 일부에서 설치하려는 Python 버전은?
-
23. [객관식] 객관식
Docker 이미지와 컨테이너의 관계로 가장 적절한 것은?
-
24. [객관식] 객관식
Docker tag로
latest만 쓰는 것이 위험할 수 있는 이유는? -
25. [객관식] 객관식
HPC에서 Docker 대신 Apptainer/Singularity를 만날 수 있는 이유는?
-
26. [객관식] 객관식
Conda 환경을 프로젝트별로 나누는 이유로 적절한 것은?
-
27. [객관식] 객관식
conda activate rnaseq의 의미로 가장 적절한 것은? -
28. [객관식] 객관식
환경 기록에 OS나 외부 도구 버전까지 남기는 것이 좋은 이유는?
-
29. [객관식] 객관식
패키지 충돌이 났을 때 적절한 태도는?
-
30. [객관식] 객관식
Conda와 Docker를 함께 쓰는 상황으로 적절한 것은?
-
31. [실전] 객관식
environment.yml의 주요 목적은? -
32. [실전] 객관식
Docker가 conda보다 더 강하게 도와주는 부분은?
-
주관식 33. [응용] 주관식 · Gemini 채점
환경관리의 필요성을 “같은 코드인데 결과가 다를 수 있다”는 관점에서 설명하라.
-
주관식 34. [응용] 주관식 · Gemini 채점
Conda 환경을 만드는 기본 흐름을 설명하라.
-
주관식 35. [응용] 주관식 · Gemini 채점
environment.yml이 협업과 재현성에 유용한 이유를 설명하라.
-
주관식 36. [응용] 주관식 · Gemini 채점
Docker 이미지와 컨테이너의 차이를 설명하라.
-
주관식 37. [응용] 주관식 · Gemini 채점
Conda와 Docker의 차이를 입문자 눈높이로 설명하라.
-
주관식 38. [응용] 주관식 · Gemini 채점
인간 유전체 분석 프로젝트에서 환경 기록이 중요한 이유를 설명하라.
-
주관식 39. [응용] 주관식 · Gemini 채점
Conda 환경 파일만으로 재현성이 완벽하지 않을 수 있는 이유와 보완 방법을 설명하라.
-
주관식 40. [응용] 주관식 · Gemini 채점
Docker와 Conda의 차이를 생물정보학 분석 상황에 맞춰 설명하라.
-
주관식 41. [실습] 주관식 · Gemini 채점
Python 3.11, pandas, snakemake가 들어간 간단한
environment.yml을 작성하라. -
주관식 42. [실습] 주관식 · Gemini 채점
환경관리가 생물정보학 분석에서 중요한 이유를 설명하라.