diff --git a/assets/docker_build_t1.png b/assets/docker_build_t1.png new file mode 100644 index 0000000..9092b1f Binary files /dev/null and b/assets/docker_build_t1.png differ diff --git a/assets/docker_build_t2.png b/assets/docker_build_t2.png new file mode 100644 index 0000000..38c3e70 Binary files /dev/null and b/assets/docker_build_t2.png differ diff --git a/assets/docker_commit.png b/assets/docker_commit.png new file mode 100644 index 0000000..d964d61 Binary files /dev/null and b/assets/docker_commit.png differ diff --git a/assets/docker_edu2_push.png b/assets/docker_edu2_push.png new file mode 100644 index 0000000..a40f0d0 Binary files /dev/null and b/assets/docker_edu2_push.png differ diff --git a/assets/docker_exec.png b/assets/docker_exec.png new file mode 100644 index 0000000..abbe181 Binary files /dev/null and b/assets/docker_exec.png differ diff --git a/assets/docker_images.png b/assets/docker_images.png new file mode 100644 index 0000000..cdb79bb Binary files /dev/null and b/assets/docker_images.png differ diff --git a/assets/docker_logs.png b/assets/docker_logs.png new file mode 100644 index 0000000..93ec2ad Binary files /dev/null and b/assets/docker_logs.png differ diff --git a/assets/docker_ps.png b/assets/docker_ps.png new file mode 100644 index 0000000..b9404df Binary files /dev/null and b/assets/docker_ps.png differ diff --git a/assets/docker_ps_stop.png b/assets/docker_ps_stop.png new file mode 100644 index 0000000..5c1fc1f Binary files /dev/null and b/assets/docker_ps_stop.png differ diff --git a/assets/docker_run_d.png b/assets/docker_run_d.png new file mode 100644 index 0000000..1927f99 Binary files /dev/null and b/assets/docker_run_d.png differ diff --git a/assets/dockerhub_edu2_image.png b/assets/dockerhub_edu2_image.png new file mode 100644 index 0000000..1df92ee Binary files /dev/null and b/assets/dockerhub_edu2_image.png differ diff --git a/assets/swagger_first.png b/assets/swagger_first.png new file mode 100644 index 0000000..671f88f Binary files /dev/null and b/assets/swagger_first.png differ diff --git a/assets/swagger_second.png b/assets/swagger_second.png new file mode 100644 index 0000000..712ef16 Binary files /dev/null and b/assets/swagger_second.png differ diff --git a/assets/swagger_third.png b/assets/swagger_third.png new file mode 100644 index 0000000..8938097 Binary files /dev/null and b/assets/swagger_third.png differ diff --git a/assets/swagger_tool.png b/assets/swagger_tool.png new file mode 100644 index 0000000..6d5359e Binary files /dev/null and b/assets/swagger_tool.png differ diff --git a/assets/vi_dockerfile.png b/assets/vi_dockerfile.png new file mode 100644 index 0000000..d359a84 Binary files /dev/null and b/assets/vi_dockerfile.png differ diff --git a/chapter2.md b/chapter2.md index 85aa329..c0e8968 100644 --- a/chapter2.md +++ b/chapter2.md @@ -181,7 +181,7 @@ github 화면으로 가서 README.md 화일이 생성되거나 변경 된것을 Dockerfile 예제 -```bash +```yaml # 베이스 이미지 이며 이미지 이름 앞에 아무것도 없으면 docker hub에서 가져온다. FROM python:3.8-slim @@ -194,7 +194,14 @@ ADD . /app # pyhon의 경우 library를 requirements.txt에 기술을 하였고 RUN 명령어를 # 사용하여 아래 구문을 실행한다. -RUN pip install -r requirements.txt +# RUN pip install -r requirements.txt + +# 직접 라이브러리를 추가 할수 있다. 단 라이브러리가 많아지면 불편하다. +RUN pip3 install flask==1.1.2 +RUN pip3 install flask-cors +RUN pip3 install flask-restplus +RUN pip3 install itsdangerous==2.0.1 +RUN pip3 install Werkzeug==2.0.3 # 기본 이미지는 대부분 GMT+0 기준으로 생성되어 한국 시간으로 변경 해준다 RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo Asia/Seoul > /etc/timezone @@ -207,7 +214,209 @@ EXPOSE 40003 CMD ["python", "app.py"] ``` +터미널에서 edu2 폴더로 이동하여 vi 에디터로 Dockerfile를 생성한다. + +```bash +vi Dockerfile +``` + + + +
+i (소문자) 를 누른 후 위의 Dockerfile 내용을 복사하여 붙여넣기 한다. +esc 키를 누른 후 :wq를 입력하여 저장하고 나온다. + + +app.py를 생성하고 아래 소스를 추가하여 Dockerfile과 같이 저장하고 나온다. + +```python +# -*- coding:utf-8 -*- +# REST API로 구현한 계산기 예제 + +import werkzeug +werkzeug.cached_property = werkzeug.utils.cached_property + +from flask import Flask +from flask_restplus import Resource, Api, reqparse + + +# ----------------------------------------------------- +# api +# ----------------------------------------------------- +app = Flask(__name__) +api = Api(app, version='1.0', title='Calc API', + description='계산기 REST API 문서',) + +ns = api.namespace('calc', description='계산기 API 목록') +app.config.SWAGGER_UI_DOC_EXPANSION = 'list' # None, list, full + + +# ----------------------------------------------------- +# 덧셈을 위한 API 정의 +# ----------------------------------------------------- +sum_parser = ns.parser() +sum_parser.add_argument('value1', required=True, help='연산자1') +sum_parser.add_argument('value2', required=True, help='연산자2') + + +@ns.route('/sum') +@ns.expect(sum_parser) +class FileReport(Resource): + def get(self): + """ + Calculate addition + """ + args = sum_parser.parse_args() + + try: + val1 = args['value1'] + val2 = args['value2'] + except KeyError: + return {'result': 'ERROR_PARAMETER'}, 500 + + result = {'result': 'ERROR_SUCCESS','value': int(val1) + int(val2)} + return result, 200 + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) # , debug=True) +``` + +
+아래 명령어를 사용하여 도커 파일을 생성한다. +Dockerfile 위치와 같은 폴더에서 실행하여야 하며 생성할 이미지 이름 뒤에 . 을 반드시 사용한다. + +```bash +docker build -t edu2 . +``` + + + +Dockerfile의 line by line 으로 단계가 구성되어 도커 레이어를 생성을 한다. +내부 적으로는 docker commit 명령어가 실행이 되면 도커를 재 생성시에는 +Cache를 사용 하기 때문에 훨씬 빨리 빌드가 된다. + + + +중간에 임시에 생성된 intermediate 컨테이너가 삭제가 되고 빌드 이미지가 만들어진다. + +아래 명령어를 사용하여 생성된 도커 이미지를 확인 할 수 있다. + +```bash +docker images +``` + + + +Docker Hub에 전송하기 위해서는 tagging을 하고 push를 한다. +tag 명령어 뒤에는 로컬 이미지 이름 , 다음에는 도커허브 이미지 이름을 입력. + +```bash +docker tag edu2 (본인 도커 허브 ID)/edu2 +``` + + + +Docker Hub에 페이지에서 push된 이미지를 확인한다. + + + +실행 중인 컨테이너를 확인하고 40003 포트를 사용하는 컨테이너를 stop 한다. +```bash +docker ps +docker stop (컨테이너id) +``` + + + +도커 이미지를 실행한다. +- -d : 데몬모드 +- --name : 컨테이너에 이름을 부여한다. +- -p : 포트 ( 외부접속포트 : 컨테이너 포트) +- 맨 마지막에 도커 이미지 이름 + +```bash +docker run -d --name my-python -p 40003:5000 (본인 도커 허브 ID)/edu2 +``` + +docker ps 명령어로 정상적인지 확인한다. + + + +docker ps 로 아무 것도 없으면 docker ps -a 명령어도 kill 된 컨테이너를 확인하고 +docker logs 명령어로 로그를 확인한다. + + +```bash +docker logs (컨테이너id) +``` + + +docker 컨테이너 안으로 들어가 본다. + +```bash +docker exec -it (컨테이너id) /bin/sh +``` + +컨테이너 내부에서 ls 명령어를 쳐보면 도커 빌드시 복사되었던 소스를 확인 할 수 있다. + + + +현재 컨테이너의 내용을 도커 이미지로 저장하고 싶을때는 commit 명령어를 사용한다. +- -m : 뒤에 comment를 적어준다 +- 컨테이너 이름 : 현재 실행되는 컨테이너 이름 또는 컨테이너 아이디를 적여준다 +- 신규 도커 이미지 : 신규로 생성하고 싶은 로컬 도커이미지 이름을 적어준다 + +```bash +docker commit -m "new edu2" (컨테이너 이름) (생성하고싶은 이미지 이름):(버전) +``` + + + +
+ +도커 추가 명령어 +- 정지 중인 컨테이너 삭제 : docker container prune +- 이미지 , 정지되어 있는 컨테이너 , 네트웍크 삭제 : docker system prune +- 도커 이미지 삭제 : docker rmi (도커 로컬 이미지 이름) +- 컨테이너 삭제 : docker rm [CONTAINER_ID] +- 컨테이너 일시정지 : docker stop [CONTAINER_ID] +- 컨테이너 일시정지 : docker commit [CONTAINER_ID] + + +### Swagger + +Swagger 란 +- Open Api Specification(OAS)를 위한 프레임워크이다. +- API들이 가지고 있는 스펙(spec)을 명세, 관리할 수 있는 프로젝트/문서 +- API 사용 방법을 사용자에게 알려주는 문서 +- Springboot에서 Swagger를 사용하면, 컨트롤러에 명시된 어노테이션을 해석하여 API문서를 자동으로 만들어준다. +- 참고로 Swagger는 Java에 종속된 라이브러리가 아니다. + + + +Swagger의 기능 + +- API Design (API 설계) + - Swagger-editor를 통해 api를 문서화하고 빠르게 명세 가능 +- API Development + - Swagger-codepen을 통해 작성된 문서를 통해 SDK를 생성하여 빌드 프로세스를 간소화할 수 있도록 도와준다. +- API Documentation + - Swagger-UI를 통해 작성된 API를 시각화시켜준다. +- API Testing + - Swagger-Inspector를 통해 API를 시각화하고 빠른 테스팅을 진행할 수 있다. +- Standardize + - Swagger-hub를 통해 개인, 팀원들이 API 정보를 공유하는 Hub + + +생성된 이미지는 간단한 계산을 하는 기능으로 swagger 를 내장하고 있다. +브라우저에서 (본인 VM IP ):40003를 호출하면 아래 화면을 볼 수 있다. + +GET을 클릭하고 오른쪽에 try it out를 클릭하면 API를 테스트 할 수 있다. + +연산자 1, 2에 값을 넣고 execute를 하면 API 가 수행이된다. +