Docker, Laravel · 7 min read · Nov 25, 2025

우분투 18.04 LTS에서 Nginx MySQL 및 Docker Compose로 Laravel 도커화하기

Laravel은 MVC(모델-뷰-컨트롤러) 디자인 패턴을 구현하는 무료 오픈 소스 PHP 프레임워크입니다. 사용의 용이성을 염두에 두고 설계되었으며, 개발자가 간단한 애플리케이션과 복잡한 애플리케이션을 신속하게 만들 수 있도록 합니다. Laravel은 2011년 Taylor Otwell에 의해 CodeIgniter(CI) 프레임워크에 대한 고급 대안을 제공하기 위한 시도로 만들어졌습니다. 2011년 Laravel은 버전 1과 버전 2를 출시했으며, 최신 버전인 5.6은 ‘artisan’이라는 명령줄(CLI) 지원, 다양한 데이터베이스 시스템 지원, 라우트 개선 등 더 많은 기능과 개선 사항을 제공합니다.

이 가이드에서는 Ubuntu Server 18.04에서 Docker Compose를 사용하여 PHP-FPM, MySQL 데이터베이스 및 Nginx 웹 서버와 함께 Laravel 프로젝트를 도커화하는 방법을 보여줍니다. Laravel 프로젝트를 위한 새로운 도커 이미지를 생성한 후, App/Laravel 자체, Nginx 웹 서버 및 MySQL 데이터베이스를 포함한 일부 서비스를 포함하는 docker-compose.yml 스크립트를 생성할 것입니다.

전제 조건

  • Ubuntu 18.04
  • 루트 권한

우리가 할 일:

  1. Docker 및 Docker Compose 설치
  2. Laravel 다운로드 및 종속성 설치
  3. Laravel 프로젝트 도커화 - Laravel 앱 서비스 정의
  • Nginx HTTP 서비스 정의
  • MySQL 데이터베이스 서비스 정의
  • Laravel을 위한 Nginx 가상 호스트 생성
  • Laravel 앱을 위한 Dockerfile 생성
  1. Laravel 프로젝트 빌드
  2. Laravel 설치 후 작업

1단계 - Docker 및 Docker Compose 설치

먼저, Ubuntu 시스템에 Docker 및 Docker Compose 패키지를 설치할 것입니다. 공식 Ubuntu 저장소에서 Docker 패키지를 사용할 것입니다.

더 진행하기 전에, Ubuntu 시스템의 저장소를 업데이트해야 합니다. 다음 명령어를 실행하여 간단히 업데이트합니다.

sudo apt update

이제 아래의 apt 명령어를 사용하여 Docker 및 Docker Compose 패키지를 설치합니다.

sudo apt install docker.io -y  
sudo apt install docker-compose -y

이제 시스템에 Docker 및 Docker Compose 패키지가 설치되어야 하며, 다음 명령어를 사용하여 확인합니다.

docker version  
docker-compose version

결과적으로 시스템에서 Docker 및 Docker Compose의 버전을 확인할 수 있습니다.

Check docker version

다음으로, 비루트 사용자가 비루트 사용자로 Docker 컨테이너를 실행할 수 있도록 docker 그룹에 비루트 사용자를 할당해야 합니다.

이 경우, 다음 명령어를 실행하여 ‘hakase’라는 사용자를 docker 그룹에 추가할 것입니다.

usermod -a -G docker hakase

그 후, ‘hakase’ 사용자 셸에 로그인하고 docker ‘hello-world’ 명령어를 실행합니다.

su - hakase  
docker run hello-world

이제 Docker에서 ‘Hello World’ 메시지가 표시되며, Docker 설치가 완료되었습니다.

Add docker user

2단계 - Laravel 다운로드 및 종속성 설치

이 단계에서는 ‘hakase’ 홈 디렉토리에 Laravel 웹 프레임워크를 다운로드한 후, PHP ‘composer’ 도커 이미지를 사용하여 Laravel 종속성을 설치할 것입니다. 따라서 비루트 사용자로 서버에 로그인했는지 확인하십시오.

