Play로 개발한 웹앱을 Docker 컨테이너로 실행하는 방법입니다.


Docker로 실행할 샘플 어플리케이션 helloplay를 만들어서 실행되는지 확인합니다.

Activator new helloplay

5번이나 6번 선택

cd helloplay

activator run


Dockerfile을 프로젝트 루트에 추가합니다. 

Dockerfile 내용은 아래 내용을 참고해서 ACTIVATOR_VERSION, APP-NAME,VERSION 을 수정합니다.


FROM centos:7


MAINTAINER Sangcheol Hwang <이메일>


ENV JAVA_VERSION 1.8.0

ENV ACTIVATOR_VERSION 1.3.2

ENV APP_NAME helloplay

ENV VERSION 1.0-SNAPSHOT


RUN yum update -y 

RUN yum install -y java-"${JAVA_VERSION}"-openjdk.x86_64 && \

cd /opt && \

yum install -y unzip && \

curl -O http://downloads.typesafe.com/typesafe-activator/"${ACTIVATOR_VERSION}"/typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

unzip typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

rm -f /opt/typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

mv /opt/activator-"${ACTIVATOR_VERSION}"-minimal /opt/activator && \

chmod a+x /opt/activator/activator && \

yum clean all


ENV PATH $PATH:/opt/activator


RUN mkdir /app

ADD ./target/universal/${APP_NAME}-${VERSION}.zip /app/

RUN unzip /app/${APP_NAME}-${VERSION}.zip -d /app/ 

WORKDIR /app/${APP_NAME}-${VERSION}/bin


EXPOSE 9000


CMD ["./helloplay"]


ubuntu로 만든다면 dockerfile/java:oracle-java8을 이용합니다.

FROM dockerfile/java:oracle-java8


ENV ACTIVATOR_VERSION 1.3.2

ENV APP_NAME helloplay

ENV VERSION 1.0-SNAPSHOT


MAINTAINER Sangcheol Hwang <sc.hwang@sk.com>


RUN cd /opt && \

curl -O http://downloads.typesafe.com/typesafe-activator/"${ACTIVATOR_VERSION}"/typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

unzip typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

rm -f /opt/typesafe-activator-"${ACTIVATOR_VERSION}"-minimal.zip && \

mv /opt/activator-"${ACTIVATOR_VERSION}"-minimal /opt/activator && \

chmod a+x /opt/activator/activator


ENV PATH $PATH:/opt/activator


RUN mkdir /app

ADD ./target/universal/${APP_NAME}-${VERSION}.zip /app/

RUN unzip /app/${APP_NAME}-${VERSION}.zip -d /app/

WORKDIR /app/${APP_NAME}-${VERSION}/bin


EXPOSE 9000


CMD ["./helloplay"]



Play 웹앱을 패키징 합니다.

activator dist


Docker 이미지를 만들고 컨테이너를 실행합니다.

docker build -t helloplay .

docker run --name helloplay -d -P helloplay


저작자 표시 비영리 변경 금지

윈도우 서버에서 도커

Work & Study/TechTalk 2015/04/20 09:35 posted by k16wire



윈도우에서 가상환경이 아닌 윈도우 서버에서 Docker를 실행하겠다는 발표가 나왔습니다. Docker는 리눅스 커널을 공유하는 리눅스 컨테이너 기술입니다. 리눅스가 아닌 윈도우에서 Docker를 실행한다는게 잘 이해가 가지 않네요.


참고자료

[1] http://azure.microsoft.com/blog/2014/10/15/new-windows-server-containers-and-azure-support-for-docker/

[2] http://www.ciokorea.com/news/24784


저작자 표시 비영리 변경 금지

도커로 이것저것 테스트 하다보면 내가 만들지도 않은 이미지와 컨테이너가 마구 늘어납니다. 도커 명령어중에 이미지나 컨테이너를 한번에 지우는 명령은 없습니다. 하지만 파이프라인으로 쉽게 이를 구현할 수 있다.


현재 실행중이 아닌 컨테이너를 모두 지우고 싶다면

docker rm $(docker ps -aq)


이미지를 모두 지우고 싶다면

docker rmi $(docker images -q)


만약 컨테이너가 남아있다면 이미지는 지워지지 않습니다.



저작자 표시 비영리 변경 금지

사이드킥 모델(Sidekick model)

Work & Study/TechTalk 2015/03/31 15:21 posted by k16wire

CoreOS에서 fleet으로 Docker 컨테이너를 실행하면 클러스터에 들어있는 호스트 리소스를 스케쥴링하여 최적 호스트에 컨테이너를 실행해줍니다. 그런데 이렇게 실행된 서비스에 대한 접근 정보(IP와 포트)를 알수 없다는 이슈가 생깁니다. 


