2016.08.08 오늘의 구글링

오늘의 구글링

class안 private 변수 선언만 있고 setter가 없는데 잘되는 코드가 있다. 뭐지?

  • query : project lombok
    • Project Lombok
    • Java코드의 반복작업이되는 Getter/Setter 뿐아니라 toString/hashcode 등 자주 overwrite되는 함수들을 다이어트 시켜주는 Annotation base processor다.
    • 이제야 이런 것을 알다니; 다른 사람 코드 보다가 너무 늦게 입문.
    • 역시 무식하면 손발이 고생이다를 꺠우침.
  • 결과 : lombok을 써보고 혹시모를 단점들도 좀 찾아보자
---------------------------------------- "2016.08.08 오늘의 구글링" 끝 ----------------------------------------
2016.07.09 오늘의 구글링

오늘의 구글링

nginx 넣은 도커가 실행하자마자 죽어버리는데 왜이러지?

  • query : docker container is exited after run
  • 결과 : nginx가 foreground에서 실행되도록 바꾸자.
---------------------------------------- "2016.07.09 오늘의 구글링" 끝 ----------------------------------------
Google Container Engine으로 서버 환경 구축해보기 1편

Google Container Engine으로 서버 환경 구축해보기 1편

GDG 모임에서 이런저런 이야기나오다가 토이프로젝트를 해보자는 말에 그동안 미뤄왔던 Docker와 Java8 관련 코딩을 한번 해보자는 생각에 시작해봅니다.

일단 Hello World까지 만들 서버 환경은 - Google Container Engine + Docker - JDK8 - nginx + tomcat - Spring

Google Container Engine + Docker

그럼 일단 Docker Image 부터 만들어보자.

nginx + tomcat 연동하기

mac에서 Docker가 지원된다고 하니 굳이 cloud 환경에서 만들어서 올리지말고 내 로컬에서 해보기로 합니다. 일단 Docker를 처음 써보는 것이니 튜토리얼 투어를 떠나 봅니다. - Getting Started with Docker for Mac - 내가 필요한 Docker Image 만들기 : 튜토리얼 보고 학습한 다음에 기본기입니다.

제가 위의 예제로 만들어둔 nurinamu/ubuntu:basic 이미지를 여기에서 이용합니다.

80포트를 열어서 이미지를 docker로 올려봅니다. $ docker run -t -i -p 80:80 nurinamu/ubuntu:basic /bin/bash

컨테이너 안으로 들어가서 이제 nginx를 실행합니다.

container# service nginx start

브라우저로 http://localhost에 접근해서 Welcome to nginx!를 확인합니다. 이제 그럼 tomcatnginx에 연결해봅시다.

연결하기 이전에 우선 nginxtomcat의 처리 부분을 결정합니다. 저는 모든 request가 기본적으로는 tomcat에 연결되도록하고 아래의 request들을 예외 부분으로 처리해서 nginx로 보내려고 합니다.

  • 확장자가 js, css, html 인 것들
  • 지정 폴더 하위의 모든 것들 /imgs, /assets

보면 알겠지만 WAS complie이 필요없는 것들만 처리하도록 합니다. 그래서 만들어진 설정은 아래와 같습니다.

nginx.conf 파일

location / {
  proxy_pass http://localhost:8080; #8080으로 프록시 연결
}

location /assets {
  root /assets
}

location /imgs {
  root /assets/imgs
}

설정을 바꿨으니 nginx 재시작

# service nginx restart

이제 톰캣을 실행합니다.

# cd CATALINA_HOME/bin
# ./startup.sh

그럼 이제 다시 http://localhost 에 접근하면 tomcat home이 표시됩니다.

이제 만들어진 이미지를 자기가 원하는 이름으로 이미지 저장합니다.

자동 실행되도록 설정하기

이제 컨테이너가 Docker에 올라가는 시점에 웹서버가 바로 실행될 수 있도록 설정을 합니다. 우선 nginxnginx.conf에 아래 내용을 첫라인에 추가합니다.

daemon off;

위 한줄을 추가하면 nginx가 daemon이되어 background로 빠지지 않고 foreground로 동작합니다.

하지만 이것은 nginx가 실행되었을때 background로 빠져버러 docker process가 바로 종료되는 문제를 해결할 뿐입니다. 실행시 nginx를 start 시켜주지는 못합니다. 그래서 저는 Dockerfile을 통해서 nginx를 실행하는 Image를 만듭니다.

