Docker를 배우고 써본지 1년이 지나서 다시 상기시킬겸 예제 띄워보고 블로그에 기록해보는 중..
Flask로 간단한 Api 구현해보려고 하는데..
원래는 자격증 공부할겸 AWS이용해서 하려했으나 GCP의 무료 크레딧이 남아서 GCP에서 작업했습니다.
Flask를 dockerfile을 이용해서 이미지를 만들고 컨테이너로 띄워서 외부에서 접속해보는 docker build
& docker run
명령어까지 진행해보겠습니다.
플라스크는 별거없이 간단한 예제입니다.
환경변수를 따로 설정해주지 않도록 app.py
의 파일명으로 정해줬습니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello Flask World'
if __name__ == '__main__':
app.run()
Flask를 이미지로 만들기 위하여 Dockerfile
을 사용했습니다.
base image는 제 버젼과 맞춰서 3.8의 slim 버전을 이용했습니다.
FROM python:3.8-slim
COPY . /app
RUN pip3 install flask
WORKDIR /app
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]
Dockerfile
도 Flask 예제와 마찬가지로 간단하게 작성했습니다.
각 명령어의 의미는 다음과 같습니다.
FROM
-> 사용할 base image를 적어줍니다. 저는 python의 3.8-slim
버전(tag)를 이용했습니다. COPY
-> 현재 디렉토리(.)의 내용을 컨테이너 내의 /app
디렉토리에 복사합니다. (현 예제같은경우는 app.py만) RUN
-> 이미지에 프로젝트에 필요한 패키지 및 shell 명령어를 실행시켜줄 수 있습니다. 현재는 flask만 필요해서 적어줬지만 설치해줄 패키지가 많을 경우는 requirements.txt
를 이용해서 설치해줄 수 있습니다. WORKDIR
-> 저 같은 경우는 /app
으로 파일들을 옮겨줬으니, 작업위치를 /app
으로 설정해줬습니다. CMD
-> ENTRYPOINT
와의 큰 차이점을 모르겠습니다. CMD를 이용해서 flask run
을 해주었습니다. --host=0.0.0.0
명령어로 외부에서 접속이 가능하게 해주었습니다. Dockerfile
을 작성해주었으면, docker build
명령어를 통해서 이미지화 시켜줄 수 있습니다.
docker build -t <repositoryname>:<version> .
-t
는 태그설정 옵션입니다. version(tag)는 따로 적어주지 않으면 기본적으로 latest 버전으로 설정됩니다.
뒤에 .을 통해서 현재 디렉토리에 있는 Dockerfile을 이미지화 작업을 진행합니다.
저는 flasktest
로 이름을 지정해주었습니다.
Dockerfile 수정 후 재빌드 하면, 기존의 latest 버전은 none으로 변경됩니다.
이미지를 만들었으니, 컨테이너로 실행시켜주도록 하겠습니다.
docker run
의 기본적인 명령어는 아래와 같습니다.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
저는 다음과 같은 옵션을 설정해주었습니다.
-p
-> port를 설정해주는 옵션입니다. --name
-> 컨테이너의 이름을 설정해주는 옵션입니다. -d
-> run 동작을 백그라운드에서 진행하도록하는 옵션입니다.docker run -d -p 0.0.0.0:5000:5000/tcp --name dockertest flasktest:latest
-p
옵션으로 0.0.0.0(Any) ip에서 5000(외부) 포트에서 5000(내부)포트로 tcp 프로토콜을 이용해서 접근해주도록 설정해주고
--name
옵션으로 dockertest로 설정해주었습니다. 필수는 아닙니다. 지정해주지않으면 랜덤으로 컨테이너 이름이 설정됩니다.
flasktest:latest
는 위에서 만들었던 제 이미지이며, latest로 최신버전을 사용한다는 의미입니다.
docker ps
명령어로 아래와 같이 잘 동작하는지 확인할 수 있습니다.
Status에서 Up으로 정상적으로 동작중임을 확인할 수 있습니다. docker ps
명령어에서 컨테이너가 보이지 않는다면 오류로 인하여 중지된 것입니다. docker logs
명령어로 확인할 수 있습니다.
제 노트북에서 GCP로 5000포트를 이용해서 접속에 성공하였습니다.
Docker
를 쓰다보니, 자주 사용하는 명령어가 있어서 정리해보려고 합니다.
docker images
docker ps
docker stop
docker rm
docker rmi
docker logs
Docker images
는 현재 시스템의 docker images를 출력시켜 줍니다.
python 3.8-slim은 Dockerfile
에서 base image입니다.
docker build
에서 -t
옵션을 이용해서 0.1 등과 같은 tag를 설정해줄 수 있습니다. 설정을 하지 않으면 자동으로 latest로 설정되며, 위에 말했지만 재빌드시 기존 이미지들은 None으로 변경됩니다.
생각보다 이미지들도 용량을 차지하기 때문에 rmi
명령어로 정리를 해줄 필요가 있습니다.
docker ps
명령어는 현재 실행 중인 컨테이너들의 목록을 확인할 수 있습니다.
docker ps -a
명령어를 통해서 중지된 컨테이너들의 목록도 확인할 수 있습니다.
현재 실행중인 컨테이너를 docker stop <container name or ID>
명령어로 중지합니다.
중지한 컨테이너들을 제거합니다.
docker ps -a
에서 컨테이너 목록을 확인하고 하나 또는 여러개의 컨테이너 ID또는 이름을 적어주어 제거가 가능합니다.
docker rm <One or More Container ID or Name>
도커 이미지들은 생각보다 쌓이면 많은 용량을 차지합니다.
정리를 해줄 필요가 있습니다.
docker images
로 목록을 확인한 후
docker rmi <One or More Container Id or Name>
명령어로 제거해줄 수 있습니다.
다른 명령어도 동일하지만, Container ID
를 적어줄때는 전체를 적어줄 필요는 없습니다. 앞부분 일부만 적어도 인식합니다.
갑작스런 오류로 중단된 경우 docker logs
명령어로 확인해 줄 수 있습니다.
오류 로그는 아니지만.. 성공적으로 flask 예제를 실행하고 접속한 로그도 확인할 수 있습니다.
이것 저것 적다보니 생각보다 길어졌습니다.
모르는 것 있으면 공식문서 보면서 진행했습니다.
개인적으론 명령어 막 쓰는 것보다 docker-compose
로 관리하는 것이 편리하고 좋더라구요.
아직은 컨테이너가 하나라서 쓸 일이 없기는 한데 다음 번엔 docker-compose
도 다시 사용해볼겸 글을 끄적여봐야겠습니다.
그리고 저도 기본적인 기능들만 알고있어서 실제 현업에서 사용할때는
어떤 것이 추가가 되고 어떻게 쓰이는지는 잘모릅니다.
혹시 아시는분은 조언주시면 감사하겠습니다.