5월, 2019의 게시물 표시

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

SQLAlchemy에서 모델을 다루는 stage에 대해 알아보았다. Expire I've made some changes to an object and don't need it immediately but don't want any subsequent methods to use stale values. db.session.expire(Model) Refresh I've made some changes to an object and need its updated values immediately. Costs extra database call as it expires and reads from database immediately. Flush Push changes from memory to your database's transaction buffer. No database statements are issued yet. If Session has autocommit: False, must still call commit() to persist the changes or rollback() to discard changes. If Session has autocommit: True and you are not explicitly in a transaction, commit() will be automatically called. Commit Persist changes in your database's transaction buffer to the database. Database statements are issued. Automatically expires objects. Merge Used when you may have more than 1 in-memory objects which map to the same database record with some ke...

2019.05.21 - 클래스 데코레이터를 이용한 데이터 직렬화 (Clean) 코드

def hide_field ( field ) -> str : return "**민감한 정보 삭제" def show_original (event_field): return event_field class EventSerializer: def __init__ ( self , serialization_fields: dict ) -> None : self .serialization_fields = serialization_fields def serialize ( self , event) -> dict : return { field: transformation( getattr (event , field)) for field , transformation in self .serialization_fields.items() } class Serialization: def __init__ ( self , **transformations): self .serializer = EventSerializer(transformations) def __call__ ( self , event_class): def serialize_method (event_instance): return self.serializer.serialize(event_instance) event_class.serialize = serialize_method return event_class @Serialization ( name =show_original , password =hide_field ) @dataclass class LoginEvent: name: str password: str 일단 EventS...

2019.05.20 - Flask + Vue + Webpack 관련

회사에서 돌리는 플젝이 Vue파일을 수정하면 자동으로 브라우저에서 refresh 되고 flask에서 서빙하는 것처럼 보인다. 집에서도 환경을 똑같이 구축해보려고 하는데 한번에 바로 다 할 수는 없으므로 일단 js파일을 수정하면 auto refresh를 하게 하는게 첫번째 목표이지만.. 잘 안풀린다. 웹팩은 엔트리파일, 아웃풋 파일이 있다. 엔트리 : 번들링을 시작할 시발점.  아웃풋 : 번들링 된 JS가 기록 될 파일. 일단 webpack.config.js까지 만들고 webpack --watch를 하면 자동으로 변경사항이 발생할 경우 번들링 된 파일이 생성되지만, 브라우저에서 auto refresh는 하지 않는다. 그래서 webpack-dev-server를 사용하면 auto-refresh를 하게할 수 있다는데 아직 되질 않는다. dev-server를 키고 변경을 하면 터미널에 recompiling되는 메시지가 나오는 걸로 보아 변경사항이 감지는 되는것 같지만 이상하게 번들링 된 결과물엔 변경 된 사항이 반영되어있지 않다. 내일은 일단 컴파일 완료 메시지부터 좀 시작을 해봐야지..

2019.05.14 - Docker Swarm을 클라우드 환경에서 돌려보기

Docker Swarm2 Digital Ocean에서 Docker node 여러개 만들고 컨트롤하기 1) ssh root@IP 2) get.docker.com 에 들어가서 맨 위 인스톨 스크립트를 실행. 3) docker-swarm init --advertise-addr (아이피주소)  - 도커 스웜을 돌릴 노드의 공인 아이피 주소를 기재하기 4) 3번을 치고 나온 명령어를 그대로 복사해서 다른 노드에서 붙여넣고 엔터 5) Swarm Manager만이 swarm 명령어를 사용할 수 있기 때문에 워커노드에서 docker node ls를 친다한들 권한문제 때문에 실행되지 않는다. 6) docker node update --role manager node2 < node2를 매니저로 진급시킨다. 이 후에 docker node ls 명령어를 실행하면 이 전에 ls를 볼 수 없던 node2에서 목록이 보이게 된다. 7) 만약 Manager Role로 새로운 노드를 바로 실행해버리려면 docker swarm join-token manager를 실행. < 새롭게 복붙해서 쓸 수 있는 토큰이 나온다. 8) docker service create --replicas 3 alpine ping 8.8.8.8 < 2개의 레플리케이션을 만든 alpine을 도커에서 생성. 9) docker node ps < 현재 내 로컬에서 실행 중인 task나 container를 볼 수 있음. docker node ps node2 < node2 노드에서 실행 중인 task나 container를 볼 수 있음. 궁금사항: docker service create --replicas 3 alpine ping 8.8.8.8 이 명령어를 docker swarm(docker service)의 매니저 노드에서 치니까 자동으로 worker로 조인했던 node들의 ps에도 모두 돌아가기 시작했다. 어째서일까?

