1) gunicorn 이 필요하기 때문에 image만들때 넣어주기
=> requirements.txt에 gunicorn==22.0.0
추가
2) Dockerfile 수정 (gunicorn이 Flask를 돌릴수 있게함) ( flaskapp 속)
FROM python:3.11.9
WORKDIR /usr/src/app
COPY . .
RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
WORKDIR ./myapp
CMD python main.py
EXPOSE 5000
FROM python:3.11.9
WORKDIR /usr/src/app
COPY . .
RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
WORKDIR ./myapp
CMD gunicorn main:app --bind 0.0.0.0:5000
EXPOSE 5000
3) nginx -> flask 로 보낼 수 있도록파일 설정
deault.conf
추가 (nginxtest 파일 속에서)
server{
listen 80;
server_name localhost;
location /{
proxy_pass http://flasktest:5000;
}
}
proxy_pass http://flasktest:5000;
여기서 flasktest는 컨테이너 이름
4) Dockerfile 설정변경 (nginxtest 파일 속에서)
FROM nginx:1.26.0
CMD ["nginx", "-g", "daemon off;"]
FROM nginx:1.26.0
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]
5) 두개를 엮어주기 (docker compose이용)
이런 설정파일의 경로에서 compose 문법 사용해줌 (yml파일 yaml문법)
docker-compose.yml
만들기
services:
flasktest:
build: ./flaskapp
networks:
- composenet01
restart : always
nginxtest:
build: ./nginxtest
networks:
- composenet01
ports :
- "80:80"
depends_on :
- flasktest
networks:
composenet01:
6) 실행
$ docker compose up -d --build
-d : 백그라운드 실행
--build : 이미지가 없으면 만들어라
7) 확인하기
docker container ls
ec2 ip 주소로 들어가보기
curl로 보내보기
curl -d '{"input":["0.3"]}' -H "Content-Type: application/json" -X POST http://ip주소/predict
8) 내리기
$ docker container down
9) db도 잘 연동되는지 확인하기
$ sudo -i -u postgres
psql
\c ml ;
\dt
select * from pred_result
1) 폴더 및 Dockerfile 생성
FROM postgres:16.3
2) 위에서 만든 compose.yml 수정
services:
flasktest:
build: ./flaskapp
networks:
- composenet01
restart : always
nginxtest:
build: ./nginxtest
networks:
- composenet01
ports :
- "80:80"
depends_on :
- flasktest
networks:
composenet01:
psqltest:
build: ./psqltest
container name: psqltest
networks:
- composenet01:
volumes:
- myvolume01:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
myvolume01:
services:
flasktest:
build: ./flaskapp
networks:
- composenet01
restart : always
nginxtest:
build: ./nginxtest
networks:
- composenet01
ports :
- "80:80"
depends_on :
- flasktest
psqltest:
build: ./psqltest
container name: psqltest
networks:
- composenet01
volumes:
- myvolume01:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
volumes:
myvolume01:
networks:
composenet01:
3) flask - db 연결부분 변경
conn = psycopg2.connect(dbname='ml', user='postgres', password='postgres', host='172.0.0.1', port=5432)
conn = psycopg2.connect(dbname='ml', user='postgres', password='postgres', host='psqltest', port=5432)
4) postgresql container 에 DB , table 생성
# container 입장
docker container exec -it {postgresql container id} /bin/bash
# postgres 계정으로 psql 입장
psql -U postgres
#DB 생성
CREATE DATABASE ml;
# ml로 들어가기
/c
# Table 생성
CREATE TABLE pred_result(
id SERIAL PRIMARY KEY,
input NUMERIC,
output NUMERIC,
insert_dt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
5) 값 날려보기
curl -d '{"input":["0.3"]}' -H "Content-Type: application/json" -X POST http://ip주소/predict