Docker Compose로 Laravel, Nginx 및 MySQL을 설정하는 방법
작성자는 DOnations 프로그램에 쓰기를 선택했습니다.
소개
지난 몇 년 동안 Laravel 프레임워크, Docker는 설정 프로세스를 상당히 간소화할 수 있었습니다.
Docker Compose는 개발자가 애플리케이션 서비스, 네트워크 및 볼륨을 포함한 인프라를 단일 파일로 정의할 수 있도록 하여 개발 프로세스를 더욱 간소화했습니다. Docker Compose는 여러 docker container create
및 docker 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
라는 디렉토리에 복제합니다.
- cd ~
- git clone https://github.com/laravel/laravel.git laravel-app
laravel-app
디렉토리로 이동합니다:
- cd ~/laravel-app
다음으로 Docker의 composer
이미지를 사용하여 Laravel 프로젝트에 필요한 디렉토리를 마운트하고 Composer를 전체적으로 설치하는 오버헤드를 피하십시오.
- docker run --rm -v $(pwd):/app composer install
-v
및 --rm
플래그를 docker run
과 함께 사용하면 제거되기 전에 현재 디렉터리에 바인드 마운트될 임시 컨테이너가 생성됩니다. . 이렇게 하면 ~/laravel-app
디렉토리의 내용이 컨테이너에 복사되고 Composer가 컨테이너 내부에 생성하는 vendor
폴더가 현재 디렉터리에 복사됩니다.
마지막 단계로 루트가 아닌 사용자가 소유하도록 프로젝트 디렉토리에 대한 권한을 설정합니다.
- sudo chown -R $USER:$USER ~/laravel-app
이는 4단계에서 애플리케이션 이미지에 대한 Dockerfile을 작성할 때 중요합니다. 이를 통해 루트가 아닌 사용자로 애플리케이션 코드로 작업하고 컨테이너에서 프로세스를 실행할 수 있기 때문입니다.
애플리케이션 코드가 준비되면 Docker Compose를 사용하여 서비스 정의로 이동할 수 있습니다.
2단계 — Docker Compose 파일 생성
Docker Compose로 애플리케이션을 빌드하면 인프라 설정 및 버전 관리 프로세스가 간소화됩니다. Laravel 애플리케이션을 설정하기 위해 웹 서버, 데이터베이스 및 애플리케이션 서비스를 정의하는 docker-compose
파일을 작성합니다.
파일 열기:
- nano ~/laravel-app/docker-compose.yml
docker-compose
파일에서 app
, webserver
및 db
의 세 가지 서비스를 정의합니다. 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
이미지를 가져오고 포트80
및443
을 노출합니다. .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
디렉토리에 있습니다. 파일을 만듭니다.
- 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
, mbstring
및 imagick
에 대한 필수 패키지를 와 함께 설치합니다. 작곡가
.
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
디렉토리를 생성합니다:
- mkdir ~/laravel-app/php
다음으로 local.ini
파일을 엽니다.
- nano ~/laravel-app/php/local.ini
PHP를 구성하는 방법을 시연하기 위해 다음 코드를 추가하여 업로드된 파일의 크기 제한을 설정합니다.
upload_max_filesize=40M
post_max_size=40M
upload_max_filesize
및 post_max_size
지시문은 업로드된 파일에 허용되는 최대 크기를 설정하고 에서
파일. 재정의하려는 모든 PHP 관련 구성을 php.ini
구성을 설정하는 방법을 보여줍니다. local.inilocal.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/
디렉토리를 만듭니다.
- mkdir -p ~/laravel-app/nginx/conf.d
다음으로 app.conf
구성 파일을 만듭니다.
- 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_log
및access_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
디렉터리를 만듭니다.
- mkdir ~/laravel-app/mysql
다음으로 my.cnf
파일을 만듭니다.
- 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
로 지정합니다. 환경을 정의할 것으로 예상합니다.
- cp .env.example .env
이제 app
컨테이너의 .env
파일을 수정하여 설정에 대한 특정 세부 정보를 포함할 수 있습니다.
nano
또는 선택한 텍스트 편집기를 사용하여 파일을 엽니다.
- nano .env
DB_CONNECTION
을 지정하는 블록을 찾아 설정의 세부 사항을 반영하도록 업데이트하십시오. 다음 필드를 수정합니다.
DB_HOST
는db
데이터베이스 컨테이너가 됩니다.DB_DATABASE
는laravel
데이터베이스가 됩니다.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
파일에 모든 서비스가 정의되어 있으므로 단일 명령을 실행하여 모든 컨테이너를 시작하고, 볼륨을 생성하고, 네트워크를 설정 및 연결하기만 하면 됩니다.
- docker-compose up -d
처음으로 docker-compose up
을 실행하면 필요한 모든 Docker 이미지가 다운로드되며 시간이 걸릴 수 있습니다. 이미지가 다운로드되어 로컬 머신에 저장되면 Compose가 컨테이너를 생성합니다. -d
플래그는 프로세스를 데몬화하여 백그라운드에서 컨테이너를 실행합니다.
프로세스가 완료되면 다음 명령을 사용하여 실행 중인 모든 컨테이너를 나열합니다.
- docker ps
app
, webserver
및 db
컨테이너에 대한 세부 정보가 포함된 다음 출력이 표시됩니다.
OutputCONTAINER 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
파일에 복사하여 사용자 세션과 암호화된 데이터가 안전하게 유지되도록 합니다.
- docker-compose exec app php artisan key:generate
이제 애플리케이션을 실행하는 데 필요한 환경 설정이 있습니다. 이러한 설정을 파일에 캐시하여 애플리케이션의 로드 속도를 높이려면 다음을 실행하십시오.
- 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 셸을 실행합니다.
- docker-compose exec db bash
컨테이너 내에서 MySQL 루트 관리 계정에 로그인합니다.
- mysql -u root -p
docker-compose
파일에 설치하는 동안 MySQL 루트 계정에 대해 설정한 암호를 입력하라는 메시지가 표시됩니다.
docker-compose
파일에서 정의한 laravel
이라는 데이터베이스를 확인하여 시작합니다. show databases
명령을 실행하여 기존 데이터베이스를 확인합니다.
- show databases;
출력에 나열된 laravel
데이터베이스를 볼 수 있습니다.
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
다음으로 이 데이터베이스에 액세스할 수 있는 사용자 계정을 만듭니다. 사용자 이름은 laraveluser
이지만 원하는 경우 다른 이름으로 바꿀 수 있습니다. 여기서 사용자 이름과 암호가 이전 단계에서 .env
파일에 설정한 세부 정보와 일치하는지 확인하십시오.
- GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';
변경 사항을 MySQL 서버에 알리기 위해 권한을 플러시합니다.
- FLUSH PRIVILEGES;
MySQL 종료:
- EXIT;
마지막으로 컨테이너를 종료합니다.
- exit
Laravel 애플리케이션 데이터베이스에 대한 사용자 계정을 구성했으며 데이터를 마이그레이션하고 Tinker 콘솔로 작업할 준비가 되었습니다.
10단계 - 데이터 마이그레이션 및 Tinker 콘솔 작업
애플리케이션을 실행하면서 tinker
명령으로 데이터를 마이그레이션하고 실험할 수 있습니다. 그러면 Laravel이 사전 로드된 PsySH 콘솔이 시작됩니다. PsySH는 PHP용 런타임 개발자 콘솔이자 대화형 디버거이며 Tinker는 Laravel 전용 REPL입니다. tinker
명령을 사용하면 대화형 쉘의 명령줄에서 Laravel 애플리케이션과 상호작용할 수 있습니다.
먼저 컨테이너 내부에서 데이터베이스에 migrations
테이블을 생성하는 Laravel artisan migrate
명령을 실행하여 MySQL에 대한 연결을 테스트합니다.
- 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
명령을 사용하여 데이터베이스에 제대로 연결되었는지 확인할 수 있습니다.
- docker-compose exec app php artisan tinker
방금 마이그레이션한 데이터를 가져와 MySQL 연결을 테스트합니다.
- \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가 관련 리소스가 될 것입니다.