(6-1) 도커 內 Rest Api 서버 구성하기 ( Python )

(6-1) 도커 內 Rest Api 서버 구성하기 ( Python )

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

※ Rest Api에 대해서는 하기 글을 참조

2021.07.29 - [IT/아키텍처] - Rest

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

(1) 유저가 HTTP 메소드를 사용해서, 도커에 떠있는 Nginx의 api location 호출하면 ( 82 Port )

(2) Nginx Reverse Proxy를 사용하여, Python으로 Request를 포워딩 해준다 ( 80 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 리버스 프록시 기능을 활용하여 위의 그림처럼 연결할 것

from http://st-it.tistory.com/35 by ccl(A) rewrite - 2021-08-11 16:26:21