우선 Dockerfile 이름으로 파일을 생성합니다. 그리고 그안에 아래의 내용을 넣습니다.

FROM nurinamu:gdg:basic
ENV PATH /path/to/tomcat9/bin
EXPOSE 80
CMD startup.sh && nginx

위와 같이 저장하고 아래 명령으로 build 합니다.

$ docker build . -t nurinamu/gdg:local

그러면 nurinamu/gdg:local 이미지가 만들어지게 됩니다.

해당 이미지를 실행하면 브라우저를 통해 http:localhost에서 톰캣 웰컴페이지를 볼 수 있습니다.

#이미지 실행
$ docker run -d -p 80:80 nurinamu/gdg:local

로컬 개발 Directory를 컨테이너에 연동하기

이제 웹사이트 개발을 해야하는데 매번 github에 올리고 컨테이너에서 pull하고 하는 불편한 방법으로는 무리가 있습니다. Docker는 local의 filesystem을 container filesystem으로 mount해주는 기능이 있습니다. 아래의 명령처럼 이미지를 실행하시면 됩니다.

docker run -d -p 80:80 -v {local dir}:{container dir} nurinamu/gdg:local

위와 같이 실행하면 container안에서 {continer dir} 접근시 {local dir}로 설정한 local 파일들을 볼 수 있습니다.

원하는 이미지를 만들 수 있게되었으니 이걸 나중에는 Google Container Registry에 올려둡니다.

다음 글에서 이제 GKE를 이용한 처리를 이야기해보겠습니다.

---------------------------------------- "Google Container Engine으로 서버 환경 구축해보기 1편" 끝 ----------------------------------------
2016.07.05 오늘의 구글링

오늘의 구글링

com.google.appengine.api.memcache.MemcacheServiceException: Memcache getIdentifiables: exception getting multiple keys는 대체 왜 자꾸 발생하는 거지?

  • query : com.google.appengine.api.memcache.MemcacheServiceException: Memcache getIdentifiables: exception getting multiple keys
    • Can you tweak GAE’s memcache timeout?
    • 흐흠. memcache 내부 proxy call이 오래걸리면서 발생하는 것인데, 이것 timeout을 짧게 가져가면 자동으로 retry하는 건지 다시 확인이 필요.
  • 결과 : memecache 내부 timeout 이슈
    • 추가분석
      • exeception을 던지는 메소드는 AsyncMemcacheServiceImpl.getIdentifiables() 요기네.
      • MemcacheSerialization.deserializeItem이 의심됨. deserialize가 오래 걸리는 걸까? 근데 막상 코드안에서는 timeout 날만한 곳이 안보이는데.

spot instance price가 무슨 말이지?

  • query : spot instance price aws
    • Amazon EC2 스팟 인스턴스 요금
    • 인스턴스 비용 절감을 위해 해당 리젼에서 예비로 생성된 인스턴스를 공급/수요에 따라 남아있는 것을 저렴한 가격으로 사용하는 방식이군. 가격은 입찰 방식으로 수요가 많으면 올라가는 방식. 신기하네 이런거 ㅋ
  • 결과 : 입찰방식의 과금
---------------------------------------- "2016.07.05 오늘의 구글링" 끝 ----------------------------------------
2016.07.04 오늘의 구글링

오늘의 구글링

Docker에서 run할때 container id로 run할 방법이 있나?

  • query : how to run enter container by id
  • 결과 : docker exec -it {container_id} /bin/sh

nginx랑 tomcat 연동은 어떻게하지? apache랑은 많이헀었는데 어떻게 다를려나

  • query : nginx tomcat 연동
    • nginx와 Tomcat 구성
    • 완전히 내 맘에드는 포스트는 찾지 못했고 일단 이걸 보니, nginx.conf를 좀 손봐서 처리해야겠다.
    • 일단 원하는 것은 모든 request는 tomcat으로 가고 static처리 가능한 파일들만 nginx로 가도록.
  • 결과 : nginx.conf configutation 문서를 좀 읽어봐야겠다.

docker에서 port forwarding은 어떻게하나?

  • query : docker port forwarding
    • 도커 치트 시트
    • 우왕 어제 봤던 문서에 또 왔네. 괜히 도커 치트시트가 아니네 궁금한 것이 여기 한자리에 다있네 따봉!
  • 결과 : docker run -p $HOSTPORT:$CONTAINERPORT -name CONTAINER -t someimage
---------------------------------------- "2016.07.04 오늘의 구글링" 끝 ----------------------------------------