본문 바로가기

카테고리 없음

Docker DockerFile로 원하는 이미지 만들기

이전 posting에서 처럼 간단하게 docker run 명령어를 통해 Docker hub에서 에서 원하는 이미지를 다운받아 실행할 수 었있는데, 그렇다면 원하는 이미지를 만들어낼 수는 없을까? 


그래서 Docker에서는 DockerFile을 제공한다. 

참고 : https://docs.docker.com/engine/reference/builder/


DockerFile는 text로 구성되어있으며 여기에 image에 생성에 대한 정보를 기술한다. 


FROM busybox

ENV foo /bar WORKDIR ${foo} # WORKDIR /bar ADD . $foo # ADD . /bar COPY \$foo /quux # COPY $foo /quux


위의 docker file은 busybox이미지로 부터 생성되며 

ENV 명령어로 환경변수 foo에 /bar라는 값을 넣어놓는다. 

WORKDIR 명령어로 ${foo} 즉 foo의 값이 /bar이 docker를 실행할 때의 최초 접근 디렉토리가 되게한다. 

ADD로 현재 디렉토리(".")에 있는 모든 파일을 /bar이라는 곳에 넣어준다. 

COPY를 이용해 /bar 디렉토리를 /quux 디렉토리로 복사한다. 


실제로 실행한 결과를 보자 (/bar directory가 없어 마지막 copy 명령어 부분을 조금 변경함) 

$ cat Dockerfile             -> Dockerfile 내용

FROM busybox

ENV foo /bar

WORKDIR ${foo}

ADD . $foo

COPY a /quux


$ ls                        -> 현재 directory

a  b  bar  c  Dockerfile


$ sudo docker build -t my-first-image .        -> Dockerfile을 사용해 my-first-image라는 image를 만든다.
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM busybox
 ---> ac6a7980c6c2
Step 2 : ENV foo /bar
 ---> Running in 7dcea2b911d6
 ---> 7b82bf2d6d91
Removing intermediate container 7dcea2b911d6
Step 3 : WORKDIR ${foo}
 ---> Running in 4f0a1ec1fda5
 ---> ed8ee7978f53
Removing intermediate container 4f0a1ec1fda5
Step 4 : ADD . $foo
 ---> 63764819fc46
Removing intermediate container e911f4b6dcd0
Step 5 : COPY a /quux
 ---> adb5d383ba8e
Removing intermediate container c195578f542d
Successfully built adb5d383ba8e

$ sudo docker images                    -> docker images 명령어로 보면 my-first-image가 생성된 것을 확인 할 수 있다.
REPOSITORY                 TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
my-first-image             latest              adb5d383ba8e        About a minute ago   1.114 MB
busybox                    latest              ac6a7980c6c2        13 days ago          1.113 MB
sequenceiq/hadoop-docker   2.7.0               679730efaea5        7 months ago         1.76 GB
maven                      3.2-jdk-7           8043923318a4        9 months ago         594.2 MB

$ sudo docker run -it my-first-image sh    -> docker 내부로 들어가면 add 명령어로
/bar # pwd
/bar
/bar # ls
Dockerfile  a           b           bar         c

/bar # cd ..                                -> COPY a /quux의 결과 a파일이 / 디렉토리의 quux파일로 복사됨
/ # ls
bar   bin   dev   etc   home  proc  quux  root  sys   tmp   usr   var



Docker에서는 다음과같은 명령어가 사용 가능하다. 


  • ADD
  • COPY
  • ENV
  • EXPOSE
  • LABEL
  • USER
  • WORKDIR
  • VOLUME
  • STOPSIGNAL
  • ONBUILD (when combined with one of the supported instructions above)

위의 instruction들과 CMD, RUN등을 사용하여 원하는 image를 기술하고 실행하면 된다. 


docker hub에 가보면 원하는 image들을 검색 가능한데 여기에서 Dockerfile들을 확인할 수 있다. 

현재 내가 사용하는 hadoop docker image는 아래와 같은 docker file을 가진다. 

링크 : https://hub.docker.com/r/sequenceiq/hadoop-docker/~/dockerfile/


# Creates pseudo distributed hadoop 2.7.0