‘myapp’ 디렉토리에 Laravel 프로젝트를 다운로드하고 그 안으로 이동합니다.

git clone https://github.com/laravel/laravel.git myapp/  
cd myapp/

이제 Laravel 종속성을 설치하기 위해 다음 도커 명령어를 실행합니다.

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

위 명령어로 새로운 임시 도커 컨테이너를 실행하고 ‘myapp’ 프로젝트 디렉토리를 컨테이너의 ‘/app’ 디렉토리에 마운트합니다. 이 컨테이너는 ‘composer’ 도커 이미지를 기반으로 하며, 해당 임시 컨테이너 내에서 ‘composer’ 명령어를 사용하여 Laravel 종속성을 설치합니다.

Get Laravel Framework

Laravel 종속성 설치가 완료되면, 아래의 sudo 명령어를 사용하여 ‘myapp’ 디렉토리의 소유자를 자신의 사용자로 변경해야 합니다.

sudo chown -R $USER:$USER ~/myapp

Change owner of app directory

3단계 - Laravel 프로젝트 도커화

Laravel을 다운로드하고 종속성을 설치한 후, 새로운 docker-compose.yml 스크립트를 생성하고 Laravel 프로젝트를 위한 새로운 Dockerfile을 생성할 것입니다.

cd myapp/  
vim docker-compose.yml

- Laravel 앱 서비스 정의

먼저, Laravel 프로젝트 자체를 정의하고 Dockerfile을 사용하여 Laravel 프로젝트의 도커 이미지를 빌드할 것입니다.

스크립트를 붙여넣습니다.

version: '3'  
services:  
  
  #Laravel App  
  app:  
    build:  
      context: .  
      dockerfile: Dockerfile  
    image: hakase-labs/laravel  
    container_name: app  
    restart: unless-stopped  
    tty: true  
    environment:  
      SERVICE_NAME: app  
      SERVICE_TAGS: dev  
    working_dir: /var/www/html  
    volumes:  
      - ./:/var/www/html  
    networks:  
      - mynet

Laravel 컨테이너 서비스의 세부 사항:

  • Laravel 컨테이너 서비스는 ‘app’이라는 이름으로 지정됩니다. 이는 우리의 ‘Dockerfile’로 생성될 사용자 정의 도커 이미지를 기반으로 하며, 새로운 이미지는 ‘hakase-labs/laravel’이라는 이름을 가집니다.
  • ‘myapp’ 프로젝트 디렉토리를 컨테이너 서비스 내부의 ‘/var/www/html’에 마운트하려고 합니다.
  • 설정을 위해 사용자 정의 도커 네트워크를 사용하며, 네트워크 이름은 ‘mynet’입니다.

- Nginx HTTP 서비스 정의

이제 nginx 컨테이너 서비스를 정의할 것입니다.

‘app’ 컨테이너 서비스 라인 뒤에 다음 구성을 붙여넣습니다.

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

nginx 컨테이너 서비스의 구성 세부 사항:

  • ‘nginx:alpine’ 도커 이미지를 기반으로 하는 ‘nginx’라는 이름의 새로운 컨테이너를 생성하려고 합니다.
  • 컨테이너 서비스는 HTTP 및 HTTPS 포트를 엽니다.
  • 컨테이너는 세 가지 다른 볼륨을 마운트합니다. ‘myapp’ 프로젝트 디렉토리를 ‘/var/www/html’ 디렉토리에, nginx 가상 호스트 구성 ‘nginx/conf.d/‘를 ‘/etc/nginx/conf.d’ 디렉토리에, 인증서 파일 ‘nginx/ssl/‘를 컨테이너의 ‘/etc/nginx/ssl’ 디렉토리에 마운트합니다.
  • 컨테이너 서비스는 ‘mynet’이라는 동일한 네트워크를 사용합니다.