이를 위한 대표적인 해결책이 사이드킥 모델(Sidekick model) 입니다. 이 모델은 서비스가 실행되면 자동으로 동반 실행되는 서비스를 하나 더 등록합니다. 이 동반 서비스는 해당 서비스가 실행되고 나면 서비스의 IP와 포트 정보를 etcd에 저장합니다. 서비스가 종료되면 etcd에서 해당 서비스의 키를 삭제합니다.


다음은 nginx 서비스를 fleet으로 실행했을때 ip와 port 정보를 구하는 사이드킥 서비스 예입니다.

[Unit]
Description=Announce nginx1.service
# Binds this unit and nginx1 together. When nginx1 is stopped, this unit will be stopped too.
BindsTo=nginx1.service

[Service]
ExecStart=/bin/sh -c "while true; do etcdctl set /services/website/nginx1 '{ \"host\": \"%H\", \"port\": 8080,
 \"version\": \"52c7248a14\" }' --ttl 60;sleep 45;done" ExecStop=/usr/bin/etcdctl delete /services/website/nginx1 [X-Fleet] # This unit will always be colocated with nginx1.service MachineOf=nginx1.service


참고자료



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

윈도우 서버에서 도커  (0) 2015/04/20
도커 이미지와 컨테이너 한번에 지우기  (0) 2015/04/09
사이드킥 모델(Sidekick model)  (0) 2015/03/31
VirtualBox 네트워크 이해  (0) 2015/03/29
Docker 리모트 API로 포트 바인딩  (0) 2015/03/17
Docke 발표자료  (0) 2015/03/14

VirtualBox 네트워크 이해

Work & Study/TechTalk 2015/03/29 03:22 posted by k16wire

네트워크 구성을 테스트하다보니 버추얼박스를 많이 사용합니다. 버추얼박스 네트워크에 대한 이해가 필요해서 검색하다 찾았습니다.


출처: http://solatech.tistory.com/277

버추얼박스 네트워크 이해 및 완벽 가이드.pdf




저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

도커 이미지와 컨테이너 한번에 지우기  (0) 2015/04/09
사이드킥 모델(Sidekick model)  (0) 2015/03/31
VirtualBox 네트워크 이해  (0) 2015/03/29
Docker 리모트 API로 포트 바인딩  (0) 2015/03/17
Docke 발표자료  (0) 2015/03/14
Panamax 설치  (0) 2015/03/03

도커는 리모트 API가 잘되어 있습니다. 이를 이용하면 원격에서 도커 호스트를 관리할수 있는데요. 컨테이너를 만들때 포트를 호스트 포트와 바인딩하는게 좀 헷갈려서 정리해봤습니다.


3306포트를 기본으로 하는 MySQL을 컨테이너로 실행한다고 했을때

컨테이너에서 실행되는 MySQL의 3306포트를 호스트의 49153 포트로 바인딩해보겠습니다.


컨테이너를 생성할때 ExposedPorts에 아래와 같이 오픈할 포트를 명시합니다.

POST /containers/create
{
"Image": mysql,
"ExposedPorts": {
"3306/tcp": {}
}
}

컨테이너가 생성되었다면 이제 컨테이너를 실행할 차례입니다.

만들어진 컨테이어 ID와 바인딩 시킬 호스트의 포트를 아래처럼 PortBindings 키값으로 명시해줍니다.

POST /containers/(id)/start
{
"id": id,
"PortBindings": {
"container_port/tcp": [
{
"HostIp": "127.0.0.1", // Strings, not numbers here
"HostPort": "49153"
}
]
}
}

그러면 아래처럼 3306포트와 49153 포트가 바인딩된 컨테이너가 만들어집니다.
043d2366695c mysql:latest "/entrypoint.sh mysq 12 seconds ago

Up 11 seconds 0.0.0.0:49153->3306/tcp mysql_myhome

간단하지만 Docker Remote API 스펙에 자세하게 나오지 않은 부분이라 정리해봤습니다.


참고자료

https://medium.com/@kevanahlquist/docker-remote-api-port-bindings-example-b55bc5194e20

https://docs.docker.com/reference/api/docker_remote_api/



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

사이드킥 모델(Sidekick model)  (0) 2015/03/31
VirtualBox 네트워크 이해  (0) 2015/03/29
Docker 리모트 API로 포트 바인딩  (0) 2015/03/17
Docke 발표자료  (0) 2015/03/14
Panamax 설치  (0) 2015/03/03
도커 이미지 크기를 줄이는 방법  (0) 2015/02/12

Docke 발표자료

Work & Study/TechTalk 2015/03/14 09:04 posted by k16wire

지난 IBM 후원 개발자 세미나에서 발표했던 Docker 설명 자료입니다.




저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

