ec2에 도커 개발환경 구성

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

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

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

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

도커 데몬을 띄운다.

sudo service docker start

도커 실행 확인

sudo docker run hello-world

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

jenkins 사용자 추가

sudo useradd -u 1000 jenkins

jenkins 사용자에게 루트권한 추가

sudo /usr/sbin/visudo

### Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
jenkins ALL=(ALL)       ALL

jenkins 데이터 디렉토리를 추가하고 소유자를 jenkins로 변경

sudo mkdir /apps/jenkins
sudo chown -R jenkins /apps/jenkins

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

사용중인 docker 컨테이너가 많으면 docker-compose를 같이 사용한다.

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

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

facebooktwittergoogle_plusredditpinterestlinkedinmail

젠킨스와 Kubernets v1 데모

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

facebooktwittergoogle_plusredditpinterestlinkedinmail

Play 웹을 Docker로 실행하기

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을 이용합니다.

Play 웹앱을 패키징 합니다.

activator dist

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

docker build -t helloplay .
docker run --name helloplay -d -P helloplay
facebooktwittergoogle_plusredditpinterestlinkedinmail

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

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

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

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

$ 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

facebooktwittergoogle_plusredditpinterestlinkedinmail

Docker Registry v2

도커 레지스트리는 현재 파이썬으로 개발된 v1이 Depericated 되고 Go로 새롭게 v2가 개발되고 있습니다. v2에 대한 내용이 잘 정리되어 있는 발표자료 공유합니다.

facebooktwittergoogle_plusredditpinterestlinkedinmail

centos에서 디폴트 jdk 변경

Centos에서 JDK 1.8을 추가로 설치하면 기존 버전이 디폴트 JDK로 설정되어 있다. 디폴트 JDK를 바꾸고 싶다면

$sudo alternatives --config java

설치된 모든 JDK를 보여준다.

  선택    명령
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

원하는 JDK 번호를 선택하면 디폴트 JDK가 변경된다.

 

 

facebooktwittergoogle_plusredditpinterestlinkedinmail

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를 참고하여 만든다.

FROM ubuntu:trusty
MAINTAINER Ervin Varga <ervin.varga@gmail.com>

# Make sure the package repository is up to date.
RUN apt-get update
RUN apt-get -y upgrade

# Install a basic SSH server
RUN apt-get install -y openssh-server
RUN sed -i 's|session    required     pam_loginuid.so|session    optional     pam_loginuid.so|g' /etc/pam.d/sshd
RUN mkdir -p /var/run/sshd

# Install JDK 7 (latest edition)
RUN apt-get install -y openjdk-7-jdk

# Add user jenkins to the image
RUN adduser --quiet jenkins
# Set password for the jenkins user (you may want to alter this).
RUN echo "jenkins:jenkins" | chpasswd

# Standard SSH port
EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

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

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

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

참고자료

facebooktwittergoogle_plusredditpinterestlinkedinmail

맥용 마크다운(Markdown) 에디터

마크다운(Markdown)은 웹에서 글을 쓰는 사람들을 위해서 텍스트를 HTML로 변환하기 쉽게 해주는 도구입니다.

  • 일반 텍스트 파일 형식이며
  • 문법이 간단해서 쉽게 배워서 사용할수 있고
  • 읽기도 편하며
  • 글을 구조적으로 만들어 줍니다.

맥에서 마크다운 문서를 작성할때 사용하기 좋은 에디터 추천합니다. MOU를 많이 쓰는데 문서가 커지면 자주 먹통이 되고 이미지가 너무 크게 보여서 불편합니다. 개발이 중단된거 같기도 하구요. 그대신 MacDown을 추천합니다.

MacDown도 사용하다 보니 가끔 에디터가 먹통이 되는 현상이 보이네요. 상용도구를 하나 구입했습니다.

참고자료

facebooktwittergoogle_plusredditpinterestlinkedinmail

Play 프로젝트 Eclipse로 가져오기

Activator로 만든 Play 프로젝트를 Eclipse로 가져오는 방법이다.

1.Play 프로젝트를 이클립스 프로젝트로 변환한다.

Play 프로젝트는 sbt 프로젝트이다. sbt 플러그인중 eclipse 플러그인을 이용하면 쉽게 Play 프로젝트를 이클립스 프로젝트로 바꿀수 있다. project > plugins.sbt에 추가한다.

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

플러그인을 추가하고 Activator 콘솔에서 eclipse를 실행하면 이클립스 프로젝트 파일이 만들어진다.

2.이글립스에 scalaIDE를 설치한다. scalaIDE를 설치하면 sbt 프로젝트를 바로 임포트 할 수 있다.

facebooktwittergoogle_plusredditpinterestlinkedinmail