- MySQL 데이터베이스 서비스 정의

마지막으로, MySQL 데이터베이스 서비스를 정의합니다.

‘nginx’ 컨테이너 서비스 라인 뒤에 다음 구성을 붙여넣습니다.

  #MySQL Service  
  db:  
    image: mysql:5.7  
    container_name: db  
    restart: unless-stopped  
    tty: true  
    ports:  
      - "3306:3306"  
    environment:  
      MYSQL_DATABASE: laraveldb  
      MYSQL_USER: laravel  
      MYSQL_PASSWORD: laravelpassworddb  
      MYSQL_ROOT_PASSWORD: rootpasswordmysql  
    volumes:  
      - mysqldata:/var/lib/mysql/  
    networks:  
      - mynet  
  
#Docker Networks  
networks:  
  mynet:  
    driver: bridge  
#Volumes  
volumes:  
  mysqldata:  
    driver: local

구성을 저장하고 닫습니다.

MySQL 컨테이너 서비스의 세부 사항:

  • MySQL 컨테이너 서비스는 ‘db’라는 이름으로 지정되며, ‘mysql:5.7’ 도커 이미지를 기반으로 합니다.
  • ‘db’ 서비스는 기본 MySQL 포트 ‘3306’을 엽니다.
  • Laravel 프로젝트는 ‘db’ 서비스의 환경 변수를 기반으로 데이터베이스, 사용자 및 비밀번호를 사용합니다.
  • MySQL ‘db’ 서비스는 ‘mysqldata’라는 볼륨을 마운트하며, 동일한 네트워크 ‘mynet’을 가집니다.
  • 그리고 ‘bridge’ 드라이버로 사용자 정의 네트워크 ‘mynet’을 정의하며, ‘mysqldata’ 볼륨은 ‘local’ 드라이버를 사용합니다.

아래는 완성된 ‘docker-compose.yml’ 구성입니다:

version: '3'
services:

  #Laravel App
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hakase-labs/laravel
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - mynet

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

  #MySQL Service
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laraveldb
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravelpassworddb
      MYSQL_ROOT_PASSWORD: rootpasswordmysql
    volumes:
      - mysqldata:/var/lib/mysql/
    networks:
      - mynet

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  mysqldata:
    driver: local

- Laravel을 위한 Nginx 가상 호스트 생성

‘myapp’ 프로젝트 디렉토리 내에 ‘nginx’라는 새 디렉토리를 생성하고, 그 안에 ‘conf.d’ 및 ‘ssl’이라는 두 개의 다른 디렉토리를 생성합니다. 그런 다음 ‘conf.d’ 디렉토리 내에 새로운 nginx 가상 호스트 구성 ‘laravel.conf’를 생성합니다.

다음 명령어를 실행합니다.

mkdir -p nginx/{conf.d,ssl}  
vim nginx/conf.d/laravel.conf
server {
    listen 80;
    server_name laravel.hakase-labs.io;

    return 301 https://laravel.hakase-labs.io$request_uri;
}


server {
    listen 443 ssl http2;
    server_name laravel.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Laravel web root directory
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }

    # Nginx Pass requests to PHP-FPM
    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;
    }
}

저장하고 닫습니다.

그 후, SSL 인증서 파일을 ‘nginx/ssl/‘ 디렉토리로 복사합니다.

sudo cp /path/to/ssl/fullchain.pem nginx/ssl/  
sudo cp /path/to/ssl/privkey.pem nginx/ssl/

- Laravel 앱을 위한 Dockerfile 생성

다음으로, Laravel 프로젝트를 위한 새로운 Dockerfile을 생성합니다.

다음 명령어를 실행합니다.

vim Dockerfile

아래 구성을 붙여넣습니다.

# Set master image
FROM php:7.2-fpm-alpine

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

# Set working directory
WORKDIR /var/www/html

