docker container에서 laravel 설치 및 실행하기

Jeongkuk Seo
sjk5766
Published in
11 min readJun 9, 2019

최근 Ubuntu OS에서 laravel 프레임워크를 쓸일이 있어 개발 환경을 구축해 보았습니다. 저의 부족한 지식으론 laravel 설치 방법은 크게 두 가지로 나뉩니다.

  1. vagrant로 라라벨 홈스테드 설치
  2. PHP composer 설치

헌데 1번 방법인 라라벨 홈스테드는 laravel 공식홈페이지 에서 볼 수 있기 때문에 저는 2번 방법으로 초점을 맞추려 합니다. 1번 방법을 이용하시려는 분은 공식 사이트 가서 보시는게 좋을듯 합니다.

설치 방법은 composer로 설치를 하되, 실행 방법에 있어 두 가지 방법이 있습니다.

A. PHP 자체 내장 웹 서버를 통해 laravel 실행

B. Nginx와 같은 웹 서버를 통해 laravel 실행

본 포스팅에서는 A랑 B 모두 다루도록 하겠습니다. 기본적으로 docker는 쓸 줄 안다고 가정하고 정리하겠습니다.

A. PHP 자체 내장 웹 서버를 통해 laravel 실행

우선 docker desktop을 설치한 상태에서 아래의 명령어를 실행하여 ubuntu container를 실행합니다.

docker pull ubuntu:latest
docker run -it -p 80:80 --name laravel_install_test ubuntu bash

Container가 실행된 후 먼저 할 일은 php를 설치하는 것입니다. 아래 명령어를 입력합니다. apt 로 PHP 를 설치하는 과정에서 timezone 설정을 위해 어느 국가의 어느 나라냐는 질문이 나오는데 아래 두 줄을 미리 설정한 뒤 설치하면 질문이 나오지 않습니다. (궁금하시면 그냥 apt install -y php 만 입력해보세요)

// PHP TimeZone 질문 회피
export TZ=Asia/Seoul
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
apt update && apt install -y php

설치가 끝나고 버전을 확인하니 php 7.2 버전이 설치가 되었네요

composer를 설치하기 위해 curl을 설치합니다.

apt install -y curl

설치한 curl로 composer를 다운받은 후 설치합니다.

curl -sS https://getcomposer.org/installer | php

composer를 전역으로 사용하기 위해 아래 명령어를 사용합니다.

mv composer.phar /usr/bin/composer

이제 composer를 입력하여 정상적으로 설치 된 것을 확인합니다.

이제 laravel을 설치할 건데.. 중간중간에 에러가 발생할 겁니다. 순차적으로 해결해보겠습니다. 우선 composer를 이용하여 laravel을 설치합니다.

composer global require laravel/installer

그러면 다음과 같이 extension zip이 없다는 에러를 만나게 됩니다.

제 환경에서 php 버전이 7.2 므로 7.2에 해당하는 zip을 설치하고 다시 composer로 laravel을 설치합니다.

apt install -y php7.2-zip
composer global require laravel/installer

아래 명령으로 laravel 명령어를 사용할 수 있도록 PATH를 지정합니다.

export PATH=$PATH:~/.composer/vendor/bin/

laravel을 설치하였으니 프로젝트를 생성하겠습니다.

laravel new first_laravel_project

그럼 아래 에러가 발생합니다. 힘내세요 여러분 마지막 에러입니다.

아래 명령으로 laravel 프로젝트 생성에 필요한 extension을 설치합니다.

apt install -y php7.2-mbstring && apt install -y php7.2-xml

설치가 완료되면 다시 laravel 프로젝트를 생성하는 new 옵션으로 생성합니다. 아래 그림처럼 laravel 프로젝트에 필요한 많은 것들을 알아서 설치해줍니다

제가 생성한 프로젝트의 이름은 first_laravel_project 입니다. 해당 디렉토리로 이동하여 자체 서버를 구동해보겠습니다.

cd first_laravel_project
php artisan serve --host 0.0.0.0 --port 80

php artisan serve는 PHP 5.4 버전부터 포함 된 자체 내장 서버를 구동하는 명령어 입니다. php artisan serve만 입력하면 port가 8000번으로 open 됩니다. docker의 container의 80번 포트를 host PC와 공유하도록 설정하였으므로 port 옵션을 주고, 모든 네트워크 카드랑 통신하는 host 0.0.0.0 옵션을 줘서 서버를 구동합니다.

자 이제 host PC에서 크롬을 열고 localhost에 접근해보면 짠~!

B. Nginx를 통해 laravel 실행

