이번에는 도커위에 Python을 사용하여 Rest Api를 수신하는 서버를 만들어 볼 예정이다.

※ Rest Api에 대해서는 하기 글을 참조
2021.07.29 - [IT/아키텍처] - Rest

대략적인 아키텍쳐는 아래와 같다.

(1) 유저가 HTTP 메소드를 사용해서, 도커에 떠있는 Nginx의 api location 호출하면 ( 80 Port )
(2) Nginx Reverse Proxy를 사용하여, Python으로 Request를 포워딩 해준다 ( 82 Port )
(3) Rest Api를 구현한 Python에서 해당값을 리턴해주고
(4) Nginx는 json 타입으로 유저에게 Response 해줄 계획이다.

 


1) Python Rest Api Server 구성

 

[참조] - https://justkode.kr/python/flask-restapi-1 // Flask로 Rest API 구현하기

 

- Docker 위에 Pyhton 및 라이브러리 설치 

  ※ 이미지 생성 및 프록시 세팅부분은 생략하고 작성

 

ㅁ Python 설치

apt-get update
apt install python3

[설치확인] python3 --version

 

ㅁ Pyhton 라이브러리 설치를 위한 pip 설치

 

apt-get update
apt-get install python3-pip

=> 설치중에 커넥션 에러 발생. security.ubuntu는 접근하나, archive.ubuntu 에는 접근 못하는 것으로 추정

Get:116 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 python3-xdg all 0.25-4ubuntu1.1
[31.3 kB] Fetched 105 MB in 1min 6s (1586 kB/s)
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/i/isl/libisl19_0.19-1_amd64.deb Could not connect to XXXXX

=> ubuntu repository를 변경하자. ( mirror.kakao.com )

 

vi /etc/apt/sources.list
=> 편집창에서 :%s/archive.ubuntu.com/mirror.kakao.com

apt-get update
apt-get install python3-pip

- Flask 다운로드

 

Flask : Micro web framework로 직역하면 가볍게 사용할수 있는 웹 프레임워크다.

         간단한 rest api 서버 혹은 Web 서버 구성시에 사용한다.

 

pip3 install Flask

이제는 익숙한 프록시, SSL 오류.

 

1) 구글링하니, trusted host 옵션을 주라고 한다.

   => 동일 에러

pip3 install --trusted-host pypi.python.org flask

 

2) 블로그에 프록시 컨피그 적용 후, 수행 가이드

pip3 install --proxy your_proxy_path Flask

=> SSL 문제로 URL 접속 불가 이슈

==>VM 환경이 아닌, 로컬 환경에서는 인터넷 접속 이상없음

 

1,2 옵션을 동시에 주면된다. 

- 프록시를 통해 패키지 Install

- SSL 없이, python host에 대해서는 신뢰

 

-> Flask 및 dependency 패키지 다운로드 성공

 

같은 방법으로 Flask-restx 도 설치해준다.

 

 

- Rest Server Code 작성

 

from flask import Flask  
from flask_restx import Api, Resource 

app = Flask(__name__)  
api = Api(app)  


@api.route('/api/users')  # /api/user 에 클래스 매핑
class HelloWorld(Resource):
    def get(self):  
        return {"id": 123,
        "name": "kim"}

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

 

- 컨테이너 이미지로 커밋하고, 포트 매핑해서 다시 띄워보자

 

sudo docker commit $Container_ID sk007001/rest_api:python

sudo docker run -p 80:80 sk007001/rest_api:python python3 /python/rest_api.py
[ -p ] : 호스트의 80 포트로 오는 요청을 해당 컨테이너 80포트로 연결
[ python3 /python/rest_api.py ] : 위에 만들어둔 rest api 코드 실행

 

- RestClient 를 사용하여, 리퀘스트를 던져보자

 

 

※ 보완할 점

 

- 컨테이너 수행시 명령어가 너무길다.

  이미지에 수행될 명령어를 미리 지정하여, 컨테이너만 수행해도 rest_api 서비스가 올라가도록 변경해볼 것

 

- DB 연결후, /api/users 뒤에 파라미터값에 따라 다른 값을 리턴하는 로직 구현

 

- Nginx 리버스 프록시 기능을 활용하여 위의 그림처럼 연결할 것

+ Recent posts