Docker(nginx, flask, postgresql)

yoon__0_0·2024년 6월 3일
0

이어드림 수업

목록 보기
57/103
post-thumbnail

이전 실습 - flask , sql 연동

nginx image 생성

  • 이전 실습들과 이어지는 실습

Flask 설정

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
  • 변경 : gunicorn과 연결
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

nginx 설정

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;"]

nginx, flask 연동

5) 두개를 엮어주기 (docker compose이용)

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:
  
  • services : 2개 -> flasktest, nginxtest
    • 각각 build
    • restart : 항상 새로 시작한다
    • port : 시작점 : 종료점
    • depends_on : 의존하는 것 (nginxtest가 실행될 때 flasktest가 함께 실행되도록 함.
  • 두개를 연결하는 것이 networks

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

docker postgresql 연동

postgrel 과 volume 실습

1) 폴더 및 Dockerfile 생성

  • Dockerfile : postgresql 다운로드
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:
  • 변경 : psql, volume 연결 부분 추가
  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 연결부분 변경

  • flaskapp/myapp/main.py 변경
  • 기존 : 172.0.0.1 은 도커 컨테이너가 호스트와 연결하는 통신 ip
conn = psycopg2.connect(dbname='ml', user='postgres', password='postgres', host='172.0.0.1', port=5432)
  • 변경 : host부분을 docker container로 변경
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
  • postgresql container 로 들어가서 db에 들어갔는지 확인하기

  • 총 연결부
profile
신윤재입니다

0개의 댓글

관련 채용 정보