ec2에 도커 개발환경 구성

AWS ec2 인스턴스를 이용해 도커기반 개발환경을 구성해보자.

범용 인스턴스 t2-medium + EBS( 16기가)를 생성한다.

필요한 SW를 설치한다.: git, docker, jdk

[code lang=”perl”]git : sudo yum install git.x86_64 -y
docker: sudo yum install docker.x86-64 -y
jdk: sudo yum install java-1.8.0-openjdk-devel.x86_64 -y
[/code]

도커 데몬을 띄운다.
[code lang=”perl”]sudo service docker start[/code]

도커 실행 확인
[code lang=”perl”]sudo docker run hello-world[/code]

이제 도커 컨테이너로 필요한 서비스를 실행하면된다. ec2가 ssh 접속을 지원하지만 매번 접속해서 설치하고 실행하는건 귀찮으니 젠킨스 서버를 하나 설치해서 사용한다. 도커 명령까지 실행가능하도록 해 놓으면 도커 이미지도 만들수 있어 편하다.

jenkins 사용자 추가
[code lang=”perl”]sudo useradd -u 1000 jenkins[/code]

jenkins 사용자에게 루트권한 추가
[code lang=”perl”]sudo /usr/sbin/visudo

### Allow root to run any commands anywhere
root ALL=(ALL) ALL
jenkins ALL=(ALL) ALL
[/code]

jenkins 데이터 디렉토리를 추가하고 소유자를 jenkins로 변경
[code lang=”perl”]sudo mkdir /apps/jenkins
sudo chown -R jenkins /apps/jenkins
[/code]

호스트 서버 설정이 끝났으니 젠킨스를 컨테이너로 실행한다. 젠킨스 실행은 다른 포스트를 참고한다. 이렇게 권한을 주면 보안상 취약한 면이 있으니 접근 가능한 IP는 제한하는게 좋다.

사용중인 docker 컨테이너가 많으면 docker-compose를 같이 사용한다.
[code lang=”perl”]sudo -i
curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-uname -suname -m > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
[/code]

참고자료
https://docs.docker.com/installation/centos/
https://docs.docker.com/compose/install/

젠킨스와 Kubernets v1 데모

Oscon 2015에서 구글은 Kubernet v1을 발표했습니다. 본 발표후 파트너사 발표가 이어졌는데 Cloudbee CTO이자 젠킨스를 만든 가와구찌가 젠킨스와 Kubernet v1을 연동하는 내용을 데모로 시연했습니다.

Play 웹을 Docker로 실행하기

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

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

[code lang=”perl”]Activator new helloplay
5번이나 6번 선택
cd helloplay
activator run[/code]

Dockerfile을 프로젝트 루트에 추가합니다. Dockerfile 내용은 아래 내용을 참고해서 ACTIVATOR_VERSION, APP-NAME,VERSION 을 수정합니다.

[code lang=”perl”]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"][/code]

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

Play 웹앱을 패키징 합니다.

[code lang=”perl”]activator dist[/code]

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

[code lang=”perl”]docker build -t helloplay .
docker run –name helloplay -d -P helloplay[/code]

도커 이미지 크기를 줄이는 방법

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

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

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

$ 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

Docker를 Jenkins 슬레이브로 사용하자

jenkins 를 단독 서버로 많이 사용하지만 마스터-슬레이브로 구성할 수 있다. 이렇게 구성하면 마스터는 슬레이브를 이용해 빌드를 진행하고 빌드결과는 컨트롤러에서 확인이 가능하다. 마스터 슬레이브 구성의 장점은 무엇일까?

  • 슬레이브를 여러개 만들어 다양한 환경에서 빌드를 진행할수 있다.
  • 시간이 오래 걸리는 빌드를 슬레이브에게 위임할수 있다.
  • 마스터는 하나이기 때문에 jenkins를 여러개 두는것에 비해 관리가 쉽다.

이 슬레이브를 docker로 만들면 아래 그림과 같은 구성이 된다.

