August 7, 2020

PHP MVC - Laravel Docker installs

PHP MVC 패턴 - 라라벨 도커 설치 WebHacking 플랫폼을 구현 도중 이번에는 시중에 오픈된 PHP MVC - Laravel를 통하여 취약점 테스팅을 제작해보고싶어 Docker로 PHP laravel를 구현하였습니다.

Title: PHP Laravel - Docker
Author: DongDongE
Tags: Programming
Release: 2020.08.07


PHP MVC 패턴 - 라라벨 도커 설치

WebHacking 플랫폼을 구현 도중 이번에는 시중에 오픈된 PHP MVC - Laravel를 통하여 취약점 테스팅을 제작해보고싶어 Docker로 PHP laravel를 구현하였습니다.


우선 준비물은 아래와 같습니다.

  • Docker
  • Docker-Compose
  • (옵션) portainer (Docker Container)




version: "3"

services: 
    php:
        image: laravel_php_5.3.0
        container_name: laravel_php_5.3.0
        # restart: always
        # volumes: 
        #     - ./myapp:/var/www/html/myapp
        depends_on: 
            - mysql
        links:
            - mysql:mysql
        build:
            context: ./php-fpm
            dockerfile: ./Dockerfile
        tty: true
        # environment: :
        #     TEST: test
        # working_dir: /var/www/html/myapp
        networks:
            - laravel_5.3.0
        ports:
            - "127.0.0.1:9999:9000"
    
    mysql:
        image: laravel_mysql_5.3.0
        container_name: laravel_mysql_5.3.0
        # restart: always
        volumes:
            - leravel_dbs_5.3.0:/var/lib/mysql
        build:
            context: ./mysql
            dockerfile: ./Dockerfile
        tty: true
        environment:
            MYSQL_DATABASE: myapp
            MYSQL_ROOT_PASSWORD: toor
            MYSQL_USER: dongdonge
            MYSQL_PASSWORD: toor
        networks:
            - laravel_5.3.0
        ports:
            - "127.0.0.1:5674:3306"

volumes: 
    leravel_dbs_5.3.0:
        # driver: local

networks:
    laravel_5.3.0:
        driver: bridge
        ipam:
            config:
                - subnet: 172.16.12.0/24

Docker-compose.yml

현재 단순히 프로그래밍 코딩을 위하여 별도 Apache나 Nginx같이 웹서버 전용 도커는 포함하지 않았습니다.
php 자체에서 웹서버를 구동하여 코딩을 하기 위해 "PHP" 컨테이너와 디비를 저장하기 위한 "MySQL" 컨테이너를 준비하였습니다.




FROM ubuntu:18.04

LABEL DongDongE="DongDongE@d0ngd0nge.xyz"

ARG OS_LOCALE=C.UTF-8

# C.UTF-8
CMD /usr/sbin/locale-gen ${OS_LOCALE}

ENV DEBIAN_FRONTEND=noninteractive \
    DEBCONF_NONINTERACTIVE_SEEN=true \
    LC_ALL=${OS_LOCALE} \
    LANG=${OS_LOCALE}

WORKDIR /var/www/html/
# composer create-project --prefer-dist laravel/laravel myapp "5.5.*" && \
RUN apt-get update && \
    apt-get install curl git vim net-tools php7.2 php7.2-cli php7.2-mysql php7.2-mbstring php7.2-sqlite3 php7.2-mbstring php7.2-xml -y && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
    composer create-project --prefer-dist laravel/laravel myapp "5.3.0" && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

WORKDIR /var/www/html/myapp

EXPOSE 9000

CMD [ "/usr/bin/php", "artisan", "serve", "--host=0.0.0.0", "--port=9000" ]

./php-fpm/Dockerfile

php 전용 Dockerfile 입니다. "CMD"부분을 보시면 php 바이너리를 통하여 artisan php를 serve 옵션을 사용하여 php 자체적으로 웹서버를 구동시킵니다.




FROM mysql:5.7

#   mysql> SHOW VARIABLES LIKE '%VERSION%';
#   +-------------------------+------------------------------+
#   | Variable_name           | Value                        |
#   +-------------------------+------------------------------+
#   | innodb_version          | 5.7.29                       |
#   | protocol_version        | 10                           |
#   | slave_type_conversions  |                              |
#   | tls_version             | TLSv1,TLSv1.1,TLSv1.2        |
#   | version                 | 5.7.29                       |
#   | version_comment         | MySQL Community Server (GPL) |
#   | version_compile_machine | x86_64                       |
#   | version_compile_os      | Linux                        |
#   +-------------------------+------------------------------+


ARG OS_LOCALE=C.UTF-8

# C.UTF-8
CMD /usr/sbin/locale-gen ${OS_LOCALE}

ENV DEBIAN_FRONTEND=noninteractive \
    DEBCONF_NONINTERACTIVE_SEEN=true \
    LC_ALL=${OS_LOCALE} \
    LANG=${OS_LOCALE}

# COPY schema.sql /docker-entrypoint-initdb.d
# RUN chmod -R o+r /docker-entrypoint-initdb.d

# Secure-file-priv Disable
# RUN echo "secure-file-priv=\"\"" >> /etc/mysql/conf.d/docker.cnf

EXPOSE 3306 33060

CMD [ "mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--skip-character-set-client-handshake", "--innodb-flush-log-at-trx-commit=0" ]

./mysql/Dockerfile

Mysql 전용 Dockerfile입니다. 추후에 Laravel를 통하여 Mysql에 회원가입 정보를 저장하기 위해 사용할 예정입니다.




$ sudo docker-compose up -d

위 명령어를 통하여 도커 환경을 자동 셋팅합니다.