VirtualBox 네트워크 이해  (0) 2015/03/29
Docker 리모트 API로 포트 바인딩  (0) 2015/03/17
Docke 발표자료  (0) 2015/03/14
Panamax 설치  (0) 2015/03/03
도커 이미지 크기를 줄이는 방법  (0) 2015/02/12
Docker로 만드는 냐옹냐옹  (0) 2015/02/06

Panamax 설치

Work & Study/TechTalk 2015/03/03 17:20 posted by k16wire

Docker 컨테이너 관리도구 Panamax 를 설치합니다. Panamax는 크게 두개 모듈로 이루어져있습니다. Panamax-API, Panamax-UI


CoreOS를 Vagrant로 설치

git clone https://github.com/coreos/coreos-vagrant.git

cd coreos-vagrant

vagrant up


Panamax API 소스 복사

panamax-api 컨테이너에서 사용할 소스코드를 CoreOS에 받아 놓는다. 나중에 이 파일을 도커 컨테이너와 공유한다.

git clone https://github.com/CenturyLinkLabs/panamax-api.git


Vagrantfile 수정

다운로드한 panamax-api 소스를 CoreOS에 바인딩

config.vm.synced_folder "/Users/k16wire/workspace/panamax-api", "/home/core/panamax-api", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']


panamax-api 포트 포워딩 설정

config.vm.network :forwarded_port, guest:8888, host:8888

config.vm.network :forwarded_port, guest:8889, host:8889


CoreOS 실행

vagrant up 


etcd, fleet, journal-gatewayd 서비스 실행

CoreOS로 들어간다.

vagrant ssh


3개 서비스를 실행한다.

core@core-01 ~ $ sudo systemctl start etcd

core@core-01 ~ $ sudo systemctl start fleet

core@core-01 ~ $ sudo systemctl start systemd-journal-gatewayd.socket


Panamax-api 실행

panamax-api 컨테이너를 실행하기 위한 도커 이미지를 가져온다. (도커는 CoreOS에 이미 설치되어 있다.)

docker pull centurylink/panamax-ruby-base


docker0 이더넷 아답터에 할당된 ip 확인

core@core-01 ~ $ ifconfig


panamax-api 컨테이너 실행

docker run -it \

--name panamax_api \

-v /home/core/panamax-api:/var/app/panamax-api \

-v /run/docker.sock:/run/docker.sock \

-p 8888:3000 \

-e "FLEETCTL_ENDPOINT=http://10.1.42.1:4001" \

-e "JOURNAL_ENDPOINT=http://10.1.42.1:19531" \

centurylink/panamax-ruby-base /bin/bash


여기부터는 도커 컨테이너 내부에서 실행한다.


panamax-api 소스 위치로 이동

cd /var/app/panamax-api