# Install Additional dependencies
RUN apk update && apk add --no-cache \
    build-base shadow vim curl \
    php7 \
    php7-fpm \
    php7-common \
    php7-pdo \
    php7-pdo_mysql \
    php7-mysqli \
    php7-mcrypt \
    php7-mbstring \
    php7-xml \
    php7-openssl \
    php7-json \
    php7-phar \
    php7-zip \
    php7-gd \
    php7-dom \
    php7-session \
    php7-zlib

# Add and Enable PHP-PDO Extenstions
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql

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

# Remove Cache
RUN rm -rf /var/cache/apk/*

# Add UID '1000' to www-data
RUN usermod -u 1000 www-data

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

# Change current user to www
USER www-data

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

구성을 저장하고 닫습니다.

이제 ‘myapp’ Laravel 프로젝트를 빌드하고 우리가 정의한 컨테이너 서비스를 실행할 준비가 되었습니다.

4단계 - Nginx 및 MySQL 서비스와 함께 Laravel 빌드

다음 명령어를 사용하여 Laravel 프로젝트를 위한 사용자 정의 도커 이미지를 빌드합니다.

docker-compose build

Build Laravel with Nginx and MySQL Services

그런 다음 다음 명령어를 다시 실행합니다.

docker-compose up -d

필요한 모든 도커 이미지를 다운로드한 후 ‘docker-compose.yml’ 구성에 따라 컨테이너 서비스를 빌드합니다.

Download docker images

완료되면 아래의 docker-compose 명령어를 사용하여 확인합니다.

docker-compose ps

결과적으로 세 개의 컨테이너 서비스가 실행 중임을 확인할 수 있습니다. 기본 포트 ‘9000’에서 실행 중인 ‘app’, HTTP 및 HTTPS 포트에서 실행 중인 ‘nginx’ 서비스, 기본 MySQL 포트 ‘3306’에서 실행 중인 MySQL ‘db’ 서비스입니다.

그 후, 시스템에서 사용 가능한 모든 도커 이미지와 열린 포트를 다시 확인합니다.

docker-compose images  
netstat -plntu

목록에서 사용자 정의 도커 이미지 ‘hakase-labs/laravel’을 확인할 수 있으며, HTTP 및 HTTPS 포트는 ‘LISTEN’ 상태입니다.

Check docker setup with netstat

5단계 - Laravel 설치 후 작업

이 단계까지 Laravel 프로젝트는 도커 컨테이너로 실행되고 있습니다. 이제 새로운 ‘.env’ 파일을 생성하고, 키를 생성하고, Laravel 명령줄 ‘artisan’을 사용하여 Laravel 데이터를 마이그레이션할 것입니다.

‘.env’ 파일의 예제를 복사하고 컨테이너 내에서 편집합니다.

cp .env.example .env  
docker-compose exec app vim .env

데이터베이스 구성을 아래와 같이 변경합니다.

DB_CONNECTION=mysql  
DB_HOST=db  
DB_PORT=3306  
DB_DATABASE=laraveldb  
DB_USERNAME=laravel  
DB_PASSWORD=laravelpassworddb

저장하고 닫습니다.

다음으로, Laravel 애플리케이션 키를 생성하고 캐시 구성을 지웁니다.

docker-compose exec app php artisan key:generate  
docker-compose exec app php artisan config:cache

그 후, 다음 명령어를 사용하여 데이터베이스를 마이그레이션합니다.

docker-compose exec app php artisan migrate

오류가 없음을 확인합니다.

Laravel post installation

이제 웹 브라우저를 열고 프로젝트의 도메인 이름을 입력합니다.

http://laravel.hakase-labs.io/

그러면 안전한 HTTPS 연결로 리디렉션되며 아래와 같은 기본 Laravel 홈페이지가 표시됩니다.

Laravel with Docker successfully installed

마지막으로, Nginx 웹 서버와 MySQL 데이터베이스로 Laravel 프로젝트의 도커화가 성공적으로 완료되었습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.