forcemax's

최근 이슈가 되고 있는 Docker를 제대로 한번 사용해보고 경험해보고 싶어서 가장 많이 만져봤던 Embian eFolder(이하 eFolder) Server를 Dockerize 하기로 하였다. eFolder Server를 초보가 설치하는데 하루가 넘게 걸리는 것을 보면 Dockerize할 대상으로 적합하다고 생각하였다.

Docker에 대한 기본적인 설명은 생략한다. (nacyot님의 도커(Docker) 튜토리얼 : 깐 김에 배포까지)

작업환경 : Ubuntu 14.04 LTS


1. Docker 설치

Docker 설치는 docker 사이트에 자세하게 나와있으니 생략.

Docker Documentation Installation Guide


2. Dockerfile 작성

Dockerfile : Docker image를 build할때 어떠한 내용으로 bulid할 것인지 정의해 놓은 파일.

https://github.com/forcemax/efolder-docker/blob/master/Dockerfile

# # eFolder Dockerfile # # Pull base image. FROM ubuntu:14.04 MAINTAINER Jae-cheol Kim <forcemax@gmail.com> # Install apache, mysql, mod-perl, php5 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update \ && apt-get install -y --no-install-recommends \ apache2 \ apache2-data \ && apt-get install -y --no-install-recommends \ libapache2-mod-perl2 \ libncurses5-dev \ libdbi-perl \ libtext-iconv-perl \ libtimedate-perl \ libdate-calc-perl \ libdbd-mysql-perl \ libnet-dns-perl \ libmime-lite-perl \ libossp-uuid-perl \ libemail-address-perl \ libmailtools-perl \ libsoap-lite-perl \ libsphinx-search-perl \ && apt-get install -y --no-install-recommends \ libapache2-mod-php5 \ php5-mysql \ && apt-get install -y --no-install-recommends \ git \ && apt-get install -y --no-install-recommends \ mysql-server \ && apt-get install -y --no-install-recommends \ sphinxsearch \ && apt-get install -y --no-install-recommends \ supervisor \ && rm -r /var/lib/apt/lists/* RUN mkdir -p /var/log/supervisor RUN git clone https://github.com/forcemax/efolder /app RUN rm -rf /app/.git COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY 000-default.conf /etc/apache2/sites-available/000-default.conf COPY 00.CONFIG /app/etc/00.CONFIG COPY FILE_crawl.pl /app/etc/FILE_crawl.pl RUN chmod a+x /app/etc/FILE_crawl.pl COPY makeSphinxIndex.sh /app/etc/makeSphinxIndex.sh RUN chmod a+x /app/etc/makeSphinxIndex.sh COPY sphinx.conf /app/etc/sphinx.conf COPY searchd.sh /app/etc/searchd.sh COPY ddns.sh /app/etc/ddns.sh RUN chmod a+x /app/etc/ddns.sh COPY init_db.sh /app/doc/db/init_db.sh RUN chmod a+x /app/doc/db/init_db.sh COPY setup.php /app/www/eFolderAdmin/Config/setup.php COPY EmbianSoapHandler.pm /app/src/EmbianSoap/EmbianSoapHandler.pm COPY CONFIG.pm /app/src/FTPService/lib/perl/eFolder/CONFIG.pm RUN echo "" >> /etc/crontab RUN echo "36 4 * * * root ( cd /app/etc ; bash makeSphinxIndex.sh all 2> /dev/null > /dev/null )" >> /etc/crontab RUN echo "* * * * * root ( cd /app/etc ; bash makeSphinxIndex.sh delta 2> /dev/null > /dev/null )" >> /etc/crontab RUN ln -fs /usr/share/zoneinfo/Asia/Seoul /etc/localtime VOLUME ["/eFolder", "/var/lib/mysql"] EXPOSE 80 CMD ["/usr/bin/supervisord"]

FROM 에서 어떤 base image를 사용할 것인지

MAINTAINER 에서 누가 작성한 것인지

CMD 에서 image를 실행할 때 어떤 명령을 실행할 것인지

ENV, RUN, COPY 를 조합하여 image생성시에 어떠한 내용이 담길 것인지 지정한다.


eFolder Server는 apache2 + mod_perl + mod_php 를 사용하여 WEB, mysql을 사용하여 DB, 그리고 sphinxsearch를 사용하여 fulltext search를 조합하여 운영된다. 일반적으로 Docker는 하나의 process만 실행시킬 것을 권장하고 있으나 여러 daemon을 실행하기 위해서 supervisord를 사용하였다.

https://github.com/forcemax/efolder-docker/blob/master/supervisord.conf

[supervisord]
nodaemon=true

[program:mysqld]
command=/bin/bash -c "/usr/bin/mysqld_safe"

[program:cron]
command=/bin/bash -c "/usr/sbin/cron -f"

[program:searchd]
command=/bin/bash /app/etc/searchd.sh
startsecs=0

[program:ddns]
command=/bin/bash /app/etc/ddns.sh
startsecs=0

[program:apache2]

command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" 


3. DB 및 파일 데이터 저장소

eFolder는 웹하드 서비스를 위해서 만들어졌으니 당연히 파일 데이터가 저장된다. 또한 fulltext search 및 사용자 관리를 위해서 DB를 사용하니 DB 데이터 역시 저장된다.

Docker에서 container는 stateless이다. 그렇다면 "서버가 reboot되면 DB 및 파일 데이터는 사라지는데?" 또는 "image를 수정해서 다시 실행하면 어떡하지?"

이런 Persistent Data에 대한 필요성 때문에 Docker에서는 Data Volume Container라는 concept을 내놓았다. Data Volume Container는 실행 상태의 container가 아니며, 다른 container에서 Data Volume Container의 volume을 mount해서 사용하는 것이라 생각하면 된다.

- Data Volume Container 생성

sudo docker run -i -t --name efolder_mysql_data -v /var/lib/mysql -v /eFolder busybox /bin/sh

- eFolder Container에서 Data Volume Container 사용

sudo docker run -d -p 80:80 -e HOSTIPADDR=$HOSTIPADDR --volumes-from efolder_mysql_data forcemax/efolder:latest


4. Github 및 Docker Hub에 등록

eFolder 및 eFolder Dockerize 관련 내용은 모두 Github에 등록하였으며, 아무나 사용할 수 있도록 public으로 공개되어 있다.

Github eFolder Repository

Github eFolder Docker Repository


Docker Hub 에도 Repository를 생성하였으며, image를 automated build하도록 설정하였다. 참고로 eFolder는 Docker Hub에서 build하는데 약 15분이 필요하다.

Docker Hub eFolder Repository

다음 명령으로 image를 build하지 않고 바로 다운로드 받아서 사용할 수 있다.

sudo docker pull forcemax/efolder:latest


모든 작업을 마치고..

기존 서버들이 Ubuntu 12.04 LTS로 운영중이라 Ubuntu 14.04 LTS 에서 eFolder를 테스트하지 못했는데, Ubuntu 14.04 LTS에서 HTTP::Message Perl Module 버전이 올라가면서 기존 코드가 에러를 내서 코드 수정까지 진행해야 했다.

eFolder Server 설치를 편하게 할 수 있도록 하는 것이 우선이라 한 image에 모든 daemon을 운영하도록 하였으나, Scale-out을 고려하여 daemon별로 나누는 것도 고려해 볼만 하다.