도커를 사용하여 간단한 Python 애플리케이션을 실행하는 방법과 인터렉티브 모드에 대해서 알아보겠습니다.
NodeJS 데모 애플리케이션을 통해 웹 서버와 요청 처리에 대한 이해를 바탕으로 Python 애플리케이션을 도커화하는 과정과 인터렉티브 모드에 대해서 알아보도록 하겠습니다.
포스팅 목차
도커화 과정
이전 과정을 통해서 간단한 node.js 웹 애플리케이션을 도커화하는 과정에 대해서 확인을 했으며 해당 과정을 못보시는 분들은 아래 링크를 통해서 확인을 해주시면 됩니다.
Python 애플리케이션 설명
from random import randint
min_number = int(input('Please enter the min number: '))
max_number = int(input('Please enter the max number: '))
if (max_number < min_number):
print('Invalid input - shutting down...')
else:
rnd_number = randint(min_number, max_number)
print(rnd_number)
Python 애플리케이션은 사용자로부터 최소값과 최대값을 입력받아 랜덤 값을 생성하고 출력하는 기능을 가지고 있습니다. 웹 서버를 생성하지 않으며, 단순한 최소값 최대값을 입력받아 랜덤 값을 생성하는 애플리케이션입니다.
Dockerfile 작성
- 베이스 이미지 선택 : 도커 허브에서 공식 Python 이미지를 검색하여 사용합니다,
- 작업 디렉토리 설정 : WORKDIR /app으로 설정합니다.
- 코드 파일 복사 : COPY . .를 사용하여 로컬 폴더의 모든 항목을 /app 폴더에 복사합니다.
- 실행 명령 추가 : CMD [“python”, “rng.py”]를 추가하여 컨테이너 시작 시 rng.py 파일을실행하도록 설정을 합니다.도커파일 생성 과정
FROM python
WORKDIR /app
COPY . /app
CMD ["python", "rng.py"]
이제 Dockerfile을 작성한 후, docker build . 명령어를 사용하여 이미지를 빌드합니다. 이 과정에서 Python 베이스 이미지도 다운로드되므로 시간이 조금 더 걸릴 수 있습니다.
docker build .
컨테이너 실행
이미지가 생성되면, docker run 명령어를 사용하여 컨테이너를 실행이 가능하며 이때 포트를 노출할 필요는 없습니다.
docker run으로 컨테이너를 실행을 하면 기본적으로 attached 모드에서 실행되므로 입력을 받을 수 없습니다.
Attached 모드 ( 컨테이너의 출력이 직접 터미널에 표시됨, 컨테이너의 표준 입력(stdin), 출력(stdout), 에러(stderr)가 터미널에 직접 연결, 터미널을 종료하면 컨테이너도 종료됨 )
현재 파이썬 코드는 입력을 받아야 실행이 가능한 파이썬 애플리케이션이므로 기본적으로 docker run 명령어로 실행하게 되면 오류가 발생할 수 있습니다.
해당 문제를 해결하기 위해 -it 플래그를 추가하여 인터렉티브 모드로 실행합니다. docker run -it <image_id>
docker run -it 인터렉티브 모드로 실행을 하면 사용자 특정 값을 입력을 받을 수 있게 됩니다.
Detached 모드 ( 컨테이너가 백그라운드에서 실행됨, 터미널과 독립적으로 실행, 터미널을 종료해도 컨테이너는 계속 실행 )
최소값과 최대값을 입력하면 랜덤 숫자가 반환됩니다.
컨테이너 재시작
컨테이너가 종료된 후, docker start 명령어로 다시 시작할 수 있지만, 기본적으로 detached 모드로 실행되므로 입력을 받을 수 없습니다.
해당 문제를 해결하기 위해 docker start -ai <container_id> 명령어를 사용하여 attached 모드로 시작하면, 다시 입력을 받을 수 있습니다.
마무리..
도커가 웹 서버와 웹 애플리케이션에만 국한되지 않고, 간단한 유틸리티 애플리케이션을 도커화하는 데에도 활용될 수 있습니다.
도커는 다양한 프로세스와 상호작용할 수 있는 유연성을 제공하며, 필요에 따라 컨테이너와의 상호작용을 조정할 수 있습니다.