쉬운 알고리즘 문제만 풀려는 나쁜 습관이 있다. 편하고 익숙한 것만을 쫓는 인간 본성이다. 다음 단계로 나아가기 위해선 불편한 상황에 뛰어들고, 이를 극복하는 의도적 연습이 필요하다.
자명한 사실이지만, 쉽고 알고 있는 문제만 풀어서는 발전이 없다. 어려운 문제에 대해서 머리를 쥐어짜 고민해 보고, 고민으로 갈라진 고뇌의 골짜기에 뜨거운 인사이트를 부어넣어 고통을 감내하며 굳혀야 한다.
문제를 풀지 못해도, 다 이해하지 못해도 괜찮다. 모르면 외워버리면 되고, 외우면 언젠간 이해된다. 그래도 모르겠으면 반복해보자.
실패가 두려웠으면 시작하지도 말고, 욕심내지도 말았어야 한다.
"Success consists of going from failure to failure without loss of enthusiasm."
지난번에 시도했다가 실패해서 묵혀놨던 문제였다.
코플릿을 어떻게 학습해야할까 생각해보다 막힌 문제부터 부딪혀 보기로 하고 시도해 보았다.
사실 간단한 문제였고, 메모이제이션을 활용하면 효율적인 알고리즘도 손쉽게 구현하가능했다.
문제를 종이에 생각해보고, 문제를 나눌 수 있는지, 어떤 알고리즘으로 풀어지는지를 파악하면 절대 어려운 문제는 아니었다.
핵심 아이디어는 다음과 같다.
이 점화식을 세우고, 메모이제이션을 효과적으로 활용하면 충분히 풀 수 있는 문제.
tiling(n) = tiling(n - 1) + tiling (n - 2)
실행환경에 구애받지 않고 어플리케이션을 실행한다.
컨테이너의 실행 컨텍스트가 격리되어 있다.
프로세스, 네트워크, 파일 시스템이 다 격리되어 있다.
환경변수도 따로 설정 가능하다.
컨테이너 위에서 개발시, 모든 개발팀이 동일한 환경에서 개발 가능하다.
docker-compose.yaml 에 정의된 설정으로 편리하게 여러 컨테이너를 구동시켜 개발환경을 설정할 수 있다.
AWS ECS를 활용하면 애플리케이션을 도커 컨테이너 통째로 배포 가능하다. Azure나 GCP도 유사한 서비스를 제공할걸(분명히...)
클라우드 인프라에서 일반적으로 확장성과 가용성 확보를 위해 리버스 프록시형태로 로드밸런서를 활용한다.
도커 이미지의 인스턴스를 생성해 로드밸런서에 붙이기만하면 수평적확장이 손쉽게 이루어진다.
신규 버전의 적용도 일부 컨테이너에만 배포함으로써 전체 시스템의 오류없이 실제 사용환경에서 테스트 가능하다.
컨테이너 : 이미지의 인스턴스로 격리된 실행 컨텍스트
이미지 : 컨테이너의 추상적 템플릿, 상속개념처럼 새로운 이미지를 커밋하여 커스터마이즈하게 생성할 수 있다.
레지스트리 : 이미지가 등록된 클라우드, 일반적으로 Docker Hub를 활용하며 AWS ECR 역시 이미지 레지스트리로 활용가능하다.
docker/whalesay:latest
registry / repo_name : tag 로 구분한다.
tag 는 기본값으로 latest
walkthroughs
need to understand all commands below
docker image pull docker/whalesay:latest
docker image ls
docker image rm docker/whalesay
docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
# -i : interactive
# -t : tty (terminal connection)
docker container run -it --rm danielkraic/asciiquarium:latest
컨테이너는 이미지의 인스턴스이고, PK로 name과 container id를 갖는다. 따라서 container name은 중복될 수 없다.
기존의 컨테이너를 삭제하기 위해서는 docker ps -a
명령어로 종료된 컨테이너까지 포함된 모든 컨테이너를 표시하고, docker container rm <container identifications>
를 수행해서 삭제하면 해당 name을 재사용 가능하다.
컨테이너를 삭제하는 것과 이미지를 삭제하는 것은 다르다.
-d를 run과 함께 활용하면 detatched 모드로 백그라운드에서 실행된다.
# pull if not exist then run
docker container run --name 컨테이너_이름 -p 818:80 httpd
building docker image with node web appj
아래의 Dockerfile을 읽을 수 있다면 여기에 모든 과정이 포함되어 있음을 알 수 있다.
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
sprints
지켜야할 형식이 매우 엄격해서 버그가 잘 생긴다.
인덴테이션과 띄어쓰기를 매우매우 주의해서 작성해야 한다.
함께 compose된 컨테이너들은 동일한 서브넷에 위치하므로 포트번호가 중복될 수 없다. 하지만 포트포워딩되지 않은 상태로 상호 호출할 수 있다.
드디어 도커로 앱 배포하는 방법을 익혔다.
생각보다 간단하지만, 매우매우 유용하다.
예전에 크롤러 인스턴스를 여러 환경에 배포할때 고민했던 부분들이 도커 하나로 짠 해결됐다.
Dockerfile을 잘 작성한 후
docker build -t <your user name>/node-web-app .
해주면 이미지가 로컬에 생긴다.
생성한 이미지를 docker hub에 배포하려면
docker login
으로 허브에 로그인 해주고
docker tag <tagName> <your user name>/node-web-app
으로 이미지에 태그 지정
docker push <your user name>/node-web-app
으로 허브에 올려준다.
아니 저 Tiling 문제 푸는 데 2시간 걸렸어요 ㅋㅋㅋ