panamax-api 가 필요한 루비 라이브러리를 Bundler(http://bundler.io/)를 이용해 설치

bundle


SQLite 데이터베이스 설정

rake db:create db:migrate db:seed

rake panamax:templates:load


레일즈 서버 실행

rails server


테스트

CoreOS 내부에서 먼저 curl로 API 서버가 제대로 동작하는지 테스트 해본다. 성공하면 호스트 에서도 다시 해본다.

curl http://localhost:8888/local_images.json


Panamax-UI 소스 코드 받기

git clone git@github.com:CenturyLinkLabs/panamax-ui.git


Panamax-UI 도커 컨테이너 실행

docker run -it \

--name panamax_ui \

--link panamax_api:panamaxapi \

-v /home/core/panamax-ui:/var/app/panamax-ui \

-p 8889:3000 \

centurylink/panamax-ruby-base /bin/bash


Panamax UI 컨테이너에서  API 서버 IP를 확인합니다.

cat /etc/hosts


환경변수 추가

export PMX_API_PORT_3000_TCP_ADDR=10.1.0.5

export PMX_API_PORT_3000_TCP_PORT=3000


Panamax UI 설치위치로 이동후 라이브러 설치후 서버 실행

cd /var/app/panamax-ui

bundle

rails server



Vagrantfile



참고자료

[1] https://coreos.com/docs/running-coreos/platforms/vagrant/

[2] https://github.com/CenturyLinkLabs/panamax-ui

[3] https://github.com/CenturyLinkLabs/panamax-api



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Docker 리모트 API로 포트 바인딩  (0) 2015/03/17
Docke 발표자료  (0) 2015/03/14
Panamax 설치  (0) 2015/03/03
도커 이미지 크기를 줄이는 방법  (0) 2015/02/12
Docker로 만드는 냐옹냐옹  (0) 2015/02/06
왜 데이터 볼륨 컨테이너가 필요할까  (0) 2015/01/29

도커가 가벼운 가상화 기술이라고 흔히 말합니다만 도커 이미지 크기도 관리하지 않으면 야금야금 늘어나는걸 흔히 볼수 있습니다. 관련 내용이 몇가지 있어서 같이 정리해봤습니다.


가벼운 베이스 이미지를 사용한다.

이미지를 만들때 가능한 크기가 작은 베이스 이미지를 사용합니다.

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
scratch latest 511136ea3c5a 13 months ago 0 B
busybox latest a9eb17255234 7 weeks ago 2.433 MB
debian latest e8d37d9e3476 4 days ago 85.18 MB
ubuntu latest ba5877dc9bec 4 days ago 192.7 MB
centos latest 1a7dc42f78ba 2 weeks ago 236.4 MB
fedora latest 88b42ffd1f7c 10 days ago 373.7 MB


이 외에도 tinycore 리눅스는 19M 정도 작은 용량이어서 가능하다면 좋은 대안이 될수 있을거 같습니다.


Dockerfile 명령을 체인으로 사용한다.

Dockerfile에서 RUN 명령을 개별로 실행하게 되면 실행이 끝날때 마다 중간 이미지가 만들어집니다. 하지만 체인으로 명령을 실행하면 한개만 만들어지기 때문에 크기가 줄어듭니다.


개별적으로 실행하는 경우

RUN wget -nv
RUN tar -xvf someutility-v1.0.0.tar.gz
RUN mv /tmp/someutility-v1.0.0/someutil /usr/bin/someutil


체인으로 실행하는 경우

RUN wget -nv &&
tar -xvf someutility-v1.0.0.tar.gz &&
mv /tmp/someutility-v1.0.0/someutil /usr/bin/someutil


중간 이미지를 하나로 합친다.

도커 이미지는 여러개의 중간 이미지의 합으로 최종 이미지가 만들어집니다. 이 중간 이미지들은 Dockerfile로 이미지를 만들때는 유용하지만 이미 만들어진 이미지를 사용할때는 별로 필요없습니다. 그럼 이런 이미지를 하나로 합치면 이미지 크기가 줄어듭니다. 이미지를 sample 이라는 이름의 컨테이너로 실행했다면

docker export sample | docker import - sample:flat


빌드 도구를 설치하지 않는다.

꼭 필요한 경우가 아니라면 소스를 빌드해서 이미지에 넣으면 불필요한 빌드 도구가 차지하는 공간을 줄일수 있습니다.


패키지 관리자를 정리한다.

apt-get 을 실행했다면 마지막에 apt-get clean을 적어줍니다. /var/cache/apt/archives 디렉토리에 있는 다운로드 파일을 지워줍니다. 패키지 리스트 파일도 지우는것도 권장합니다.[2] apt-get은 /var/lib/apt/lists 디렉토리를 지우면 됩니다.



참고자료

[1] http://www.centurylinklabs.com/optimizing-docker-images/

[2] https://dayone.me/1740z5r

[3] http://blog.docker.com/2013/06/create-light-weight-docker-containers-buildroot/

[4] http://buildroot.uclibc.org/

[5] http://jasonwilder.com/blog/2014/08/19/squashing-docker-images/

[6] https://kreuzwerker.de/en/blog/posts/busybox-python


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Docke 발표자료  (0) 2015/03/14
Panamax 설치  (0) 2015/03/03
도커 이미지 크기를 줄이는 방법  (0) 2015/02/12
Docker로 만드는 냐옹냐옹  (0) 2015/02/06
왜 데이터 볼륨 컨테이너가 필요할까  (0) 2015/01/29
Docker를 처음 외부에 공개했던 영상  (0) 2015/01/28

Docker로 만드는 냐옹냐옹

Work & Study/TechTalk 2015/02/06 12:37 posted by k16wire

아래 컨테이너를 실행하면 뭐가 나올까요.

docker run -it supertest2014/nyan


아래와 같은 달리는 고양이 애니메이션을 볼수 있습니다. ㅎ





저작자 표시 비영리 변경 금지

Docker에서 중요한 개념이 이미지와 컨테이너입니다. 컨테이너는 이미지를 실행한 상태라고 많이 설명합니다. 이 컨테이너중에 데이터 볼륨 컨테이너라는 유형이 있는데 이에 대한 이야기를 해보겠습니다.


Docker 호스트에 있는 특정 디렉토리를 Docker 컨테이너에 공유하고 싶다면 VOLUME을 사용합니다. Dockerfile에 VOLUME을 설정해보겠습니다.


FROM ubuntu:14.04

MAINTAINER scott hwang("k16wire@gmail.com")

VOLUME ["/opt/project/webapp", "/data"]


이 Dockerfile 이미지로(k16wire/ubuntu) 컨테이너를 만들면 '/opt/project', '/data' 디렉토리가 컨테이너에 만들어집니다. 컨테이너에 만들어진 디렉토리와 호스트에 있는 디렉토리를 바인딩 시키는건 컨테이너를 실행할때 합니다. 

docker run -d -P --name datacontainer -v src/webapp:/opt/project/webapp k16wire/ubuntu


 VOLUME을 명시하지 않고 -v 로 바인딩하면 어떻게 될까요? 바인딩 됩니다. 단 바인딩하려는 디렉토리가 반드시 존재해야 에러없이 컨테이너가 실행됩니다.


컨테이너가 하나 더 있다고 해보겠습니다. 이 컨테이너 역시 호스트에 있는 src/webapp 디렉토리를 공유하고 싶습니다. 그럼 앞에서 사용한 -v 옵션을 이용하면 됩니다. 

docker run -d -P --name web -v src/webapp:/opt/webapp nginx

하지만 이렇게 하지않고 앞에서 만든 컨테이너를 활용할수도 있습니다.

docker run -d -P --name web --volumes-from datacontainer nginx

후자처럼 컨테이너를 실행한다고 했을때 VOLUME을 공유하는 컨테이너를 데이터 볼륨 컨테이너라고 부릅니다. 그럼 데이터 볼륨 컨테이너를 쓰는것과 -v로 직접 디렉토리를 공유하는게 어떤 차이가 있을까요. 결과만 놓고 본다면 다르지 않습니다만 컨테이너 구성면에서 변화가 생깁니다.


-v 옵션으로 공유를 추가하는것은 컨테이너와 호스트간에 연결을 맺는것이지만 데이터 볼륨 컨테이너를 사용하면 컨테이너와 컨테이너간의 연결로 바뀝니다.(궁극적으로는 데이터볼륨컨테이너를 거쳐 호스트와 연결이 되는것이죠.) 호스트가 공유하고 싶은 데이터(여기서는 디렉토리)를 논리적인 단위로 추상화 시켰다고 볼수도 있습니다. 꼭 Symbolic Link를 만들어서 사용하고 물리적인 실제 경로는 숨기는것과 유사해보입니다.

Microservice 아키텍처로 본다면 컨테이너는 서비스에 해당하며 서비스는 특정 행위를 책임집니다. 데이터 볼륨 컨테이너는 데이터 공유라는 행위를 책임지는 서비스인 셈입니다. 이렇게 행위에 대한 역할이 명확해 지기 때문에 데이터 볼륨 컨테이너가 필요합니다. 


참고자료

[1] https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container

[2] https://medium.com/@ramangupta/why-docker-data-containers-are-good-589b3c6c749e

[3] http://stackoverflow.com/questions/18496940/how-to-deal-with-persistent-storage-e-g-databases-in-docker/20652410#20652410

[4] http://www.offermann.us/2013/12/tiny-docker-pieces-loosely-joined.html

[5] http://crosbymichael.com/advanced-docker-volumes.html


저작자 표시 비영리 변경 금지

닷 클라우드 솔로몬 하이크(Solomon Hykes)가 내부적으로 개발하던 Docker를 Pycon2013에서 처음 공개했던 영상입니다.


The Future of Docker Container

http://www.youtube.com/watch?v=wW9CAH9nSLs

5분밖에 안되는 발표지만 지금 보면 정말 충격적인 내용을 선보인겁니다. 저기 앉아 있는 사람들은 복받았네요. Hello World를 찍는 새로운 방법으로 추가할만 합니다.


위 데모중 Hello World 찍는 부분을 다시 재 구성한 영상도 있습니다.

http://www.youtube.com/watch?v=w4jfLy633xM





저작자 표시 비영리 변경 금지

Play 웹앱을 개발할때 특정 URL에 대한 접근권한을 제어하는 부분을 직접 구현하기보다는 Deadbolt를 이용하면 쉽게 처리할수 있습니다. Deadbolt는 오픈소스로 Java와 Scala를 둘다 지원합니다.


  • 소스코드: https://github.com/schaloner/deadbolt-2-java
  • Deadbolt 데모 페이지: http://deadbolt-2-java.herokuapp.com/

Deadbolt를 적용해보겠습니다.


1.project/plugins.sbt파일에 Resolver 추가

resolvers += "Deadbolt2 java releases" at "https://github.com/schaloner/deadbolt-2-java/releases"


2.build.sbt 파일에 Dependency 추가

"be.objectify" %% "deadbolt-java" % "2.3.2"


3.DeadboltHandler 정의

public class MyDeadboltHandler extends AbstractDeadboltHandler {

    @Override

    public F.Promise<Result> beforeAuthCheck(Http.Context context) {

        return F.Promise.pure(null);

    }


    @Override

    public F.Promise<Subject> getSubject(Http.Context context) {

        final Http.Cookie userCookie = context.request().cookie("userid");

        return F.Promise.promise(new F.Function0<Subject>()

        {

            @Override

            public Subject apply() throws Throwable

            {

                return // Subjet를 구해서 반환

            }

        });

    }

}


4.Deadbolt 모델 정의

https://github.com/schaloner/deadbolt-2-java/tree/master/test-app/app/be/objectify/deadbolt/java/test/models


5.application.conf에 Deadbolt 핸들러 정의

deadbolt {

    before-auth-check-timeout=4000,

    java {

        cache-user=true,

        handlers {

            defaultHandler=MyDeadboltHandler

        }

    }

}


6.conf/play.plugins에 Deadbolt 플러그인 추가

10000:be.objectify.deadbolt.java.DeadboltPlugin


7.로그인때 subject 키를 쿠키에 저장

response().setCookie("userid", String.valueOf(user.id), 60*60);


8.로그아웃때 subject 키를 쿠키에서 삭제

response().discardCookie("userid");


9.컨트롤러에 접근권한 설정

admin 그룹만 접근할수 있다면

@Restrict(@Group({"admin"}))

public static Result restrictedToFooAndBar()

{

        return ok("Content accessible");

}


로그인한 사람만 접근할수 있다면

@SubjectPresent

public static Result subjectPresent() {

    return ok(accessOk.render());

}


로그인하지 않은 사람만 접근할수 있다면

@SubjectNotPresent

public static Result subjectNotPresent_loggedIn() {

    return ok(accessOk.render());

}


컨트롤러에 Deadbolt가 적용되면 기존에 작성해 놓은 컨트롤러 테스트 코드가 인증정보가 없어서 실패할수 있습니다.


[1] 설정 관련 도움말 http://deadbolt.ws/#/java-docs


저작자 표시 비영리 변경 금지

Docker 컨테이너를 만들때 사내 사이트 dns에 대한 정보를 hosts 파일에 넣어야 하는 상황이 생겼습니다. 처음에는 간단하게 생각했습니다. 


표준 이미지를 만들때 표준으로 사용하는 hosts 파일을 복사하자.


Dockerfile의 COPY 명령어로 해결될줄 알았는데 해당 url에 대한 ip가 다르게 나와서 확인해보니 아래 링크를 찾았습니다.


Editing networking config files

Starting with Docker v.1.2.0, you can now edit /etc/hosts/etc/hostname and /etc/resolve.conf in a running container. This is useful if you need to install bind or other services that might override one of those files.

Note, however, that changes to these files will not be saved by docker commit, nor will they be saved during docker run. That means they won't be saved in the image, nor will they persist when a container is restarted; they will only "stick" in a running container.


원본링크: https://docs.docker.com/articles/networking/


요약하면 /etc/hosts, /etc/hostname, /etc/resolve.conf 와 같은 네트워크 설정 파일을 실행중인 컨테이너에서만 유지된다는 설명입니다. 이를 지원하는 옵션이 RUN 명령에 들어있습니다.


$ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts

RUN 명령어 문서: https://docs.docker.com/reference/run/


--add-host 옵션뒤에 dns:ip 와 같이 적어주면 etc/hosts 파일안에 내용이 추가된것을 확인할 수 있습니다.

저작자 표시 비영리 변경 금지

Play2 프로젝트를 개발할때 IDE로 IntelliJ를 이용하면 Scala 플러그인이 있어 편하다. 그런데 Activator idea 명령으로 Play 프로젝트를 IntelliJ 프로젝트로 변환할때 소스 Path가 잘못 잡혀서 스칼라 코드 컴파일 에러가 나온다. 간단한 설정만 수정하면 스칼라 코드 컴파일 에러를 제거할 수 있다.


1.프로젝트 > Open Module Setting 화면을 연다.

2.소스코드 경로에 자동으로 생성되는 scala 코드 위치를 추가한다.

target/scala-2.11/twirl/main/views

target/scala-2.11/src_managed/main 



저작자 표시 비영리 변경 금지

Kubernets 소개 영상

Work & Study/TechTalk 2014/12/23 02:23 posted by k16wire

Docker 컨테이너 오케스트레이션 시스템 Kubernets를 소개하는 영상입니다.


http://www.youtube.com/watch?v=tsk0pWf4ipw#t=89

 

저작자 표시 비영리 변경 금지

DevOps 2년차

Work & Study/애자일 개발 2014/12/01 10:19 posted by k16wire

처음 DevOps라는 용어를 접하고 내용을 살펴보면서 들었던 생각은

  • 실체가 뭐냐???
  • 애자일에 대한 새로운 키워드인가
  • CD가 전부 아닌가
이 정도였습니다. 그런데 작년부터 지금까지 나름 DevOps를 위해 일한지 2년이 다되가는 시점에 뭘 배우고 뭘 했는지 생각해보니 약간 달라졌네요.
  • DevOps는 운영을 편하게 한다.
  • 인프라스트럭처가 받쳐주지 않는 DevOps는 너무너무 어렵다.
  • Legacy 시스템은 DevOps 적용할때 중요한 장애요소이다.
개발과 애자일에 대한 경험이 많아서 큰 문제없을거라 생각했던 DevOps. 하지만 복병은 인프라였습니다. 1년반동안 인프라에대한 지식과 경험은 정말 많이 늘었습니다.

Docker 까지만 JARVIS에 붙이면 처음에 그렸던 아키텍처가 모두 완성될거 같네요.


저작자 표시 비영리 변경 금지

'Work & Study > 애자일 개발' 카테고리의 다른 글

DevOps 2년차  (0) 2014/12/01
레거시 코드 어디까지 가봤니  (0) 2014/09/18
Agile Korea 2013 발표 영상 - 켄지 히라나베  (0) 2014/07/09
PMI 회고  (0) 2013/12/15
스크럼 팀에서의 팀장의 역할  (2) 2013/12/10
자율이 오히려 부담이 될수있다.  (0) 2013/11/29
TAG DevOps

AWS 콘솔에서 Docker 지원

Work & Study/TechTalk 2014/11/27 16:28 posted by k16wire

'소리없이 강하다.'는 표현은 아마존에게 어울리는 말이라는 생각이 듭니다.

조용히 있다가 툭하니 서비스를 내놓는데 그게 물건이니까요. MS나 구글이 도커에 대한 지원을 발표할때 가만히 있다가 이번에 API 로 도커 컨테이너를 만들수 있는 기능을 발표했습니다.


http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&oid=293&aid=0000015091&sid1=001


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

IntelliJ에서 Play 프로젝트 설정 팁  (4) 2014/12/27
Kubernets 소개 영상  (0) 2014/12/23
AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07

도커 입문서 Docker Book

Work & Study/TechTalk 2014/11/25 01:57 posted by k16wire

도커 공부하시는 분들 많으시죠.

저도 요즘 시간날때마다 찾아보는게 도커인데요. 

새로운 기술을 배울때 책으로 배우면 이미 늦었다고 말하지만 이정도면 괜찮은거 같습니다.

도커에 관심은 있고 컨퍼런스에서 발표도 몇번 들었는데 막상 해본적은 없어서 어떻게 시작할까 망설이는 분들에게 권해드립니다.


http://www.dockerbook.com/


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Kubernets 소개 영상  (0) 2014/12/23
AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31

NIPA의 SW 자산뱅크는 공공 및 민간의 우수 SW 자산을 공유하는 서비스입니다. 지난달 매주 발행되는 웹진에 기사를 써달라는 요청을 받았습니다. 어떤 내용을 쓸까 고민하다가 평소 사내에서 진행하던 '클린코드와 코드리뷰' 교육 내용을 글로 정리해서 보내드렸는데 그게 오늘 나왔네요.


클린 코드에 관심있는 개발자 분이라면 한번 읽어보시길 권해드립니다.


SW 자산뱅크 기사 링크: https://www.swbank.kr/introduce/bbs/knowledgeChannelView.do?nttId=226

저작자 표시 비영리 변경 금지

'Work & Study > 애자일 개발' 카테고리의 다른 글

DevOps 2년차  (0) 2014/12/01
레거시 코드 어디까지 가봤니  (0) 2014/09/18
Agile Korea 2013 발표 영상 - 켄지 히라나베  (0) 2014/07/09
PMI 회고  (0) 2013/12/15
스크럼 팀에서의 팀장의 역할  (2) 2013/12/10
자율이 오히려 부담이 될수있다.  (0) 2013/11/29

Play 책 저술을 접습니다.

Work & Study/TechTalk 2014/08/12 09:39 posted by k16wire

출판사와 맺었던 Play 책 저술 계약을 파기했습니다. 책을 쓰겠다고 결심하고 1년 넘게 진행했던 일을 접으려니 아쉬움이 남네요. 사실 원고를 80~90%정도 쓰고나서 출판사 리뷰, 독자리뷰도 여러차례 진행하면서 몇가지를 깨달았습니다.


  • 이 책은 많이 팔리지 않을거 같다.
IT책이 아니더라도 국내 출판 시장이 부진한건 어제 오늘 일이 아닙니다. 그중에도 IT책은 더 심하죠. 당장 써먹을수 있는 기술이나 트렌드가 되는 기술이 아니면 책을 사지 않습니다. 애자일, SW 품질, Play 프레임워크 같은 기술은 철저히 외면받는게 현실입니다. 팔릴거 같지 않은 책을 굳히 내겠다고 출판사를 조르는것도 아닌거 같습니다.
  • 책을 쓰는게 돈벌이가 안된다.
책을 쓰는 목적이 여러가지가 있겠습니다만 들어간 시간대비 비용은 보전할수 있어야 한다고 생각합니다. 저술의 경우 인세율은 5~15% 사이입니다. 보통 8-10% 정도 받는다고 보시면 맞습니다. 10,000원이 정가인 책을 1쇄(2000~3000권)를 찍는다고 하면 저자가 손에 쥘수 있는 돈은 인세 8%기준일때 160~240만원 정도되겠네요. 이 돈이면 그냥 강의한번 하는게 낫죠. 책이 많이 팔리면 더 많이 벌수 있는거 아니냐고 반문하실 분들도 계실거 같은데 IT책은 1쇄를 파는데 보통 1년이 걸리고 2쇄를 안찍고 절판되는 경우도 흔합니다.
  • 제가 쓰고 싶은 책은 이게 아닌데
이 부분이 저술을 접게된 가장 큰 이유입니다. 처음에 쓰겠다고 잡았던 컨셉은 점점 안드로메다로 가버리고 어느새 제 손에는 전혀 다른 책이 들려 있었습니다. 독자들이 원하는 책, 읽고 싶어하는 책에 맞추다 보니 저도 모르게 그렇게 되더군요. 그러고 나니 점점 책을 교정보기 싫어하는 자신을 발견했습니다. 왜 내가 이렇게 싫은일을 꾹꾹 참으면서 해야하는 거지.

책을 낼겁니다. 그런데 이런 기성 출판 시장의 문제점을 끌어 안은채 내고 싶지는 않네요. 제가 쓰고 싶은 책을 원하는 방식으로 내기 위해서 오늘은 저술을 접습니다.


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26

Try Ruby

Work & Study/TechTalk 2014/08/07 20:54 posted by k16wire

루비 언어를 쉽게 배울수 있게 해주는 사이트입니다.


http://tryruby.org/levels/1/challenges/2


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26
git 레파지터리에 대한 통계가 필요하면 gitstats  (0) 2014/01/07

작년에 진행했던 애자일 코리아 2013 컨퍼런스 발표 영상을 공개하려 합니다.

첫번째 영상은 켄지 상의 발표입니다.

 




http://www.youtube.com/watch?v=s72ElNxaGPE


저작자 표시 비영리 변경 금지

'Work & Study > 애자일 개발' 카테고리의 다른 글

DevOps 2년차  (0) 2014/12/01
레거시 코드 어디까지 가봤니  (0) 2014/09/18
Agile Korea 2013 발표 영상 - 켄지 히라나베  (0) 2014/07/09
PMI 회고  (0) 2013/12/15
스크럼 팀에서의 팀장의 역할  (2) 2013/12/10
자율이 오히려 부담이 될수있다.  (0) 2013/11/29

멤버변수 타입과 클린코드

Work & Study/TechTalk 2014/03/31 11:48 posted by k16wire

코드를 리팩토링하다가 배운것 하나를 정리해 봅니다. 아래와 같은 이메일 발송을 위한 VO가 있습니다.

public class MailContents {

private String[] to;

private String subject;

private String text;

private boolean isHtml = true;


public MailContents(String[] to, String subject) {

this.to = to;

this.subject = subject;

}


public MailContents(String from, String[] to, String subject) {

this.from = from;

this.to = to;

this.subject = subject;

}


public MailContents() {

}


}


메일을 받게될 to가 Stringp[] 으로 되어 있네요. 이 객체를 만드는 서비스는 DAO를 호출한 결과로 이 값을 설정하는데 반환값이 List<String> 이어서 아래와 같은 형변환이 일어납니다.

private String[] getMailRecipients(Long projectId) {

        String[] recipients memberRepository.findRecipients(projectId);

  return recipients.toArray(new String[recipients.size()]);

}


문제는 이와 같은 형변환이 이 객체를 사용하는 곳곳에서 일어난다는데 있습니다. 반드시  String[] 배열을 사용해야 하는게 아니라면 데이터를 반환하는 메소드의 반환타입(여기서는 List<String>) 쓰는게 간결한 코드를 만들수 있습니다. 변환이 필요하다면 가능한 중간에 변환하지 말고 마지막까지 변환을 미루는게 좋습니다.



저작자 표시 비영리 변경 금지

빌드배포 시스템 JARVIS

Work & Study/TechTalk 2014/02/26 11:10 posted by k16wire

작년은 회사에서 사용할 빌드/배포 시스템을 만드느라 보낸거 같습니다. 모든 내용은 아니지만 간단하게 이 시스템을 만들면서 고민했던 내용을 정리해서 회사 블로그 README에 올렸습니다.


http://readme.skplanet.com/?p=7148


빌드 배포 시스템에 관심있는 분들 한번씩 읽어보세요.



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26
git 레파지터리에 대한 통계가 필요하면 gitstats  (0) 2014/01/07
테스트 커버리지를 측정하는게 필요할까요  (0) 2013/06/03
glu 모델  (0) 2013/05/27