# # docker build -t sequenceiq/hadoop . FROM sequenceiq/pam:centos-6.5 MAINTAINER SequenceIQ USER root # install dev tools RUN yum clean all; \ rpm --rebuilddb; \ yum install -y curl which tar sudo openssh-server openssh-clients rsync # update libselinux. see https://github.com/sequenceiq/hadoop-docker/issues/14 RUN yum update -y libselinux # passwordless ssh RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -q -N "" -t rsa -f /root/.ssh/id_rsa RUN cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys # java RUN curl -LO 'http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.rpm' -H 'Cookie: oraclelicense=accept-securebackup-cookie' RUN rpm -i jdk-7u71-linux-x64.rpm RUN rm jdk-7u71-linux-x64.rpm ENV JAVA_HOME /usr/java/default ENV PATH $PATH:$JAVA_HOME/bin # download native support RUN mkdir -p /tmp/native RUN curl -Ls http://dl.bintray.com/sequenceiq/sequenceiq-bin/hadoop-native-64-2.7.0.tar | tar -x -C /tmp/native # hadoop RUN curl -s http://www.eu.apache.org/dist/hadoop/common/hadoop-2.7.0/hadoop-2.7.0.tar.gz | tar -xz -C /usr/local/ RUN cd /usr/local && ln -s ./hadoop-2.7.0 hadoop ENV HADOOP_PREFIX /usr/local/hadoop ENV HADOOP_COMMON_HOME /usr/local/hadoop ENV HADOOP_HDFS_HOME /usr/local/hadoop ENV HADOOP_MAPRED_HOME /usr/local/hadoop ENV HADOOP_YARN_HOME /usr/local/hadoop ENV HADOOP_CONF_DIR /usr/local/hadoop/etc/hadoop ENV YARN_CONF_DIR $HADOOP_PREFIX/etc/hadoop RUN sed -i '/^export JAVA_HOME/ s:.*:export JAVA_HOME=/usr/java/default\nexport HADOOP_PREFIX=/usr/local/hadoop\nexport HADOOP_HOME=/usr/local/hadoop\n:' $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh RUN sed -i '/^export HADOOP_CONF_DIR/ s:.*:export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/:' $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh #RUN . $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh RUN mkdir $HADOOP_PREFIX/input RUN cp $HADOOP_PREFIX/etc/hadoop/*.xml $HADOOP_PREFIX/input # pseudo distributed ADD core-site.xml.template $HADOOP_PREFIX/etc/hadoop/core-site.xml.template RUN sed s/HOSTNAME/localhost/ /usr/local/hadoop/etc/hadoop/core-site.xml.template > /usr/local/hadoop/etc/hadoop/core-site.xml ADD hdfs-site.xml $HADOOP_PREFIX/etc/hadoop/hdfs-site.xml ADD mapred-site.xml $HADOOP_PREFIX/etc/hadoop/mapred-site.xml ADD yarn-site.xml $HADOOP_PREFIX/etc/hadoop/yarn-site.xml RUN $HADOOP_PREFIX/bin/hdfs namenode -format # fixing the libhadoop.so like a boss RUN rm -rf /usr/local/hadoop/lib/native RUN mv /tmp/native /usr/local/hadoop/lib ADD ssh_config /root/.ssh/config RUN chmod 600 /root/.ssh/config RUN chown root:root /root/.ssh/config # # installing supervisord # RUN yum install -y python-setuptools # RUN easy_install pip # RUN curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -o - | python # RUN pip install supervisor # # ADD supervisord.conf /etc/supervisord.conf ADD bootstrap.sh /etc/bootstrap.sh RUN chown root:root /etc/bootstrap.sh RUN chmod 700 /etc/bootstrap.sh ENV BOOTSTRAP /etc/bootstrap.sh # workingaround docker.io build error RUN ls -la /usr/local/hadoop/etc/hadoop/*-env.sh RUN chmod +x /usr/local/hadoop/etc/hadoop/*-env.sh RUN ls -la /usr/local/hadoop/etc/hadoop/*-env.sh # fix the 254 error code RUN sed -i "/^[^#]*UsePAM/ s/.*/#&/" /etc/ssh/sshd_config RUN echo "UsePAM no" >> /etc/ssh/sshd_config RUN echo "Port 2122" >> /etc/ssh/sshd_config RUN service sshd start && $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh && $HADOOP_PREFIX/sbin/start-dfs.sh && $HADOOP_PREFIX/bin/hdfs dfs -mkdir -p /user/root RUN service sshd start && $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh && $HADOOP_PREFIX/sbin/start-dfs.sh && $HADOOP_PREFIX/bin/hdfs dfs -put $HADOOP_PREFIX/etc/hadoop/ input CMD ["/etc/bootstrap.sh", "-d"] # Hdfs ports EXPOSE 50010 50020 50070 50075 50090 # Mapred ports EXPOSE 19888 #Yarn ports EXPOSE 8030 8031 8032 8033 8040 8042 8088 #Other ports EXPOSE 49707 2122


또, maven을 설치하기 귀찮아서 사용했던 maven docker이미지는 아래와 같이 간단한 Docker file을 가진다. 

링크 : https://github.com/carlossg/docker-maven/blob/8ab542b907e69c5269942bcc0915d8dffcc7e9fa/jdk-7/Dockerfile


FROM java:openjdk-7-jdk


ENV MAVEN_VERSION 3.3.9


RUN curl -fsSL https://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz | tar xzf - -C /usr/share \

  && mv /usr/share/apache-maven-$MAVEN_VERSION /usr/share/maven \

  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn


ENV MAVEN_HOME /usr/share/maven


VOLUME /root/.m2


CMD ["mvn"]