티스토리 뷰


이 글은 Dockerdocker-compose를 알고 있다는 전제하에 설명을 하고 있습니다.

Docker 가 생소하다면 여기 김충섭 님의 글을 먼저 읽어 보시길 추천합니다.


Docker 는 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.


Docker 를 이용하면 로컬 개발 환경을 다른 사람과 동일하게 구성할 수 있으며, 이걸 그대로 서비스에 올릴 수 있다는게 가장 큰 장점 뽑을 수 있습니다. Laravel은 이러한 로컬 개발 환경을 위해 Homestead / Valet 같은 환경을 같이 제공해 줍니다. 즉 Docker 를 사용하지 않아도 훌륭한 로컬 개발 환경을 구축 할 수 있습니다. 하지만 실제 서비스 환경까지 생각한다면 Docker 는 좋은 선택이 될 수 있습니다.


Laravel 로 프로젝트를 진행하게 되면 기술 스택은 다양하게 구성이 가능합니다.

DB같은 경우도 MYSQL 를 쓸수도 있고 mariaDB 를 사용할 수 있으며, 아니면 NOSQL인 mongodb 를 사용 할 수도 있습니다. 서버 또한 NGINX or Apache 같은 선택 사항이 있으며, 세션을 위해 redis 같은 메모리 기반 NOSQL 사용해야 할 수 도 있습니다.


이러한 사유로 Docker를 이용할려고 환경 작업하던 중 잘만들어진 오픈 소스 프로젝트가 있지 않을까 라는 생각으로 레퍼런스용으로 찾아보니 Laradock 이라는 프로젝트가 눈에 띄었습니다.

Laradock 프로젝트 특징

우리는 바퀴를 모두 만들 필요가 없습니다. 잘 만들어진 프로덕트가 있다면 그걸 잘 활용하는 것도 중요하기에 Laradock 프로젝트를 살펴보았습니다. 다양한 설정이 가능하도록 구성이 되어있으며, 관련하여 문서도 잘 준비되어 있습니다.


Laradock은 아래 사항들을 지원하고 있습니다.


Database Engines: MySQL - MariaDB - Percona - MongoDB - Neo4j - RethinkDB - MSSQL - PostgreSQL - Postgres-PostGIS.


Database Management: PhpMyAdmin - Adminer - PgAdmin


Cache Engines: Redis - Memcached - Aerospike


PHP Servers: NGINX - Apache2 - Caddy


PHP Compilers: PHP FPM - HHVM


Message Queueing: Beanstalkd - RabbitMQ - PHP Worker


Queueing Management: Beanstalkd Console - RabbitMQ Console


Random Tools: HAProxy - Certbot - Blackfire - Selenium - Jenkins - ElasticSearch - Kibana - Grafana - Mailhog - MailDev - Minio - Varnish - Swoole - Laravel Echo…


이렇게 다양한 환경을 작동시키기 위해 여러가지 설정들이 존재합니다. 


php Xdebug 모듈을 설치할지 여부라던가 workspace에 Composer를 설치여부 / Node.js를 설치여부 / Yarn 패키지 매니저를 설치여부 등을 작업자에 맡게 설정이 가능하게끔 .env 파일과 docker-compose.yml 그리고 각 컨테이너의 Dockerfile에 반영이 되어 있습니다.


예를들어 Xdebug의 경우 아래와 같이 반영되어 있습니다.

## .env file
### XDEBUG 사용여부 ##########################
USE_XDEBUG=true
## docker-compose.yml
workspace:
  build:
    context: ./php-fpm
    args:
      - INSTALL_XDEBUG=${USE_XDEBUG}
php-fpm:
  build:
    context: ./php-fpm
    args:
      - INSTALL_XDEBUG=${USE_XDEBUG}
# Dockerfile (php-fpm / workspace)
# xDebug:

ARG INSTALL_XDEBUG=false
RUN if [ ${INSTALL_XDEBUG} = true ]; then \
    # Install the xdebug extension
    pecl install xdebug && \
    docker-php-ext-enable xdebug \
;fi

COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

workspace 컨테이너 같은 utility 컨테이너 제공: workspace 라는 컨테이너를 통해 composer 명령이나 npm 명령들을 node.js 와 php / composer 설치 없이 가능하도록 제공하고 있습니다. 그리고 workspace 에서 자주 사용될 command를 alias 로 적용하기 위해 shell script를 추가되어 있습니다.

# aliases.sh
alias artisan="php artisan"
alias migrate="php artisan migrate"
# Dockerfile (workspace)
COPY ./aliases.sh /home/user/aliases.sh
USER root
RUN echo "" >> ~/.bashrc && \
echo "# Load Custom Aliases" >> ~/.bashrc && \
echo "source /home/user/aliases.sh" >> ~/.bashrc && \
echo "" >> ~/.bashrc && \
sed -i 's/\r//' /home/user/aliases.sh && \
sed -i 's/^#! \/bin\/sh/#! \/bin\/bash/' /home/user/aliases.sh 

