웹사이트 검색

Docker Compose로 Laravel, Nginx 및 MySQL을 설정하는 방법


작성자는 DOnations 프로그램에 쓰기를 선택했습니다.

소개

지난 몇 년 동안 Laravel 프레임워크, Docker는 설정 프로세스를 상당히 간소화할 수 있었습니다.

Docker Compose는 개발자가 애플리케이션 서비스, 네트워크 및 볼륨을 포함한 인프라를 단일 파일로 정의할 수 있도록 하여 개발 프로세스를 더욱 간소화했습니다. Docker Compose는 여러 docker container createdocker container run 명령 실행에 대한 효율적인 대안을 제공합니다.

이 튜토리얼에서는 Nginx를 웹 서버로, MySQL을 데이터베이스로 사용하여 Laravel 프레임워크를 사용하여 Docker 컨테이너 내부에 있는 웹 애플리케이션을 빌드합니다. PHP, MySQL 및 Nginx용 구성 파일과 함께 docker-compose 파일에서 전체 스택 구성을 정의합니다.

전제 조건

시작하기 전에 다음이 필요합니다.

  • 하나의 Ubuntu 18.04 서버 및 sudo 권한이 있는 루트가 아닌 사용자. 이를 설정하려면 Ubuntu 18.04 자습서로 초기 서버 설정을 따르십시오.
  • Ubuntu 18.04에서 Docker를 설치하고 사용하는 방법의 1단계와 2단계에 따라 Docker가 설치되었습니다.
  • Ubuntu 18.04에 Docker Compose를 설치하는 방법의 1단계에 따라 Docker Compose가 설치되었습니다.

1단계 — Laravel 다운로드 및 종속성 설치

첫 번째 단계로 최신 버전의 Laravel을 다운로드하고 PHP용 애플리케이션 수준 패키지 관리자인 Composer를 포함하여 프로젝트의 종속 항목을 설치합니다. Composer를 전역적으로 설치하지 않도록 Docker와 함께 이러한 종속성을 설치합니다.

먼저 홈 디렉토리에 있는지 확인하고 최신 Laravel 릴리스를 laravel-app라는 디렉토리에 복제합니다.

  1. cd ~
  2. git clone https://github.com/laravel/laravel.git laravel-app

laravel-app 디렉토리로 이동합니다:

  1. cd ~/laravel-app

다음으로 Docker의 composer 이미지를 사용하여 Laravel 프로젝트에 필요한 디렉토리를 마운트하고 Composer를 전체적으로 설치하는 오버헤드를 피하십시오.

  1. docker run --rm -v $(pwd):/app composer install

-v--rm 플래그를 docker run과 함께 사용하면 제거되기 전에 현재 디렉터리에 바인드 마운트될 임시 컨테이너가 생성됩니다. . 이렇게 하면 ~/laravel-app 디렉토리의 내용이 컨테이너에 복사되고 Composer가 컨테이너 내부에 생성하는 vendor 폴더가 현재 디렉터리에 복사됩니다.

마지막 단계로 루트가 아닌 사용자가 소유하도록 프로젝트 디렉토리에 대한 권한을 설정합니다.

  1. sudo chown -R $USER:$USER ~/laravel-app

이는 4단계에서 애플리케이션 이미지에 대한 Dockerfile을 작성할 때 중요합니다. 이를 통해 루트가 아닌 사용자로 애플리케이션 코드로 작업하고 컨테이너에서 프로세스를 실행할 수 있기 때문입니다.

애플리케이션 코드가 준비되면 Docker Compose를 사용하여 서비스 정의로 이동할 수 있습니다.

2단계 — Docker Compose 파일 생성

Docker Compose로 애플리케이션을 빌드하면 인프라 설정 및 버전 관리 프로세스가 간소화됩니다. Laravel 애플리케이션을 설정하기 위해 웹 서버, 데이터베이스 및 애플리케이션 서비스를 정의하는 docker-compose 파일을 작성합니다.

