php5.x, nginx 가 설치된 CentOS7 서버에 Docker를 이용하여 php73 및 Laravel 을 설치 후 Docker와 Nginx 연결하기

php, 서버이야기

php 5.5.38에 Legacy Code로 코딩된 다수의 프로젝트들과 nginx 1.16.1
그리고 Aurora RDS를 사용하는 서버에 Laravel(라라벨)을 설치하여 간단한 프로젝트를 진행하기 위한 서버 셋팅 작업입니다.

본 작업에서 핵심은 Docker에 설치한 php73-fpm을 컨테이너 외부로 뻬내고 Composer와 Laravel 설치 후 작업 공간 또한 외부로 빼서 수정된 소스가 도커가 꺼져도 문제 없게 하는 것이다.

  1. 서버(위에서는 외부라고 불린)에 작업공간 생성
  2. docker 및 docker-compose 설치
  3. Dockerfile 생성
  4. docker-compose.yml 생성
  5. Laravel docker build
  6. docker 실행
  7. Laravel 설치
  8. nginx 설정 파일 생성 및 확인
  9. laravel 권한 설정
  10. docker 로그파일 보기
  11. Nginx 재시작 및 확인
  12. 자주 쓰는 명령
  13. 그밖에..

One. 서버에 작업공간 생성

mkdir /home/docker/laravel/html # 원하시는 곳으로 설정하셔도 됩니다.
cd /home/docker/laravel         # 라라벨 도커 및 작업공간이 생성될 위치

Two. docker 및 docker-compose 설치

# 아래 명령은 어디서 해도 상관 없음
sudo yum -y update
sudo yum -y install docker docker-compose

Three. Dockerfile 생성

# 현재 위치 - /home/docker/laravel
vi Dockerfile
------------------------- cut here ----------------------------
# 1. 라라벨 설치를 시작할 도커 이미지
FROM php:7.3-fpm

# 2. 패키지를 구성할 작업공간 및 초기화 작업
WORKDIR /root
RUN apt-get update            
RUN apt-get install -y curl

# 3. Composer 설치
RUN export COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php  
RUN mv composer.phar /usr/bin/composer

# 4. Laravel 설치를 위한 사전작업
RUN apt-get install -y zlib1g-dev && apt-get install -y libzip-dev
RUN docker-php-ext-install zip

# 5. Laravel 설치
RUN composer global require laravel/installer
RUN ["/bin/bash", "-c", "echo PATH=$PATH:~/.composer/vendor/bin/ >> ~/.bashrc"]
RUN ["/bin/bash", "-c", "source ~/.bashrc"]

# 6. 도커 내부에 php-fpm 서비스 포트를 외부로 노출 및 실행
EXPOSE 9000
CMD ["php-fpm"]
------------------------- cut here ----------------------------

Four. docker-compose.yml 생성

# 현재 위치 - /home/docker/laravel
vi docker-compose.yml             #
------------------------- cut here ----------------------------
version: '3'
services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "9090:9000"
    volumes:
      - /home/docker/laravel/html:/var/www/html
------------------------- cut here ----------------------------

부연설명 :
services.php.build.context 는 현재위치
services.php.build.dockerfile은 Dockerfile
services.php.ports: 는 “server:docker(container)” 로 매핑
services.php.volumes 는 “server:docker(container)” 로 매핑

port는 도커에 설치된 php-fpm이 기본값으로 9000 포트에 설치되어 있는데, 이것을 외부로 노출할 로컬서버 9090 포트에 매핑하라는 설정이고

volumes 은 도커에 Laravel이 설치될 기본 위치 /var/www/html 을 도커 내 이미지에 기록하지 말고 서버에 기록되게 하기 위해 /home/docker/laravel/html 에 연결

Five. Laravel docker build

docker-compose build

Six. docker 실행

docker-compose up -d

Seven. Laravel 설치

# 서버에서 실행
docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c4bb303c15c8        laravel_php         "docker-php-entryp..."   2 hours ago         Up 2 hours          0.0.0.0:9090->9000/tcp   laravel_php_1
# 위에 목록에서 컨테이너ID(c4bb303c15c8), 컨테이너명(laravel_php_1)을 입력하여 도커 내부로 진입

docker exec -it 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1) bash

# 여기는 도커 내부입니다.
cd /var/www/html
laravel new .

# 설치가 완료되면 콘트롤 + D 혹은 exit

Eight. nginx 설정 파일 생성 및 확인

# 서버에서 실행
server {
  server_name my.laravel.app;
  # 중요!!! 이 위치는 도커의 웹루트를 기준으로 해야됨
  root  "/var/www/html/public";

  index index.php;
  client_max_body_size 10m;

  access_log /home/docker/laravel/html/_logs/access.log;
  error_log /home/docker/laravel/html/_logs/error.log;
  
  location / {
    try_files $uri $uri/ /index.php$uri?$args;
  }
  
  location ~ "^(.+\.php)($|/)" {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SERVER_NAME $host;
    # 매핑한 9090 포트로 연결
    fastcgi_pass  127.0.0.1:9090;
    include       fastcgi_params;
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
      expires max;
      log_not_found off;
      access_log off;
  }
  
  location ~* \.(html|htm)$ {
    expires 30m;
  }
 
  location ~* /\.(ht|git|svn) {
    deny  all;
  }
}

Nine. Laravel 권한 설정

# 서버
chmod -R 777 /home/docker/laravel/html/storage
chmod -R 777 /home/docker/laravel/html/bootstrap/cache

# 위의 작업은 도커에서는 아래와 같이 하셔도 됨
chown -R www-data.www-data /var/www/html/storage
chown -R www-data.www-data /var/www/html/bootstrap/cache

Ten. docker 로그파일 보기

# 서버 /home/docker/laravel 위치에서
docker logs -ft 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1)

Eleven. nginx 재시작 및 확인

nginx -t 로 설정을 체크 하고
sudo systemctl restart nginx

Twelve. 자주 쓰는 명령

# 서버에서 실행
# 도커 종료(/home/docker/laravel 위치에서)
docker-compose down

# 도커 이미지 목록
docker images

# 도커 이미지 삭제
docker rmi 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1)

# 실행 중인 도커 목록
docker ps -a

# 실행 중인 도커 목록 중지
docker stop $(docker ps -aq)

Comment

Docker 내부에 npm을 설치해도 되고 서버에 있는 npm 을 공유해서 사용해도 되는데 편하신 방법을 사용하시면 됩니다.

가끔 public 내부에 css, js 폴더에 접근 안되는 경우가 있는데, 이럴때는 소스 지우고 laravel new project 에서 부터 다시 시작해보시기 바랍니다.

Dockerfile 내에 npm 을 설치하고 싶을 때는 Dockerfile 안에 RUN apt-get install -y npm 을 넣어주세요.

설치 후 vue 및 css, js 를 빌드 하는 방법은 아래 명령을 확인하세요.

# 도커 안에서
composer require laravel/ui
php artisan ui vue —auth

# 도커 안에서 해도 되고 서버에서 해도됨 (위치는 package.json 파일이 위치한곳)
npm install && npm run dev

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.