2019.05.06 - Docker Swarm

Docker Swarm은 서버 클러스터링 솔루션. - 단일 유닛으로서 다른 노드(PC)들을 orchestrate하고 각각의 라이프 사이클을 관리할 수 있도록 한다. - 서버가 한, 두개가 아닐 때 이들을 통합적으로 관리해주는 툴이 필요한데 도커 스웜이 하는 역할이 바로 그 것. - 여러 툴이 있으며 그 중 유명한 것으로는 쿠버네티스가 있다. swarm에는 manager와 worker가 있다. manager는 authority를 가질 수 있는 config가 존재하며 각각의 매니저들은 다른 매니저와의 혼선이 없도록 관리 한다. Raft DB --------------------------------------- Manager     Manager     Manager --------------------------------------- Worker   Worker   Worker   Worker   Worker  이러한 구조로 되어있는데, Manager는 자신이 워커인 동시에 매니저 역할을 할 수도 있다. swarm manager 안에는 여러 개의 task가 존재하고 각각의 task는 컨테이너를 실행한다. $ docker swarm init # docker swarm init을 하면 swarm 서비스를 시작할 수 있다. $ docker service create IMAGE_NAME $ docker service update SERVICE_NAME --replicas 3 # 컨테이너가 3개가 만들어지고, 그 중 하나를 docker container rm -f NAME 커맨드를 입력하더라도 service는 이내 새로운 녀석을 만들어 복구시킨다. # Swarm에서 service는 docker container run을 대체한다. # Docker service는 docker conta...

2019.05.02 - docker-compose.yml 파일의 config 설정에 따라 달라지는 효과

docker-compose는 docker-compose.yml 파일 안의 key가 존재하느냐 하지 않느냐에 따라  실행되는 방식이 아예 달라진다. 1. image 키가 존재, build 키가 없을 때 "지정한 이미지를 실행해줘" - 해당 image를 실행한다. - 다른 경우와 같이 image가 로컬에 존재하면 그 이미지를 쓰고 존재하지 않으면 hub에서 받아와서 실행한다. 2. image 키가 존재, build 키가 존재 "현재 디렉토리에서 Dockerfile을 build해서 실행해주고, build 된 이미지의 이름은 image야" - build 키의 value가 Dockerfile의 이름이 되고 만약 .을 넣으면 Dockerfile의 기본 이름인 Dockerfile을 불러온다. - image 키의 value는 Dockerfile을 통해 빌드 한 이미지의 네임스페이스다. (위의 경우엔 해당 image를 불러와라는 뜻이었지만 이 경우엔 완전히 달라진다.) 3. image 키가 존재하지 않음, build 키가 존재 "현재 디렉토리에서 Dockerfile을 빌드해서 실행해주고, 빌드 된 이미지 이름은 CurrentDirectory_ServiceName이야." - 2번과 마찬가지이지만 이 경우엔 image 키가 없으므로 해당 이미지에게 어떤 이름을 줘야할 지 모른다. - 이 때 Docker는 이미지 이름을 '현재디렉토리_서비스이름' 으로 짓고 image list에 등록한다.

2019.05.01 - docker container volume 옵션을 활용해서 data는 그대로 둔 채 postgres 버전업 하기, Docker compose 개론

postgres 9.6.1, postgres 9.6.2 설치 docker container run -d --name psql -v psql:/usr/lib/postgres/data postgres:9.6.1 -> postgres 9.6.1을 run하는데 이 때 사용하는 볼륨에 psql이라는 이름을 붙여 줌. docker logs psql -> log 체크 docker container run -d --name psql2 -v psql:/usr/lib/postgres/data postgres:9.6.2 -> psql이라는 볼륨을 붙여서 postgres 9.6.2를 run함 docker volume, bind mounting 에 관해서는.. 호스트의 파일을 그대로 이용해서 도커를 실행시킬 수 있다는 것이 장점. DOCKER COMPOSE docker compose template version: '3.1'  # if no version is specificed then v1 is assumed. Recommend v2 minimum services:  # containers. same as docker run   servicename: # a friendly name. this is also DNS name inside network     image: # Optional if you use build:     command: # Optional, replace the default CMD specified by the image     environment: # Optional, same as -e in docker run     volumes: # Optional, same as -v in docker run   servicename2: volumes: # Optional, same as...