파일 열기:

  1. nano ~/laravel-app/docker-compose.yml

docker-compose 파일에서 app, webserverdb의 세 가지 서비스를 정의합니다. db 서비스에서 환경 변수로 정의된 MYSQL_ROOT_PASSWORD의 루트 암호를 선택한 강력한 암호로 바꾸면서 파일에 다음 코드를 추가합니다.

version: '3'
services:
  
  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: linux-console.net/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

여기에 정의된 서비스는 다음과 같습니다.

  • app: 이 서비스 정의는 Laravel 애플리케이션을 포함하고 4단계에서 정의할 맞춤형 Docker 이미지인 linux-console.net/php를 실행합니다. 또한 설정합니다. 컨테이너의 working_dir/var/www로 복사합니다.
  • webserver: 이 서비스 정의는 Docker에서 nginx:alpine 이미지를 가져오고 포트 80443을 노출합니다. .
  • db: 이 서비스 정의는 Docker에서 mysql:5.7.22 이미지를 가져오고 laravel이라는 데이터베이스를 포함하여 몇 가지 환경 변수를 정의합니다. 는 애플리케이션용이고 데이터베이스의 루트 비밀번호입니다. 원하는 대로 데이터베이스 이름을 지정할 수 있으며 your_mysql_root_password를 자신의 강력한 암호로 바꿔야 합니다. 이 서비스 정의는 또한 호스트의 포트 3306을 컨테이너의 포트 3306에 매핑합니다.

container_name 속성은 서비스 이름에 해당하는 컨테이너의 이름을 정의합니다. 이 속성을 정의하지 않으면 Docker는 역사적으로 유명한 사람의 이름과 밑줄로 구분된 임의의 단어를 결합하여 각 컨테이너에 이름을 할당합니다.

컨테이너 간의 통신을 용이하게 하기 위해 서비스는 app-network라는 브리지 네트워크에 연결됩니다. 브리지 네트워크는 동일한 브리지 네트워크에 연결된 컨테이너가 서로 통신할 수 있도록 하는 소프트웨어 브리지를 사용합니다. 브리지 드라이버는 서로 다른 브리지 네트워크의 컨테이너가 서로 직접 통신할 수 없도록 호스트 시스템에 규칙을 자동으로 설치합니다. 이것은 응용 프로그램에 대한 더 높은 수준의 보안을 생성하여 관련 서비스만 서로 통신할 수 있도록 합니다. 또한 관련 기능에 연결하는 여러 네트워크 및 서비스를 정의할 수 있음을 의미합니다. 예를 들어 프런트 엔드 애플리케이션 서비스는 프론트엔드 네트워크를 사용할 수 있고 백엔드 서비스는 백엔드 네트워크.

애플리케이션 데이터를 유지하기 위해 서비스 정의에 볼륨을 추가하고 마운트를 바인딩하는 방법을 살펴보겠습니다.

3단계 - 데이터 지속

Docker에는 데이터 지속을 위한 강력하고 편리한 기능이 있습니다. 우리 응용 프로그램에서는 데이터베이스, 응용 프로그램 및 구성 파일을 유지하기 위해 바인드 마운트를 사용할 것입니다. 볼륨은 컨테이너의 수명 주기를 넘어선 백업 및 지속성을 위한 유연성을 제공하는 반면 바인드 마운트는 개발 중 코드 변경을 용이하게 하여 컨테이너에서 즉시 사용할 수 있는 호스트 파일 또는 디렉토리를 변경합니다. 우리의 설정은 둘 다 사용할 것입니다.

경고: 바인드 마운트를 사용하면 중요한 시스템 파일 또는 디렉토리 생성, 수정 또는 삭제를 포함하여 컨테이너에서 실행되는 프로세스를 통해 호스트 파일 시스템을 변경할 수 있습니다. 이는 보안에 영향을 미치는 강력한 기능이며 호스트 시스템의 비 Docker 프로세스에 영향을 줄 수 있습니다. 바인드 마운트를 주의하여 사용하십시오.