xdebug / phpcs 원격 설정 사용 : phpstorm에서 ssh 접속을 이용하여 xdebug 원격 설정을 위해 ssh key를 미리 생성해두고 해당 ssh key를 workspace 컨테이너에 등록이 가능하도록 되어 있습니다.

# Dockerfile (workspace)
# ssh:

ARG INSTALL_WORKSPACE_SSH=false
ENV INSTALL_WORKSPACE_SSH ${INSTALL_WORKSPACE_SSH}

ADD insecure_id_rsa /tmp/id_rsa
ADD insecure_id_rsa.pub /tmp/id_rsa.pub

RUN if [ ${INSTALL_WORKSPACE_SSH} = true ]; then \
    rm -f /etc/service/sshd/down && \
    cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys \
        && cat /tmp/id_rsa.pub >> /root/.ssh/id_rsa.pub \
        && cat /tmp/id_rsa >> /root/.ssh/id_rsa \
        && rm -f /tmp/id_rsa* \
        && chmod 644 /root/.ssh/authorized_keys /root/.ssh/id_rsa.pub \
    && chmod 400 /root/.ssh/id_rsa \
;fi

이 부분은 로컬 PC에 PHP를 설치 안하고도 Xdebug와 php_cs를 phpstorm 같은 ide랑 연결이 가능하기 위해 추가되어있습니다.


source volume 사용: 여러개의 컨테이너에서 source code가 필요합니다. (Worker 에서도 소스가 필요하고 NGINX 에서도 소스가 필요) 


이러한 경우 docker voulme 을 만들어서 컨테이너에 마운트하여 공유하는 방법도 있지만,

voulmes_from 옵션을 이용하여 컨테이너의 마운트된 볼륨을 공유하는 방법이 있습니다. 


laradock은 이러한 방식을 사용하고 있습니다. (voulmes_from 컨테이너로 많이 쓰이는 tianon/true 이미지 사용)


대략 아래와 같은 개념으로 마운트를 한다고 생각하시면 됩니다.


PHP 버전를 동적으로 변경가능: 사용할 PHP의 버전을 언제든지 변경이 가능하도록 아래와 같이 설정되어 있습니다.

# docker-compose.yml
php-fpm:
    build:
      context: ./php-fpm
      dockerfile: "Dockerfile-fpm-${PHP_VERSION}"
## 폴더구조 
+php-fpm
  Dockerfile-fpm-71
  Dockerfile-fpm-70
  Dockerfile-fpm-56
## .env
### PHP version ################
# 사용가능한 값: 71 - 70 - 56
PHP_VERSION=71


그외에 다양한 환경을 제공하고 있습니다. 자세한 사항은 laradock 문서에서 확인 가능합니다.

Laradock 적용하기

Laradock 으로 프로젝트를 띄우는 방법으로 크게 2가지 경우가 있습니다.


- 단일 프로젝트에 적용하기

- 여러개의 프로젝트에 적용하기


Application Container(Source volume)의 볼륨 마운트 경로를 설정이 가능하도록 되어있어 단일 프로젝트이든 여러개의 프로젝트이든 보통 프로젝트 구조는 아래처럼 설정을 하게됩니다.

+ project
+ laradock
## or
+ projectA
+ projectB
+ laradock

Application Container의 경로 설정은 .env 파일에 보면 아래와 같이 변경이 가능합니다. 

만약 .env 파일이 없으시면 env-example 파일을 복사하여 .env파일로 생성해주세요.(.env파일은 docker-compose에서 기본적으로 환경설정 파일로 사용됩니다.)

APPLICATION=../

그 이후 nginx/sites 경로에 nginx 가상호스팅 설정 파일을 추가하여 프로젝트에 해당하는 가상 도메인들을 설정하시면 됩니다.

이때 설정하는 가상호스트에 .dev 도메인을 사용하지 않는 편이 좋습니다.(chrome 63 버전 이후부터 .dev 도메인은 강제로 https로 전환됩니다. 관련링크)

docker 실행

Laradock은 docker-compose 파일을 제공해주고 있어서 docker-compose 명령을 이용하여 여러개의 컨테이너를 쉽게 실행 시킬 수 있습니다.

만약 nginx와 mariadb를 실행시킬거면 아래와 같이만 명령하시면 됩니다.

docker-compose up -d nginx mariadb

반대로 실행시켰던 컨테이너들을 종료시키기 위해선 아래의 명령으로 종료가 가능합니다.

docker-compose down

마무리

Laradock은 정말 편리합니다. 하지만 마치 네가 무엇을 좋아하는지 몰라서 전부 준비해봤어 라는 느낌이 강해서 프로젝트와 상관없는 내용이 많다보니 불필요한 내용 그리고 불편했던 사항들이 제법 많았습니다.


다음 글에는 현재 프로젝트에 적용하기 위해 변경하고 수정했던 내용을 적어볼까 합니다.

(사실 다 적고보니 굉장히 두서없는 글이 나와버려서 당분간 포스트 수정부터 하지 않을까 싶습니다.)

댓글