✔️ Flask
https://flask.palletsprojects.com/en/2.1.x/
✔️ pip 설치
pip - python package 관리 도구
python 라이브러리, 실행 파일을 모아놓은 것이 python package이며 이를 관리하는 도구가 pip이다.
Installation — Flask Documentation (2.1.x) (palletsprojects.com)
vagrant@docker ~/python/hello-flask python3 --version
Python 3.8.10
우분투에는 기본적으로 파이썬이 설치되어있다.
파이썬 버전을 확인한다. (3.7 이상이어야 한다.)
vagrant@docker ~/python/hello-flask sudo apt install python3-pip
vagrant@docker ~/python/hello-flask pip --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
pip를 패키지 관리 도구를 설치한다.
Debian 계열은 pip, pip3 명령어가 같다.
RH 계열에서는 pip는 python2의 패키지 관리자이며, pip3는 python3의 패키지 관리자이다.
✔️ pip list 명령어
vagrant@docker ~/python/hello-flask pip3 list
Package Version
---------------------- --------------------
attrs 19.3.0
Automat 0.8.0
blinker 1.4
certifi 2019.11.28
chardet 3.0.4
Click 7.0
cloud-init 22.1
colorama 0.4.3
command-not-found 0.3
configobj 5.0.6
constantly 15.1.0
cryptography 2.8
dbus-python 1.2.16
pip3 list
명령을 통해 설치되어 있는 python 패키지의 목록을 볼 수 있다.
이는 Global package이다.
Global package : 시스템 전체에서 사용 가능한 package
App1, App2를 만드는데 App1에서는 Flask 1 버전을 사용하고 App2는 Flask 2 버전을 사용한다면 Global package에만 의존하는 것은 문제가 발생할 수 있다.
App을 개발할 때는 독립된 환경이 중요하다. 작동하는 App 사이에서 영향을 최소화 하기 위함이다.
가상 환경(virtual environment)을 사용하면 가상 환경 내에서만 패키지를 설치하고 관리할 수 있다.
Flask는 현재 개발하려는 App에만 필요한 웹 프레임워크이다.
App이 독립적으로 동작할 수 있는 가상 환경을 만들고 사용할 패키지를 따로 관리한다. 이것도 isolation 개념이다.
핵심은 별도의 디렉토리를 만들어주는 것이다.
✔️ 가상 환경/프로젝트 생성
$ mkdir myproject
$ cd myproject
vagrant@docker ~/python/hello-flask sudo apt install python3-venv
vagrant@docker ~/python/hello-flask python3 -m venv venv # 모듈명 사용할 가상환경의 이름
vagrant@docker ~/python/hello-flask ls -a
. .. venv
가상 환경을 구성할 수 있는 venv 패키지를 설치하고 venv라는 이름의 가상환경을 만든다.
사용할 가상 환경의 이름은 어느 것이던 상관없다.
✔️ 가상 환경 활성화
$ . venv/bin/activate # 해당 디렉토리의 스크립트를 실행
가상 환경을 활성화시켜야한다.
vagrant@docker ~/python/hello-flask . venv/bin/activate
(venv) vagrant@docker ~/python/hello-flask pip3 list
Package Version
------------- -------
pip 20.0.2
pkg-resources 0.0.0
setuptools 44.0.0
현재 가상 환경 내부에 들어왔고 이 가상 환경에서만 관리하는 package는 단 3개인 것이다.
(venv) vagrant@docker ~/python/hello-flask cd
(venv) vagrant@docker ~
가상 환경 내부에서 cd 를 하면 가상 환경이 유지된채로 디렉토리를 변경한다.
✔️ 가상 환경 비활성화
deactivate
(venv) vagrant@docker ~ deactivate
vagrant@docker ~
가상 환경을 비활성화 하고 pip3 list를 다시 실행하면 Global package 목록이 뜬다.
✔️ Flask 설치
(venv) vagrant@docker ~/python/hello-flask pip3 install flask
flask 패키지를 설치한다.
✔️ Flask App 실행
hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@ - decorator : 함수에 추가적인 기능을 부여한다.
flask run
python3 -m flask run
(venv) vagrant@docker ~/python/hello-flask flask run
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
*
flask는 기본적으로 5000번 포트로 서비스한다.
아직은 외부에서 접근이 불가한 상태이며 로컬에서만 가능하다.
✔️ Flask App 포트 포워딩
export FLASK_APP=hello.py
flask run
flask run --host='0.0.0.0'
flask run --host='0.0.0.0' --port=8080 # 포트 변경
외부에 노출시킬 수 있으며 크롬 브라우저에서 접근 가능하다.
✔️ Flask 추가 기능
(venv) vagrant@docker ~/python/hello-flask cd templates
(venv) vagrant@docker ~/python/hello-flask/templates vi hello.html
(venv) vagrant@docker ~/python/hello-flask/templates cat hello.html
<h1> Hello Flask World!! </h1>
(venv) vagrant@docker ~/python/hello-flask cat hello.py
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@app.route('/hello/')
def hello():
return render_template('hello.html')
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
templates/hello.html
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
경로가 변수가 되며 변수의 값이 화면에 출력된다.
✔️ freeze 명령어와 requirements.txt
(venv) vagrant@docker ~/python/hello-flask pip3 freeze > requirements.txt
(venv) vagrant@docker ~/python/hello-flask cat requirements.txt
click==8.1.3
Flask==2.1.2
importlib-metadata==4.11.3
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
Werkzeug==2.1.2
zipp==3.8.0
freeze
: 현재 설치된 패키지 목록을 얼린다.
requirements.txt 파일에 현재 설치된 패키지들의 리스트를 출력한 뒤 저장한다.
Flask App의 개발 순서는 다음과 같다.
1) 가상환경을 구성한다.
2) 필요한 패키지를 설치한다.
3) 어플리케이션을 개발한다.
이 과정에서 수백개의 패키지를 설치하게 되는데 일일히 하나씩 설치하는 것은 매우 번거롭다.
pip3 install -r requirements.txt
requirements.txt 파일을 읽어서 패키지 목록을 모두 설치하는 방법을 사용한다.
파이썬을 사용하는 대부분의 오픈 소스들은 requirements.txt 파일을 사용한다.
이 파일을 통해 어떤 패키지, 어떤 버전을 썼는지 알고 대응할 수 있다.
✔️ Flask App을 Docker Image로 빌드하기
✔️ Dockerfile 작성하기
docker run -it python:3.9-slim-buster
사용할 Base Image에 접속해보면 기본적으로 작업 공간이 root이다.
App을 배치시킬 적당한 위치를 골라야 한다.
Dockerfile
FROM python:3.9-slim-buster # 사용할 Base Image
COPY . /app # 현재 디렉토리의 파일을 /app으로 옮긴다.
WORKDIR /app # 이미지의 작업 디렉토리를 정한다.
ENV FLASK_APP hello # 환경 변수를 설정한다.
RUN python3 -m venv venv && . venv/bin/activate # 가상 환경을 구성하고 활성화한다.
RUN pip3 install -r requirements.txt # requirements.txt 파일로 필요한 패키지들을 설치한다.
EXPOSE 5000 # 포트를 설정한다.
ENTRYPOINT ["python3", "-m", "flask", "run"] # 실행 명령
CMD ["--host=0.0.0.0"] # 실행 명령
COPY 명령어에서 앞의 (.)은 Dockerfile이 있는 현재 디렉토리이며 DST는 고민해야 할 요소이다.
이미지의 WorkingDIR이 어떻게 구성되어 있는지에 따라 다르다.
✔️ .dockerignore 파일 구성하기
불필요한 data가 이미지에 포함되는 경우 보안 사고와 직결될 수 있다.
Dockerfile reference | Docker Documentation
vagrant@docker ~/python/hello-flask du -sh .
13M .
vagrant@docker ~/python/hello-flask ls -l
total 20
drwxrwxr-x 2 vagrant vagrant 4096 May 11 15:49 __pycache__
-rw-rw-r-- 1 vagrant vagrant 277 May 11 15:23 hello.py
-rw-rw-r-- 1 vagrant vagrant 133 May 11 14:27 requirements.txt
drwxrwxr-x 2 vagrant vagrant 4096 May 11 15:48 templates
drwxrwxr-x 6 vagrant vagrant 4096 May 11 12:46 venv # 제거해야 한다.
디렉토리에서 이미지 빌드에 불필요한 파일을 제외해야 한다.
venv는 이미지 빌드시에 포함되면 안된다. 컨테이너로 띄울 때 생성되어야 한다.
.dockerignore
# comment
*/temp*
*/*/temp*
temp?
해당 파일을 만들어 놓으면 COPY, ADD 할 때 제외할 파일을 지정할 수 있다..dockerignore
파일 내에 제외할 파일의 목록을 적어놓는다.
! - not의 의미이다.
*.md
!README.md
모든 md 파일을 제외하지만 README.md 파일만 허용한다는 의미이다.
vagrant@docker ~/python/hello-flask vi .dockerignore
vagrant@docker ~/python/hello-flask cat .dockerignore
venv/
Dockerfile
.dockerignore
App을 빌드할 때 사용했던 파일들은 제외해야 한다.
✔️ Flask App 이미지 빌드
vagrant@docker ~/python/hello-flask docker build -t myflask .
Sending build context to Docker daemon 8.704kB
Step 1/2 : FROM python:3.9-slim-buster
---> 975c845dddf2
Step 2/2 : COPY . /app
---> 117c31890f0e
Successfully built 117c31890f0e
Successfully tagged myflask:latest
vagrant@docker ~/python/hello-flask docker run -it myflask bash
root@2329d781bb6b:/# cd /app/
root@2329d781bb6b:/app# ls -a
. .. .dockerignore Dockerfile __pycache__ hello.py requirements.txt templates
root@2329d781bb6b:/app#
venv 파일은 제외 되고 빌드되었다.
vagrant@docker ~/python/hello-flask docker run -it myflask bash
root@bec814cec6a2:/# cd /app/
root@bec814cec6a2:/app# ls -a
. .. __pycache__ hello.py requirements.txt templates
root@bec814cec6a2:/# pip3 list
Package Version
---------- -------
pip 22.0.4
setuptools 58.1.0
wheel 0.37.1
WARNING: You are using pip version 22.0.4; however, version 22.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Golang App을 Docker Image로 빌드하기 (0) | 2022.05.12 |
---|---|
[Docker] Django App을 Docker 이미지로 빌드하기 (0) | 2022.05.12 |
[Docker] multistage-build (멀티 스테이지 빌드) (0) | 2022.05.12 |
[Docker] Alpine Linux (알파인 리눅스) (0) | 2022.05.11 |
[Docker] Dockerfile 이미지 빌드와 Cache (0) | 2022.05.11 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!