docker-compose 파일에서 db 서비스 정의 아래에 dbdata라는 볼륨을 정의하여 MySQL 데이터베이스를 유지합니다.

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
  ...

명명된 볼륨 dbdata는 컨테이너 내부에 있는 /var/lib/mysql 폴더의 내용을 유지합니다. 이를 통해 데이터 손실 없이 db 서비스를 중지했다가 다시 시작할 수 있습니다.

파일 맨 아래에 dbdata 볼륨에 대한 정의를 추가합니다.

...
#Volumes
volumes:
  dbdata:
    driver: local

이 정의를 적용하면 서비스 간에 이 볼륨을 사용할 수 있습니다.

다음으로 7단계에서 생성할 MySQL 구성 파일의 db 서비스에 바인드 마운트를 추가합니다.

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
  ...

이 바인딩 마운트는 ~/laravel-app/mysql/my.cnf를 컨테이너의 /etc/mysql/my.cnf에 바인딩합니다.

다음으로 바인드 마운트를 webserver 서비스에 추가합니다. 두 가지가 있습니다. 하나는 애플리케이션 코드용이고 다른 하나는 6단계에서 생성할 Nginx 구성 정의용입니다.

#Nginx Service
webserver:
  ...
  volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
  networks:
      - app-network

첫 번째 바인딩 마운트는 ~/laravel-app 디렉토리의 애플리케이션 코드를 컨테이너 내부의 /var/www 디렉토리에 바인딩합니다. ~/laravel-app/nginx/conf.d/에 추가할 구성 파일은 다음의 /etc/nginx/conf.d/에도 마운트됩니다. 필요에 따라 구성 디렉터리의 내용을 추가하거나 수정할 수 있습니다.

마지막으로 애플리케이션 코드 및 구성 파일에 대한 app 서비스에 다음 바인드 마운트를 추가합니다.

#PHP Service
app:
  ...
  volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
  networks:
      - app-network

app 서비스는 애플리케이션 코드가 포함된 ~/laravel-app 폴더를 /var/www 폴더에 바인드 마운트합니다. 컨테이너. 이렇게 하면 로컬 애플리케이션 디렉토리에 대한 모든 변경 사항이 컨테이너 내부에 즉시 반영되므로 개발 프로세스 속도가 빨라집니다. 또한 PHP 구성 파일 ~/laravel-app/php/local.ini/usr/local/etc/php/conf.d/local.ini 컨테이너 내부. 5단계에서 로컬 PHP 구성 파일을 생성합니다.

이제 docker-compose 파일이 다음과 같이 표시됩니다.

version: '3'
services:
  
  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: linux-console.net/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

변경을 완료하면 파일을 저장하고 편집기를 종료하십시오.

docker-compose 파일이 작성되었으므로 이제 애플리케이션의 사용자 지정 이미지를 빌드할 수 있습니다.

4단계 — Dockerfile 만들기

Docker를 사용하면 Dockerfile을 사용하여 개별 컨테이너 내부의 환경을 지정할 수 있습니다. Dockerfile을 사용하면 애플리케이션에 필요한 소프트웨어를 설치하고 요구 사항에 따라 설정을 구성하는 데 사용할 수 있는 사용자 지정 이미지를 생성할 수 있습니다. 생성한 사용자 지정 이미지를 Docker Hub 또는 프라이빗 레지스트리로 푸시할 수 있습니다.

Dockerfile~/laravel-app 디렉토리에 있습니다. 파일을 만듭니다.

  1. nano ~/laravel-app/Dockerfile

Dockerfile은 기본 이미지를 설정하고 Laravel 애플리케이션 이미지를 빌드하는 데 필요한 명령과 지침을 지정합니다. 파일에 다음 코드를 추가합니다.

FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

먼저 Dockerfile은 설치된 PHP-FPM 위에 이미지를 생성합니다. 이 파일은 또한 Laravel: mcrypt, pdo_mysql, mbstringimagick에 대한 필수 패키지를 와 함께 설치합니다. 작곡가.

RUN 지시문은 www라는 전용 사용자 및 그룹 생성을 포함하여 컨테이너 내부 설정을 업데이트, 설치 및 구성하는 명령을 지정합니다. WORKDIR 명령어는 /var/www 디렉토리를 애플리케이션의 작업 디렉토리로 지정합니다.

제한된 권한을 가진 전용 사용자 및 그룹을 생성하면 기본적으로 루트로 실행되는 Docker 컨테이너를 실행할 때 내재된 취약성이 완화됩니다. 이 컨테이너를 루트로 실행하는 대신 COPY 명령 덕분에 /var/www 폴더에 대한 읽기/쓰기 액세스 권한이 있는 www 사용자를 만들었습니다. 애플리케이션 폴더의 권한을 복사하기 위해 --chown 플래그와 함께 사용하고 있습니다.

마지막으로 EXPOSE 명령은 php-fpm 서버용 컨테이너 9000의 포트를 노출합니다. CMD는 컨테이너가 생성되면 실행해야 하는 명령을 지정합니다. 여기서 CMD는 서버를 시작할 \php-fpm\을 지정합니다.

변경을 완료하면 파일을 저장하고 편집기를 종료하십시오.

이제 PHP 구성 정의로 이동할 수 있습니다.

5단계 - PHP 구성

이제 docker-compose 파일에서 인프라를 정의했으므로 Nginx에서 들어오는 요청에 대해 PHP 프로세서 역할을 하도록 PHP 서비스를 구성할 수 있습니다.

PHP를 구성하려면 php 폴더 안에 local.ini 파일을 만듭니다. 이것은 2단계에서 컨테이너 내부의 /usr/local/etc/php/conf.d/local.ini에 바인드 마운트한 파일입니다. 이 파일을 생성하면 기본값을 재정의할 수 있습니다. PHP가 시작할 때 읽는 php.ini 파일.

php 디렉토리를 생성합니다:

  1. mkdir ~/laravel-app/php

다음으로 local.ini 파일을 엽니다.

  1. nano ~/laravel-app/php/local.ini

PHP를 구성하는 방법을 시연하기 위해 다음 코드를 추가하여 업로드된 파일의 크기 제한을 설정합니다.

upload_max_filesize=40M
post_max_size=40M

upload_max_filesizepost_max_size 지시문은 업로드된 파일에 허용되는 최대 크기를 설정하고 에서 php.ini 구성을 설정하는 방법을 보여줍니다. local.ini 파일. 재정의하려는 모든 PHP 관련 구성을 local.ini 파일에 넣을 수 있습니다.

파일을 저장하고 편집기를 종료하십시오.

PHP local.ini 파일이 있으면 Nginx 구성으로 이동할 수 있습니다.

6단계 - Nginx 구성

PHP 서비스가 구성되면 PHP-FPM을 FastCGI 서버로 사용하여 동적 콘텐츠를 제공하도록 Nginx 서비스를 수정할 수 있습니다. FastCGI 서버는 대화형 프로그램을 웹 서버와 인터페이스하기 위한 바이너리 프로토콜을 기반으로 합니다. 자세한 내용은 Nginx에서 FastCGI 프록싱 이해 및 구현에 대한 이 문서를 참조하십시오.

Nginx를 구성하려면 ~/laravel-app/nginx/conf.d/ 폴더에 서비스 구성이 포함된 app.conf 파일을 생성합니다.

먼저 nginx/conf.d/ 디렉토리를 만듭니다.

  1. mkdir -p ~/laravel-app/nginx/conf.d

다음으로 app.conf 구성 파일을 만듭니다.

  1. nano ~/laravel-app/nginx/conf.d/app.conf

