개요
- Docker-Compose와 Dockerfile의 주요 기능을 이해한다.
- 각 파일의 위치와 주요 기능을 이해한다.
전체 프로젝트 파일 디렉터리
- 본 프로젝트의 전체 코드는 다음과 같다.
- 실제 코드 작성을 해야하는 곳은 다음과 같다.
- app.py
- requirements.txt
- init.sql
- docker-compose.yml
- Dockerfile
docker_kubernetes_flask/
├── app/
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── db/
│ ├── init.sql
│ └── data/ (This will be created by Docker)
├── docker-compose.yml
└── Dockerfile
사전준비
- 사전에
Docker는 Desktop 설치가 되어 있다고 가정한다.
- 코드 편집을 위해서는
Visual Studio Code를 활용한다.
Docker가 익숙하지 않은 사람들을 위한 1줄 요약
- MySQL 설치하고, Python 설치하고, 두개 또 연동해야 하고, CLI 명령어 또 각각 입력하는거 다 자동화 해줄게요!!
- 즉, 자동화에 익숙해지자!
docker-compose와 Dockerfile 간단 비교
- docker-compose.yml : python 컨테이너와 mysql 컨테이너를 각각 한꺼번에 구성하도록 스크립트를 작성함
- Dockerfile : 여기에서는 python 개발환경을 구성함
- docker-compose.yml에서 Dockerfile을 호출하여 개발환경을 만들도록 지시할 수 있음
전체 코드 흐름 1줄 요약
- From MySQL to Python Flask
init.sql과 app.py 간단 설명
- 각 두개의 파일은 사전에 미리 작성을 해둔다.
MySQL : init.sql
- 이
SQL 코드는 데이터베이스와 테이블을 생성하고, 테이블에 데이터를 삽입하는 작업을 수행.
test_db 데이터베이스 생성
users 테이블 생성
- 간단하게 이름 생성
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
INSERT INTO users (name) VALUES ('Evan');
INSERT INTO users (name) VALUES ('Sara');
INSERT INTO users (name) VALUES ('Lotto');
Python : app.py
- 이
Python 코드는 Flask 웹 애플리케이션을 설정하여 MySQL 데이터베이스에 연결하고, 사용자 데이터를 JSON 형식으로 반환하는 작업을 수행.
from flask import Flask, jsonify
import mysql.connector
import os
app = Flask(__name__)
def get_db_connection():
connection = mysql.connector.connect(
host='mysql',
user='root',
password='example',
database='test_db'
)
return connection
@app.route('/')
def index():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute('SELECT * FROM users')
users = cursor.fetchall()
cursor.close()
connection.close()
users_list = [{"id": user[0], "name": user[1]} for user in users]
return jsonify(users_list)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
step 01 - 라이브러리 불러오기
Flask: Flask 웹 애플리케이션 프레임워크를 불러오기
jsonify: 데이터를 JSON 형식으로 변환하여 HTTP 응답으로 반환하는 데 사용
mysql.connector: MySQL 데이터베이스에 연결하기 위해 사용
from flask import Flask, jsonify
import mysql.connector
import os
step 02 - Flask Application Setup
- Flask 애플리케이션 인스턴스를 생성.
__name__은 현재 모듈의 이름을 전달하여 Flask 애플리케이션을 생성하는 데 사용.
step 03 - Database Connection Function
get_db_connection 함수는 MySQL 데이터베이스에 연결하고, 연결 객체를 반환.
host, user, password, database 매개변수는 데이터베이스에 연결하기 위한 정보
def get_db_connection():
connection = mysql.connector.connect(
host='mysql',
user='root',
password='example',
database='test_db'
)
return connection
step 04 - Index Route
@app.route('/'): 해당 Decorator는 URL (’/’)에 대한 요청을 처리하는 index 함수를 정의.
- index 함수의 내용은 다음과 같이 구성됨
get_db_connection을 호출하여 데이터베이스에 연결.
- 연결 객체에서 커서를 생성하고,
SELECT * FROM users 쿼리를 실행하여 users 테이블의 모든 데이터를 가져오기
- 데이터를 가져온 후 커서와 연결을 닫기
users 데이터를 List Comprehension을 사용하여 딕셔너리 형태로 변환합니다. 각 사용자에 대해 id와 name 키를 가지는 딕셔너리를 생성.
- 이 부분은 별도의 HTML 소스코드를 넣지 않기 위해서 진행한 것이니, 해당 자세한 내용을 보기를 원한다면 Flask 웹개발로 더 공부할 것 권장
- 변환된 리스트를
jsonify를 사용하여 JSON 형식으로 반환.
@app.route('/')
def index():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute('SELECT * FROM users')
users = cursor.fetchall()
cursor.close()
connection.close()
users_list = [{"id": user[0], "name": user[1]} for user in users]
return jsonify(users_list)
step 05 - Running the Application
- 모듈이 직접 실행될 때만 Flask 애플리케이션을 실행
app.run 메소드를 호출하여 애플리케이션을 시작.
host='0.0.0.0': 애플리케이션이 모든 네트워크 인터페이스에서 접근 가능하도록 설정.
port=5000: 애플리케이션이 5000번 포트에서 실행되도록 설정.
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Python : requirements.txt
- 주요 라이브러리 설치 위해 필요한 라이브러리 2개만 설치
- 추후에 독자가 라이브러리 추가 가능
Flask
mysql-connector-python
Docker: Dockerfile
- Dockerfile은 Python 애플리케이션을 컨테이너화하기 위한 스크립트
- 다른 파일과 달리 확장자명이 없다는 것에 주의
- 다양한 옵션에 대해 설명하도록 한다.
FROM python:3.10-slim
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app/ .
EXPOSE 5000
CMD ["python", "app.py"]
step 01 - FROM
- Base Image를 선택한다. 해당 이미지를 선택하려면 Docker Hub 검색창에서 확인 (Login 필수)
- 각 Base Image를 선택하면 관련 Tag가 존재하며 여기에서 Tags 확인해서 입력하도록 한다.
- 꼭
Docker Official Image 를 선택한다.