jenkins-register2(그림 출처:http://making.meetup.com/post/122890386432/steps-towards-automated-testing-with-docker-and)

도커 슬레이브를 사용하려면 마스터서버가 도커 프로비저닝이 가능해야 한다. 이 설정은 다른 포스트를 참고한다. 마스터 서버를 만들고 나면 서버에 docker 플러그인을 설치한다.

jenkins 관리 > 시스템에서 Cloud 영역 설정을 추가한다. 기본적인 설정은 플러그인 페이지를 참조한다. 주의할 점은 docker url을 적을때 ‘http://’ 를 붙여야 하며 version은 적어주면 안된다. (이 부분은 버그로 보인다.)  설정을 하고나면 ‘test connection’ 버튼으로 설정 문제가 없는지 확인한다.

도커 서버 설정이 끝나면 슬레이브로 사용할 도커 이미지를 설정한다. 슬레이브 도커 이미지는 도커허브에 있는 evanga/jenkins-slave를 참고하여 만든다.

마스터가 슬레이브와 통신할때 ssh를 사용하기 때문에 ssh 서버를 설치하고 jenkins 사용자를 추가했다. 마스터 서버에서 슬레이브 도커 이미지를 설정할때 credential이 필요한데 이 credential을 만들때 사용자 id/password를 사용한다.

이제 Job을 추가한다. Job은 Build multi-configuration project 스타일로 만들어야 한다. 설정에서 Configuration Matrix 영역 > ‘Add axis’ 에서 ‘Slave’를 선택하면 젠킨스 설정에서 추가한 슬레이브 노드를 선택할 수 있다.

설정에 문제가 없다면 Job을 실행했을때 새로운 도커 컨테이너가 만들어져 빌드가 진행되고 빌드가 끝나면 자동으로 컨테이너가 삭제된다. 설정에 따라 컨테이너를 유지하는것도 가능하다.

참고자료

Dockerfile 에디터

Docker 이미지를 자주 만들다 보면 Dockerfile을 수정해야 하는 경우가 많이 있습니다. Dockerfile은 텍스트 파일이라 일반 텍스트 에디터로 작성이 가능하지만 전 Atom을 사용합니다.  가볍고 오프소스라 라이센스 걱정도 없고 Dockerfile에 대한 문법 하일라이팅도 플러그인으로 지원합니다.

Dockerfile에 대한 자세한 내용은 레퍼런스를 참고하세요.

ING사 도커를 이용한 Continuous Delivery 사례

DockerConEurope 2014에서 ING 사의 CTO가 발표한 지속적인 배포(Continuous Delivery) 사례입니다. 내용을 간단히 요약해 보면

  • 실리콘 벨리 스타트업들이 기존 사업 영역을 장악하고 있다.
  • ING 같은 기업도 변화하지 않으면 살아남을수 없다고 인식
  • 애자일,스크럼, DevOps 도입을 시작
  • CEO, CTO 같은 경영진에서 Tech Driven 기업임을 선언하고 강하게 주도
  • DevOps 팀으로 조직구로 변화, 개발자들의 도전을 환영, 파트너 십 강화
  • Docker 같은 오픈소스를 이용해 마이크로 서비스 플랫폼 구축
  • 빌드서버, 테스트 서버, 기능 테스트를 위한 환경 구축
  • High Speed with Low Cost 를 달성

제가 요즘 재밌게 보고있는 Akka도 사용하고 있네요. ㅎ

http://blog.docker.com/2014/12/dockercon-europe-keynote-continuous-delivery-in-the-enterprise-by-henk-kolk-ing/

DevOps State of Mind

지난 5월 캐나다 벤쿠버에서 openstack summit 2015가 열렸습니다. 세션중에 DevOps와 컨테이너가 만났을때 시너지 효과를 잘 설명한 발표가 있어서 공유합니다.

내용을 요약해보면

  • 비즈니스 영역에서 이노베이션의 중요성이 계속 커지고 있지만 기존 인프라를 기반으로 이노베이션을 진행하기 어렵다.
  • TBD