파일에 다음 코드를 추가하여 Nginx 구성을 지정합니다.

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

서버 블록은 다음 지시문을 사용하여 Nginx 웹 서버에 대한 구성을 정의합니다.

  • listen: 이 지시문은 서버가 들어오는 요청을 수신할 포트를 정의합니다.
  • error_logaccess_log: 이 지시문은 로그 작성을 위한 파일을 정의합니다.
  • root: 이 지시문은 루트 폴더 경로를 설정하여 로컬 파일 시스템에서 요청된 파일의 전체 경로를 형성합니다.

php 위치 블록에서 fastcgi_pass 지시문은 app 서비스가 포트 9000 의 TCP 소켓에서 수신 중임을 지정합니다. . 이렇게 하면 PHP-FPM 서버가 Unix 소켓이 아닌 네트워크를 통해 수신하게 됩니다. Unix 소켓은 TCP 소켓보다 속도면에서 약간의 이점이 있지만 네트워크 프로토콜이 없으므로 네트워크 스택을 건너뜁니다. 호스트가 한 시스템에 있는 경우 Unix 소켓이 적합할 수 있지만 다른 호스트에서 실행 중인 서비스가 있는 경우에는 TCP 소켓이 분산 서비스에 연결할 수 있는 이점을 제공합니다. app 컨테이너가 webserver 컨테이너와 다른 호스트에서 실행되기 때문에 TCP 소켓이 구성에 가장 적합합니다.

변경을 완료하면 파일을 저장하고 편집기를 종료하십시오.

2단계에서 생성한 바인드 마운트 덕분에 nginx/conf.d/ 폴더 내에서 변경한 사항은 webserver 컨테이너 내부에 직접 반영됩니다.

다음으로 MySQL 설정을 살펴보겠습니다.

7단계 - MySQL 구성

PHP와 Nginx가 구성되면 MySQL이 애플리케이션의 데이터베이스 역할을 하도록 할 수 있습니다.

MySQL을 구성하려면 mysql 폴더에 my.cnf 파일을 생성합니다. 이것은 2단계에서 컨테이너 내부의 /etc/mysql/my.cnf에 바인드 마운트한 파일입니다. 이 바인드 마운트를 사용하면 my.cnf를 재정의할 수 있습니다. 필요에 따라 설정합니다.

이것이 어떻게 작동하는지 보여주기 위해 일반 쿼리 로그를 활성화하고 로그 파일을 지정하는 설정을 my.cnf 파일에 추가합니다.

먼저 mysql 디렉터리를 만듭니다.

  1. mkdir ~/laravel-app/mysql

다음으로 my.cnf 파일을 만듭니다.

  1. nano ~/laravel-app/mysql/my.cnf

파일에서 다음 코드를 추가하여 쿼리 로그를 활성화하고 로그 파일 위치를 설정합니다.

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

my.cnf 파일은 일반 로그를 허용하도록 general_log 설정을 1로 정의하여 로그를 활성화합니다. general_log_file 설정은 로그가 저장될 위치를 지정합니다.

파일을 저장하고 편집기를 종료하십시오.

다음 단계는 컨테이너를 시작하는 것입니다.

8단계 - 환경 설정 수정 및 컨테이너 실행

이제 docker-compose 파일에서 모든 서비스를 정의하고 이러한 서비스에 대한 구성 파일을 만들었으므로 컨테이너를 시작할 수 있습니다. 하지만 마지막 단계로 Laravel이 기본적으로 포함하는 .env.example 파일의 복사본을 만들고 복사본 이름을 .env로 지정합니다. 환경을 정의할 것으로 예상합니다.

  1. cp .env.example .env

이제 app 컨테이너의 .env 파일을 수정하여 설정에 대한 특정 세부 정보를 포함할 수 있습니다.

nano 또는 선택한 텍스트 편집기를 사용하여 파일을 엽니다.

  1. nano .env