laravel 실행 방법은 다르지만 설치 방법은 A방법과 상당히 유사합니다. 동일한 설치 부분도 그냥 아래에 중복해서 쓰도록 하겠습니다. 고로, B 방법으로 laravel을 실행하시는 분들은 굳이 스크롤을 올리지 않고 아래만 쭉 보시면 됩니다.

docker desktop을 설치한 상태에서 아래의 명령어를 실행하여 ubuntu container를 실행합니다.

docker pull ubuntu:latest
docker run -it -p 80:80 --name laravel_install_test ubuntu bash

Container가 실행된 후 먼저 할 일은 php를 설치하는 것입니다. A방법과 다른점은 Nginx를 통해 실행할 것이기 때문에 php가 아닌 php-fpm을 설치합니다.apt 로 PHP 를 설치하는 과정에서 timezone 설정을 위해 어느 국가의 어느 나라냐는 질문이 나오는데 아래 두 줄을 미리 설정한 뒤 설치하면 질문이 나오지 않습니다. (궁금하시면 그냥 apt install -y php 만 입력해보세요)

// PHP TimeZone 질문 회피
export TZ=Asia/Seoul
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
apt update && apt install -y php-fpm

설치가 끝나고 버전을 확인하니 php 7.2 버전이 설치가 되었네요

composer를 설치하기 위해 curl을 설치합니다.

apt install -y curl

설치한 curl로 composer를 다운받은 후 설치합니다.

curl -sS https://getcomposer.org/installer | php

composer를 전역으로 사용하기 위해 아래 명령어를 사용합니다.

mv composer.phar /usr/bin/composer

이제 composer를 입력하여 정상적으로 설치 된 것을 확인합니다.

이제 laravel을 설치하기 전에 설치 및 구동에 필요한 PHP extension을 설치합니다. PHP 버전이 7.2 이기 때문에 버전에 맞는 extension을 설치합니다.

# laravel 설치에 필요
apt install -y php7.2-zip
# laravel 실행시 필요
apt install -y php7.2-mbstring && apt install -y php7.2-xml

extension이 설치가 완료되면 composer로 laravel을 설치합니다.

composer global require laravel/installer

아래 명령으로 laravel 명령어를 사용할 수 있도록 PATH를 지정합니다.

export PATH=$PATH:~/.composer/vendor/bin/

설치가 완료되면 다시 laravel 프로젝트를 생성하는 new 옵션으로 생성합니다. 아래 그림처럼 laravel 프로젝트에 필요한 많은 것들을 알아서 설치해줍니다

laravel new 프로젝트이름

이제 PHP와 laravel을 준비가 되었습니다. nginx를 설치하고 서비스를 시작합니다. PHP-fpm도 서비스를 시작하겠습니다.

apt install -y nginx
service nginx start
service php7.2-fpm start

처음에 docker의 80번 포트를 host와 공유하기 때문에 이 상태에서 host PC의 크롬에서 localhost에 접속하면 nginx 디폴트 페이지가 뜹니다.

이제 이것을 laravel 디폴트 페이지가 나오도록 작업을 해보겠습니다. apt 명령으로 nginx를 설치하게 되면 /etc/nginx/sites-available/default 파일이 있을 겁니다. 이녀석을 아래와 같이 필요한 부분만 넣어 수정합니다.

server {
listen 80;

server_name example.com;
root /test/public;
index index.php
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

설명이 필요한 부분만 굵게 표시했습니다. 우선 80번 포트를 listen하고 있고 root는 nginx가 바라보는 루트 디렉토리 입니다. test라는 이름의 laravel 프로젝트를 생성했기 때문에 /test/public 으로 경로를 잡았습니다. 참고로 public 디렉토리는 어플리케이션으로 들어오는 request 요청을 처리하는 index.php가 있는 디렉 토리입니다.

index index.php 구문을 안쓰면 localhost/index.php를 입력해야 laravel 페이지가 나오니 넣어줍시다. fastcgi_pass의 경우 /etc/php/ 하위에서 php-fpm 경로를 찾아야 합니다. 제 경우 /etc/php/7.2/fpm/pool.d/www.conf 파일을 보니 아래와 같이 php-fpm.sock 경로를 찾을 수 있었습니다.

fastcgi_pass에는 unix: 를 추가하여 unix:/run/php/php7.2-fpm.sock 경로를 입력합니다. 이대로 실행하면 permisson 에러가 발생합니다. 위의 이미지에서 user 부분이 보이시나요? 생성한 프로젝트로 이동하여 권한을 줍시다.

cd /test
chown -R www-data .

이제 마지막으로 nginx를 재기동합니다.

service nginx restart

이제 host PC에서 localhost에 접속해보면 짠~

--

--