Docker 이미지 내부 가상환경에 대해서
Docker image 와 가상환경(venv)
프로젝트를 Docker image로 실행하기 위한 작업을 진행중이다.
가상환경에 대해서 조금씩 이해해 가는 도중.. Docker file을 작성할때, 내부에 가상환경을 띄우고 패키지를 설치해야되는지가 궁금해졌다.
찾아본 내용은 Python 기반입니다!
-
가장 먼저 Docker 공식 홈페이지에서 Python 이미지를 빌드하는 것을 찾아봤다.
-
공식 문서에서 이미지를 Build 하는 과정을 보면 프로젝트 진행에서는 가상환경에 패키지를 설치하는 것을 보여준다.
-
그리고 그 가상환경에 설치된 패키지를 freeze 명령어를 사용해 파일로 저장한다.
python3 -m pip freeze > requirements.txt
-
그리고 Docker file 작성시에 requirements.txt를 이미지 내부로 복사하고 그냥 pip 설치를 진행한다.
-
처음에 생각했던 것도 Docker Container는 가상 머신과 유사하기 때문에 따로 가상 환경을 설치하지 않아도 된다고 생각했다.
-
하지만 검색해보니 과거에 토론한 흔적들을 찾을 수 있었다.
-
https://stackoverflow.com/questions/48561981/activate-python-virtualenv-in-dockerfile
-
https://stackoverflow.com/questions/29146792/why-do-people-create-virtualenv-in-a-docker-container
-
내용은 이러했다.
컨테이너화 되기 때문에 가상 환경과 유사해서 필요없다!!
- 생각했던 것과 어느정도 일치했다.
- 하지만 필요성을 주장하는 사람들도 있다. 그 주장들을 살펴보면
1. 이미지 크기를 줄일 수 있다?
>> 이 부분은 사실 이해가 잘 되지 않는다.. 전역적으로 설치하나 가상환경에 설치하나 패키지는 똑같이 설치되는 것이 아닌가??
2. 컨테이너 내부에서도 의존성 문제가 발생할 수 있다.
>> 이 부분은 의존성 문제를 이론으로만 배우고 겪어보지 않아서 정확하게 이해는 못했다. 만약 패키지를 추가해야될 상황에 그 패키지에 의존하는 다른 패키지 중에 겹치는 것이 있어서 버전이 달라지면 문제가 발생할 수 있을 것이라고 생각한다. 그리고 이러한 상황에서 변화가 유동적이지 않는게 pip 의 단점이라고 본 것 같다.
3. Docker file 하나에서 여러 앱을 실행할 때 필요하다?
>> 이 말을 처음들었을 때, Docker compose 로 여러 이미지를 실행하면 되지 않나? 라고 생각했다. 하지만 이미지 크기에 대해서는 유의미한 것 같다. 이미지 여러개를 실행하는 것 보다 하나의 이미지에서 실행할 수 있다면 조금 더 용량적인 면에서 이익을 가지고 올 수 있지 않을까?
- 필요한 이유는 크게 이정도 인것 같다.
- 더 찾다보니 venv 보다 Python 의존성 관리 툴인 Poetry 사용을 권장하기도 했다.
- Poetry 가이드에서는 컨테이너 내부에서 가상환경을 만들지 않는 옵션을 추가해서 패키지를 관리하는 방법을 권하고 있기도 하다.
여기까지 찾아본 내용이다. 하지만 궁금증이 명확하게 해결 된건 아니다. 결국에는 필요하면 쓰면되고 그게아니라면 해도되고 안해도 된다는 느낌이다.
실제 Docker를 사용하는 회사에서 이런 것에 대한 명확한 솔루션이 있는지 궁금하다. 아니면 아직 지식이 부족해서 이해를 못하는 건가…
가상화 관련된 지식은 운영체제 공부하면서 더 알아봐야겠다.
추가로 알게된 내용은 계속해서 추가할 예정!