여러가지 프로그래밍 언어를 이용해서 개발을 진행하다보면 개발환경이 설치한 패키지 끼리의 의존관계가 생기면서 어지럽혀지고, 그로 인해서 관리하기가 어려워지는 문제가 있다. 또한 다양한 환경에서 정상적으로 작동하는지 테스트 하기 위하여 추가적으로 설정을 해주는 과정 또한 오래걸릴 수 밖에 없다.

이러한 문제들을 해결 하기 위해 프로그램의 실행환경을 추상화하여 컨테이너로 제공해주는 도커(Docker)를 이용해서 개발환경을 세팅해보기로 했다. 개발용으로 사용하고 있는 맥북에서는 기본적으로 5.6 버전의 php가 기본적으로 제공되고 있지만, 도커를 이용해서 추가적인 설치 없이도 7.2 환경에서 동작하는 것 처럼 설정이 가능하다.

맥북 기본 php버전

기초부터 리눅스 이미지에서 apache와 php를 설치하도록 새로운 이미지를 생성 하는 방법도 있지만, php-7.2:apache 베이스 이미지가 이미 있기 때문에 MariaDB를 추가적으로 붙여서 작동할 수 있도록 했다.

FROM php:7.2-apache
MAINTAINER [email protected]

그리고 XpressEngine에서 필요로 하는 라이브러리를 설치하도록 했다. 필요한 라이브러리와 설정등은 XE GitHub의 Server Requirments 에서 구체적인 정보를 확인 가능하다.

RUN apt-get -y -qq update
RUN apt-get install -y -qq libpng-dev libjpeg-dev
RUN echo "ServerName localhost" \
    | tee /etc/apache2/conf-available/servername.conf
RUN docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd
RUN apt-get install -y -qq mysql-client

RUN docker-php-ext-install mbstring
RUN docker-php-ext-install mysqli
RUN docker-php-ext-install pdo
RUN docker-php-ext-install pdo_mysql

추가로 XE는 기본적으로 .htaccess 파일을 통해서 rewrite을 이용한 짧은 주소를 지원해 주고 있기 때문에 rewrite설정을 적용하기 위해서 Apache의 설정을 바꾸어 주었다.

RUN a2enmod rewrite
RUN apache2ctl -k graceful

COPY 명령어를 통해서 직접 XE코어를 복사해서 추가하는 방법도 있겠지만, 컨테이너와 디스크에 코어가 중복으로 존재하는게 내키지 않아, 그냥 ADD 명령어를 통해 XE GitHub를 통해 마지막 릴리즈인 1.11.0 버전을 추가하도록 했다.

ADD https://github.com/xpressengine/xe-core/releases/download/1.11.0/xe.1.11.0.tar.gz \
/var/www/html

마지막으로 압축을 해제하고, XE에서 요구하는 권한을 chmod 명령어로 설정하게 해주었다.

WORKDIR /var/www/html
RUN tar -zxf xe.1.11.0.tar.gz && rm xe.1.11.0.tar.gz
RUN chmod 707 /var/www/html

EXPOSE 80

여기까지 작성한 전체 코드는 다음과 같다.

저장된 도커파일을 이용해서 빌드하여 실행 해보니 설치화면이 잘 나타나는것을 확인 할 수 있었다.

# 현재 경로의 Dockerfile을 기반으로 xe-core 이름으로 1.11.0 버전태그를 붙여 빌드
docker build -t xe-core:1.11.0 . 
# xe-core 이미지를 80포트에 연결하여 detached 모드로 실행
docker run -d -p 80:80 --name xe xe-core:1.11.0

XE 도커 이미지 빌드 완료

이미지를 빌드하고 나서 XE를 정상적으로 사용할 수 있도록 추가로 받아두었던 MariaDB서버를 붙여주기 위해 docker-compose.yml 파일을 작성했다. 최대한 코어를 건드리지 않는 범위에서 개발을 진행할 수 있도록 필요한 폴더를 cp 명령어로 컨테이너에서 빼주었고, db또한 기록된 상태로 있을 수 있도록 디스크에 마운트 했다.

이제 docker-compose up 명령어를 통해 마운트, 포트 설정, 컨테이너 통신등의 설정을 한번에 진행할 수 있다.

docker compose up

실행후에 다시 재 접속하여 설치를 진행하고, db 정보의 호스트 입력칸에는 localhost 대신 db 를 적어주어, MariaDB 컨테이너에 연결하도록 하면 된다.

XE 설치 완료

또한 나중에 개발환경을 바꿀 일이 있거나 다른 곳에서 작업할 때에도 빠르게 이용 할 수 있도록 Docker cloud에 push 해서 업로드 하였다.

docker tag xe-core:1.11.0 xvezda/xe-core:1.11.0 # 빌드한 이미지의 태그를 변경
docker push xvezda/xe-core:1.11.0 # 클라우드에 업로드

이렇게 Docker cloud에 업로드 해 두면 GitHub를 통해서 git clone 을 하는 것 처럼 손쉽게, 위처럼 Dockerfile을 작성하지 않아도 docker run xvezda/xe-core:1.11.0 명령어로 미리 빌드 되어있는 이미지를 Docker cloud를 통해 다운로드 받아 실행하는 것이 가능하다.