DB_CONNECTION을 지정하는 블록을 찾아 설정의 세부 사항을 반영하도록 업데이트하십시오. 다음 필드를 수정합니다.

  • DB_HOSTdb 데이터베이스 컨테이너가 됩니다.
  • DB_DATABASElaravel 데이터베이스가 됩니다.
  • DB_USERNAME은 데이터베이스에 사용할 사용자 이름입니다. 이 경우 laraveluser를 사용합니다.
  • DB_PASSWORD는 이 사용자 계정에 사용할 보안 비밀번호입니다.

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

변경 사항을 저장하고 편집기를 종료합니다.

docker-compose 파일에 모든 서비스가 정의되어 있으므로 단일 명령을 실행하여 모든 컨테이너를 시작하고, 볼륨을 생성하고, 네트워크를 설정 및 연결하기만 하면 됩니다.

  1. docker-compose up -d

처음으로 docker-compose up을 실행하면 필요한 모든 Docker 이미지가 다운로드되며 시간이 걸릴 수 있습니다. 이미지가 다운로드되어 로컬 머신에 저장되면 Compose가 컨테이너를 생성합니다. -d 플래그는 프로세스를 데몬화하여 백그라운드에서 컨테이너를 실행합니다.

프로세스가 완료되면 다음 명령을 사용하여 실행 중인 모든 컨테이너를 나열합니다.

  1. docker ps

app, webserverdb 컨테이너에 대한 세부 정보가 포함된 다음 출력이 표시됩니다.

Output
CONTAINER ID NAMES IMAGE STATUS PORTS c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp ed5a69704580 app linux-console.net/php Up 2 seconds 9000/tcp 5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

이 출력의 CONTAINER ID는 각 컨테이너의 고유 식별자이며 NAMES는 각각과 관련된 서비스 이름을 나열합니다. 이 두 식별자를 모두 사용하여 컨테이너에 액세스할 수 있습니다. IMAGE는 각 컨테이너의 이미지 이름을 정의하고 STATUS는 컨테이너의 상태(실행 중, 다시 시작 중 또는 중지됨)에 대한 정보를 제공합니다.

이제 docker-compose exec를 사용하여 Laravel 애플리케이션의 애플리케이션 키를 설정합니다. docker-compose exec 명령을 사용하면 컨테이너에서 특정 명령을 실행할 수 있습니다.

다음 명령은 키를 생성하고 .env 파일에 복사하여 사용자 세션과 암호화된 데이터가 안전하게 유지되도록 합니다.

  1. docker-compose exec app php artisan key:generate

이제 애플리케이션을 실행하는 데 필요한 환경 설정이 있습니다. 이러한 설정을 파일에 캐시하여 애플리케이션의 로드 속도를 높이려면 다음을 실행하십시오.

  1. docker-compose exec app php artisan config:cache

구성 설정은 컨테이너의 /var/www/bootstrap/cache/config.php에 로드됩니다.

마지막 단계로 브라우저에서 http://your_server_ip를 방문합니다. Laravel 애플리케이션에 대한 다음 홈페이지가 표시됩니다.

컨테이너가 실행되고 구성 정보가 준비되면 db 컨테이너에서 laravel 데이터베이스에 대한 사용자 정보 구성으로 이동할 수 있습니다.

9단계 - MySQL용 사용자 생성

기본 MySQL 설치는 데이터베이스 서버에 대한 무제한 권한이 있는 루트 관리 계정만 생성합니다. 일반적으로 데이터베이스와 상호 작용할 때 루트 관리 계정을 사용하지 않는 것이 좋습니다. 대신 우리 애플리케이션의 Laravel 데이터베이스를 위한 전용 데이터베이스 사용자를 생성해 보겠습니다.

새 사용자를 생성하려면 docker-compose exec를 사용하여 db 컨테이너에서 대화형 bash 셸을 실행합니다.

  1. docker-compose exec db bash

