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 pdo_mysql mysqli

# 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 및 MySQL 포트를 외부로 노출 및 실행
EXPOSE 9000 3306
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"
      - "3306:3306"
    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 포트에 매핑하라는 설정이고

MySQL 포트는 3306 에서 3306 으로 매핑하겠다는 설정이며

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

추가적으로, vscode (Visual Studio Code)의 Laravel Extension Pack 을 설치하여 쓰실 경우 도커 볼륨의 위치를 /root 로 할 경우 원할하게 이용할 수 있다.
(이거 완전 꿀팁 방출임. 자그만치 3일을 고생해서 찾은거, 하지만 resource 들이 로딩 않될 수도 있다.)
– 조건 : remote docker 에 laravel 설치되어 있고 로컬에서 remote ssh 로 접근하여 소스 수정을 하는 경우 (쉽지 않은 개발환경)
조건 : Artisan Docker Enable = true
Artisan Docker Command = docker exec app_name(ex:laravel_php_1)

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 폴더에 접근 안되는 경우가 있는데, 이 경우 라라벨이 설치된 디렉토리 혹은 부모들의 디렉토리에 읽기 권한이 없는 경우이니, 퍼미션을 755로 맞춰주면 됩니다.
– 이 부분이 계속 문제가 되서 확실한것이 없습니다.
– 현재 성공한 설정은 도커 내부의 라라벨 소스의 위치가 /var/www/html/src1/public , /var/www/html/src2/public 와 같이 html 아래 소스 디렉토리가 위치할 경우 성공함
– 실패한 설정은 아래와 같은 디렉토리에서 실패를 함.
/root/public
/home/public
/home/src/public
/home/src/public_html/public
/home/src/public_html/html/src/public

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

Comment II

Laravel에서 메일 전송을 위해 sendmail 을 사용할 예정이라면 3가지만 생각하시면 됩니다.
1. Sendmail 설치 – RUN apt-get install -y sendmail
2. php에 sendmail 활성화 – sendmail_path = “/usr/sbin/sendmail -t -i”
3. /etc/hosts 파일에 서버에서 사용하는 도메인 등록 – 127.0.0.1 localhost localhost.localdomain user.domainName
172.18.0.2 8b122d145e7d localhost.localdomain user.domainName
1, 2번은 바로 확인이 되며 동작을 하지 않지만
3번의 경우는 1분의 딜레이 후 발송되는 사례이니 삽질 시 참고하시기 바랍니다.

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

  1. If you don t have a lot of experience with Nginx, this is what we define here index.html will be our default index, the server name is php-docker.local and it should be pointing

댓글 남기기

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

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