docker hub

docker hub

필자는 요즘 docker 에 빠져있다.
docker hub에 굉장히 많은 images들을 보면서 신기하기도하고, 직접 모든것을 구현하기보다는 오픈소스를 적극활용하여 개발이 이루어지는 시대가 정착된것 같기도하다.
모든 사람의 성격이 다른것처럼. 개개인의 개발자의 성향이 다르지만, 필자의 성격은 다른 개발자가 구현해놓은 것을 가져다 쓰기보다는 직접 구현을 해야 적성이 풀리는 그런 성격을 지녔다.( 고쳐야되는데 .. 그냥 아무생각없이 가져다쓰면 속편할텐데 …)
그래서 docker hub에 이미지를 올려보았다.


command 중복

이전 포스트에서 jenkins Dockefile 을 보자.
상단부터 system 언어셋 설정부터, jdk , 그리고 하단의 maven 과 같은 설치를 진행하는 command를 볼수있다.
docker를 사용하는데에 있어서 jenkins 만 사용하면 사실 아무런 문제가되지않는다. 그냥 원하는대로 시스템에 설치할 command를 기술하면되니까.
그러나 서비스를 하는데에있어서 분명 jenkins 만 존재하지않을것이다. jenkins가 배포를 하기위한 java server가 있을것이고, nodejs를 빌드할테면 node server가 별도로 존재해야할것이다. 그밖에도 필요한 이미지가 다수 존재할수있을것이다.
다시말해서 java server를 도커를 통해 만들게된다면, jenkins Dockerfile에 기술된 command를 일부 또는 버전만 바뀐 채 다시 기술해야할것이다.


이미지 분리

필자는 가장 기본 os를 debian jessie 버전을 기본적인 os를 사용한다.
docker를 처음 접하였을땐 ubuntu를 사용하였지만, 이상하게 docker hub에서 debian 계열의 이미지가 많아 찾아보니, ubuntu 보다 가볍고, ubuntu와 같은 계열이기에 debian을 많이 사용한다고한다.
기본os를 base 이미지를 사용하여 시스템 언어셋 설정이 utf8인 docker image를 만들었다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM debian:jessie
MAINTAINER jaehunpark "setyourmindpark@gmail.com"
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales && \
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
CMD ["/bin/bash"]



다음으로 이렇게만든 debian-utf8 이미지를 base로 만든 debian-oracle-jdk:8 이미지를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM setyourmindpark/debian-utf8
MAINTAINER jaehunpark "setyourmindpark@gmail.com"
RUN \
echo "===> add webupd8 repository..." && \
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && \
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 && \
apt-get update
RUN echo "===> install Java" && \
echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes oracle-java8-installer oracle-java8-set-default
RUN echo "===> clean up..." && \
rm -rf /var/cache/oracle-jdk8-installer && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME=/usr/lib/jvm/java-8-oracle
ENV PATH=${PATH}:${JAVA_HOME}/bin
CMD ["/bin/bash"]

이렇게 필요한 부분만 분리하여 base 이미지로 참조하여 추가적으로 필요한 이미지를 지속적으로 만들면된다. 사실 다른 docker hub images들도 모두 이렇게 만들어져있다.


다음으로 다시한번 이렇게 생성된 debian-oracle-jdk:8 이미지를 base로 한 debian-maven:apple 이미지를 만들었다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM setyourmindpark/debian-oracle-jdk:8
MAINTAINER jaehunpark "setyourmindpark@gmail.com"
ENV MAVEN_VERSION=3.5.0
RUN wget --quiet --no-cookies http://apache.tt.co.kr/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/maven.tar.gz && \
tar xzvf /tmp/maven.tar.gz -C /opt && \
mv /opt/apache-maven-${MAVEN_VERSION} /opt/maven && \
rm /tmp/maven.tar.gz
ENV M3_HOME /opt/maven
ENV PATH=${PATH}:${M3_HOME}/bin
CMD ["/bin/bash"]

여기서 고민을 많이하였다. 버전명을 apple이라고 준것은, apple이란 버전은 jdk8 과 maven 3.5.0 버전을 사용하기에 버전명을 apple이라고 준것이다.
현재 apple 버전만 docker hub에 올라가있는 상태이며, jdk 와 maven의 서로다른 조합의 요구사항이 생길시 새로운 버전의 debian-maven:<새로운버전명> 이미지를 올리도록하겠다. ( 예를들어 jdk7 버전에 maven 3.5.0 버전의 조합일시 사전에 debian-oracle-jdk:7 이미지는 이미 생성되어있겠죠 .. )
필자가 docker hub에 올린 이미지들은
docker hub setyourmindpark
에서 확인할수있다 …


견해

‘docker hub에 이미지를 올려야겠다’ 라고 생각하였을땐 jenkins와 node server, java server 와같은 이미지를 올려야겠다고 생각했다. 하지만 이런 이미지들 보다는, 각자가 세팅하고자하는 jdk, maven , node 의 버전이 모두가 다를것이니. 시스템 전역에서 설치되는 설치파일들의 조합을 docker hub를 통해 제공하면 좋을것같아 이미지를 올리게되었다. 이러한 이미지를 base로 하여 각자가 추가적으로 필요한 command를 기술하여 이미지를 생성하면 command들을 조금이나마 줄일수있을것이다.
필자가 제공하는 docker hub 이미지들외에 전세계 개발자들이 만들어놓은 이미지들이 무수히 많으니, base이미로 적극활용하는것이 개발 생산성 향상에 도움이될것이다 .