본문 바로가기
인공지능 개발하기/Backend

[Docker] 3. 이미지 사용해서 컨테이너 생성해서 코드 실행하기

by 선의공 2024. 10. 14.

 

 

안녕하세요.

이번 포스팅에서는 도커 이미지를 사용해서 컨테이너를 생성하고

코드를 실행해보겠습니다.

 


 

1. 실행할 코드 확인

 

저는 아래의 프로젝트 코드를 실행하고 싶은데요.

해당 코드는 2개의 min, max number를 받아서

만약 min number가 max number보다 크다면 "Invalid input - shutting down..." 이라는 문구를 출력하고

그렇지 않다면 min, max number 사이의 랜덤 넘버를 출력하는 코드입니다.

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)

 

 

하지만 저는 PC에 Python 환경설정이 되어있지 않습니다.

그래서 Docker만으로만 컨테이너를 생성해서 실행해주겠습니다.

 

위의 코드를 rng.py란 이름으로 생성해줍니다.


2.Dockerfile 생성

 

그리고 "Dockerfile"이라는 이름의 파일을 생성합니다.

rng.py는 도커 컨테이너에서 실행할 파일,

Dockerfile은 rng.py를 실행하기 위해 Docker에 대한 환경 설정을 하는 파일이 됩니다.

 

 

Dockerfile에 아래와 같은 코드를 입력해줍니다.

FROM python

WORKDIR /app

COPY . /app

CMD [ "python", "rng.py" ]

 

FROM은 기본 이미지를 설정하는 명령어입니다.

FROM python

 

Docker Hub에 python이라는 이미지가 올라와 있습니다.

이 이미지를 베이스로 사용하겠다고 설정합니다.

https://hub.docker.com/_/python

 

python - Official Image | Docker Hub

python •• Python is an interpreted, interactive, object-oriented, open-source programming language.

hub.docker.com

 

WORKDIR은 컨테이너 내의 작업 디렉토리를 설정합니다.

WORKDIR /app

app이라는 디렉토리를 생성해서 해당 컨테이너의 디렉토리를 설정합니다.

Docker는 해당 디렉토리 기준으로 작업 파일을 찾고 생성합니다.

 

COPY는 로컬 디렉토리 전체를 디렉토리 경로에 복사하는 명령어이며

COPY ./app 

로컬 실행파일들을 컨테이너의 app 디렉토리로 복사합니다.

 

CMD는 ["<커멘드>", "<파라미터1>", "<파라미터2>"] 형태로 설정가능합니다.

["python", "rng.py"] 라면 Docker컨테이너 실행시

python command로 rng.py 파일을 실행한다는 의미입니다.

 

터미널에서 아래와 같이 python rng.py를 입력한다면

python을 이용해 rng.py를 실행하게 되는데 같은 의미입니다.

cd ./파일 디렉토리 이동
python rng.py

 

또, 기본적으로 python 커멘드만 필수로 사용하고 다른 파일들을 실행한다면

ENTRYPOINT 명령어를 사용해줄 수도 있습니다.

ENTRYPOINT ["python"]
CMD [ "rng.py" ]

위의 CMD ["python", "rng.py"]와 동일한 동작입니다.

 

명령어에 대한 설명은 해당 블로그를 참고했습니다!

https://www.daleseo.com/dockerfile/

 

Dockerfile에서 자주 쓰이는 명령어

Engineering Blog by Dale Seo

www.daleseo.com

 


 

3. Docker 이미지 생성하기

 

Docker의 컨테이너를 실행하기 위해서는 이미지가 필요합니다.

하나의 이미지로 여러개의 컨테이너를 생성할 수 있다는 장점이 있습니다!.

 

왜 용어가 이미지일까요??

프로젝트에 필요한 환경 구성을 찰칵 찍어서 사용한다는 의미이지 않을까 싶습니다.

 

VSCode의 터미널을 열어줍니다.

 

docker build .

을 입력해서

이미지를 찰칵 찍어볼게요!

 

빨간 밑줄 부분이 이미지 이름입니다.

 

생성된 이미지 리스트와 정보를 확인하고 싶다면

docker images

를 입력하시면 확인이 가능합니다.

"4v8f..." 해당 ID를 갖는게 방금 생성한 이미지입니다.

 


 

4. Container 생성

 

해당 ImageID나 이름을 가지고 컨테이너를 생성할 수 있습니다.

docker run ImageID

를 입력해줄게요.

 

오류가 발생합니다.

해당 코드가 실행되어 input을 받아야 하는데 Error가 납니다.

 


 

5. run option

 

docker run --help 를 입력하면 run에서의 명령어를 보여주는데요

여기서 해결 방법을 찾아보겠습니다.

 

키보드와 프로그램을 연결해주는 것이 "표준 입력 스트림"이라고 하고, 이름은 "stdin"입니다.

이 부분을 가능하게 해주는 옵션을 찾아볼게요!

 

1. --attach list, -a

먼저 run 옵션에는 attach 라는 옵션이 있습니다.

이 옵션을 설정하면 컨테이너 실행 중 입/출력을 확인할 수 있습니다.

run명령어에서는 default값이 attach이므로 따로 설정해줄 필요는 없습니다.

 

2. --interactive, -i

attach모드가 아니라도 표준 입력 스트림을 열어두는 옵션입니다.

 

3. --tty, -t 

pseudi-TTY는 가상의 입력 터미널입니다.

이를 허용해주어야 터미널에서의 입력이 가능합니다.

 

다시 옵션들을 설정해서 docker run을 해보겠습니다.

 

docker run -i -t imageID 를 입력하면

(아래의 명령어 형태로 실행해도 동일합니다.

docker run -it imageID

docker run --interactive --tty imageID)

정상적으로 실행이 됩니다!

 


 

6. 컨테이너 확인

 

현재 실행중인 컨테이너를 확인하려면

docker -ps <를 입력하면 됩니다.

제가 실핸한 코드는 동작이 끝나면서

container의 동작이 멈춰서 해당 리스트에 노출되지 않습니다.

 

그러면 생성된 모든 컨테이너를 확인해볼게요.

docker ps -a 

라고 입력해줍니다.

그러면 생성된 모든 컨테이너와 정보를 확인할 수 있습니다.