컨테이너 내에서 MySQL 루트 관리 계정에 로그인합니다.

  1. mysql -u root -p

docker-compose 파일에 설치하는 동안 MySQL 루트 계정에 대해 설정한 암호를 입력하라는 메시지가 표시됩니다.

docker-compose 파일에서 정의한 laravel이라는 데이터베이스를 확인하여 시작합니다. show databases 명령을 실행하여 기존 데이터베이스를 확인합니다.

  1. show databases;

출력에 나열된 laravel 데이터베이스를 볼 수 있습니다.

Output
+--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)

다음으로 이 데이터베이스에 액세스할 수 있는 사용자 계정을 만듭니다. 사용자 이름은 laraveluser이지만 원하는 경우 다른 이름으로 바꿀 수 있습니다. 여기서 사용자 이름과 암호가 이전 단계에서 .env 파일에 설정한 세부 정보와 일치하는지 확인하십시오.

  1. GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

변경 사항을 MySQL 서버에 알리기 위해 권한을 플러시합니다.

  1. FLUSH PRIVILEGES;

MySQL 종료:

  1. EXIT;

마지막으로 컨테이너를 종료합니다.

  1. exit

Laravel 애플리케이션 데이터베이스에 대한 사용자 계정을 구성했으며 데이터를 마이그레이션하고 Tinker 콘솔로 작업할 준비가 되었습니다.

10단계 - 데이터 마이그레이션 및 Tinker 콘솔 작업

애플리케이션을 실행하면서 tinker 명령으로 데이터를 마이그레이션하고 실험할 수 있습니다. 그러면 Laravel이 사전 로드된 PsySH 콘솔이 시작됩니다. PsySH는 PHP용 런타임 개발자 콘솔이자 대화형 디버거이며 Tinker는 Laravel 전용 REPL입니다. tinker 명령을 사용하면 대화형 쉘의 명령줄에서 Laravel 애플리케이션과 상호작용할 수 있습니다.

먼저 컨테이너 내부에서 데이터베이스에 migrations 테이블을 생성하는 Laravel artisan migrate 명령을 실행하여 MySQL에 대한 연결을 테스트합니다.

  1. docker-compose exec app php artisan migrate

이 명령은 기본 Laravel 테이블을 마이그레이션합니다. 마이그레이션을 확인하는 출력은 다음과 같습니다.

Output
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table

마이그레이션이 완료되면 쿼리를 실행하여 tinker 명령을 사용하여 데이터베이스에 제대로 연결되었는지 확인할 수 있습니다.

  1. docker-compose exec app php artisan tinker

방금 마이그레이션한 데이터를 가져와 MySQL 연결을 테스트합니다.

  1. \DB::table('migrations')->get();

다음과 같은 출력이 표시됩니다.

Output
=> Illuminate\Support\Collection {#2856 all: [ {#2862 +"id": 1, +"migration": "2014_10_12_000000_create_users_table", +"batch": 1, }, {#2865 +"id": 2, +"migration": "2014_10_12_100000_create_password_resets_table", +"batch": 1, }, ], }

tinker를 사용하여 데이터베이스와 상호 작용하고 서비스 및 모델을 실험할 수 있습니다.

Laravel 애플리케이션이 준비되면 추가 개발 및 실험을 할 준비가 된 것입니다.

결론

이제 Laravel 시작 페이지에 액세스하고 MySQL 데이터베이스 마이그레이션을 생성하여 테스트한 LEMP 스택 애플리케이션이 서버에서 실행 중입니다.

이 설치의 핵심은 단일 명령으로 단일 파일에 정의된 Docker 컨테이너 그룹을 생성할 수 있는 Docker Compose입니다. Docker Compose로 CI를 수행하는 방법에 대해 자세히 알아보려면 How to Automatically Deploy Laravel Applications with Deployer on Ubuntu 16.04가 관련 리소스가 될 것입니다.