
FROM python
WORKDIR /app
COPY . /app
CMD [ "python", "rng.py" ]
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)
지금까지 우리는 NodeJS를 사용하여 웹 서버를 가동하는 데모 애플리케이션을 살펴보았습니다. 이 예제는 웹 개발, 웹 서버 실행, 그리고 들어오는 요청을 처리하는 등 웹 관련 프로세스를 보여주는 데 초점을 맞추고 있었습니다. 이는 Docker의 주요 사용 사례 중 하나로, 웹 서비스를 Docker 컨테이너로 실행하여 일관된 환경을 제공하는 것입니다. NodeJS, PHP, Python 등 어떤 언어를 사용하든 웹 서비스를 구축하고 Docker를 활용할 수 있습니다.
하지만 Docker는 웹 서버나 웹 애플리케이션에만 국한되지 않습니다. 이번에는 강의에 첨부된 간단한 Python 애플리케이션을 예로 들어 보겠습니다. 이 애플리케이션은 Python 3 버전으로 작성되었으며, 웹 서버를 생성하지 않고도 동작합니다.
Python 애플리케이션 설명
Python에 익숙하지 않으시다면, 이 애플리케이션이 어떻게 동작하는지 간략하게 설명해 드리겠습니다:
이 프로그램은 시스템에 Python이 설치되어 있다면 터미널에서 직접 실행할 수 있습니다. 그러나 이번에는 이 프로그램을 Docker 이미지로 만들어 Docker 컨테이너에서 실행해 보겠습니다.
Docker로 Python 애플리케이션 실행하기
이렇게 하는 이유는 두 가지입니다:
Dockerfile 작성하기
먼저, 이 애플리케이션을 위한 Dockerfile을 작성해야 합니다. Dockerfile은 Docker 이미지를 빌드하기 위한 설정 파일입니다. 아래는 단계별로 Dockerfile을 작성하는 방법입니다:
베이스 이미지 설정:
FROM python:3
작업 디렉토리 설정:
WORKDIR /app
/app으로 설정합니다.코드 파일 복사:
COPY . /app
/app 디렉토리로 복사합니다.rng.py 파일이 복사됩니다.실행 명령 설정:
CMD ["python", "rng.py"]
rng.py 파일을 실행합니다.이미지 빌드하기
Dockerfile이 준비되었으니 Docker 이미지를 빌드해 보겠습니다:
docker build -t my-python-app .
-t 옵션은 이미지를 태그합니다. 여기서는 my-python-app이라는 이름을 사용했습니다..은 현재 디렉토리의 Dockerfile을 사용하겠다는 의미입니다.컨테이너 실행하기
이미지가 빌드되면 컨테이너를 실행합니다:
docker run my-python-app
그러나 이 명령을 실행하면 다음과 같은 오류가 발생할 수 있습니다:
EOFError: EOF when reading a line
이 오류는 컨테이너가 사용자 입력을 받을 수 없는 상태이기 때문에 발생합니다. 기본적으로 docker run은 표준 입력을 전달하지 않으므로, 사용자 입력이 필요한 애플리케이션과 상호 작용할 수 없습니다.
인터랙티브 모드로 컨테이너 실행하기
사용자 입력을 가능하게 하려면 -i와 -t 옵션을 사용하여 컨테이너를 인터랙티브 모드로 실행해야 합니다:
-i (--interactive): 컨테이너의 표준 입력을 열어둡니다.-t (--tty): 가상 터미널을 할당합니다.두 옵션을 함께 사용하면 컨테이너와 상호 작용할 수 있는 터미널 세션이 만들어집니다. 실행 명령은 다음과 같습니다:
docker run -it my-python-app
이제 터미널에서 최소값과 최대값을 입력할 수 있으며, 프로그램은 정상적으로 랜덤 숫자를 생성하여 출력합니다.
컨테이너 재실행하기
컨테이너 실행이 완료되면 컨테이너는 종료됩니다. 이미 종료된 컨테이너를 다시 실행하려면 docker start 명령을 사용합니다. 그러나 docker start는 기본적으로 분리(detached) 모드로 실행되며, 인터랙티브 세션을 제공하지 않습니다.
이를 해결하기 위해 다음과 같이 -a와 -i 옵션을 사용합니다:
docker start -ai <컨테이너_ID>
-a (--attach): 컨테이너의 표준 출력을 현재 터미널에 연결합니다.-i (--interactive): 컨테이너의 표준 입력을 현재 터미널에 연결합니다.이렇게 하면 컨테이너를 다시 시작하면서 인터랙티브 모드로 실행되어, 다시 최소값과 최대값을 입력할 수 있습니다.
컨테이너 실행 모드 이해하기
컨테이너 실행 모드에 대한 이해는 중요합니다:
docker run 명령의 기본 모드입니다.-d 옵션을 사용하여 실행합니다.사용자 입력이 필요한 애플리케이션은 인터랙티브 모드로 실행해야 하며, 그렇지 않으면 입력을 받을 수 없어 오류가 발생합니다.
Docker의 활용 범위
이 예제를 통해 Docker가 웹 서버나 장기 실행 프로세스에만 국한되지 않고, 간단한 유틸리티 애플리케이션에도 활용될 수 있다는 것을 알 수 있습니다. 사용자와 상호 작용이 필요한 프로그램도 Docker 컨테이너에서 실행할 수 있으며, 필요에 따라 컨테이너와 상호 작용할 수 있습니다.
요약
-it 옵션을 사용하여 인터랙티브 모드로 실행해야 합니다.docker start -ai 명령을 사용합니다.다음 단계
이제 이전에 다루었던 NodeJS 애플리케이션으로 돌아가서 Docker의 다른 기능과 활용 방법을 살펴보겠습니다. 하지만 이번 예제를 통해 Docker가 얼마나 유연하고 다양한 환경에서 사용될 수 있는지 이해하셨기를 바랍니다. 필요에 따라 컨테이너와 상호 작용할 수 있으며, 이를 통해 개발 및 배포 프로세스를 더욱 효율적으로 관리할 수 있습니다.