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
- 루트 권한
우리가 할 일:
- Docker 및 Docker Compose 설치
- Laravel 다운로드 및 종속성 설치
- Laravel 프로젝트 도커화 - Laravel 앱 서비스 정의
- Nginx HTTP 서비스 정의
- MySQL 데이터베이스 서비스 정의
- Laravel을 위한 Nginx 가상 호스트 생성
- Laravel 앱을 위한 Dockerfile 생성
- Laravel 프로젝트 빌드
- 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의 버전을 확인할 수 있습니다.

다음으로, 비루트 사용자가 비루트 사용자로 Docker 컨테이너를 실행할 수 있도록 docker 그룹에 비루트 사용자를 할당해야 합니다.
이 경우, 다음 명령어를 실행하여 ‘hakase’라는 사용자를 docker 그룹에 추가할 것입니다.
usermod -a -G docker hakase그 후, ‘hakase’ 사용자 셸에 로그인하고 docker ‘hello-world’ 명령어를 실행합니다.
su - hakase
docker run hello-world이제 Docker에서 ‘Hello World’ 메시지가 표시되며, Docker 설치가 완료되었습니다.

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 종속성을 설치합니다.

Laravel 종속성 설치가 완료되면, 아래의 sudo 명령어를 사용하여 ‘myapp’ 디렉토리의 소유자를 자신의 사용자로 변경해야 합니다.
sudo chown -R $USER:$USER ~/myapp
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:
- mynetLaravel 컨테이너 서비스의 세부 사항:
- 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:
- mynetnginx 컨테이너 서비스의 구성 세부 사항:
- ‘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.confserver {
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
그런 다음 다음 명령어를 다시 실행합니다.
docker-compose up -d필요한 모든 도커 이미지를 다운로드한 후 ‘docker-compose.yml’ 구성에 따라 컨테이너 서비스를 빌드합니다.

완료되면 아래의 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’ 상태입니다.

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오류가 없음을 확인합니다.

이제 웹 브라우저를 열고 프로젝트의 도메인 이름을 입력합니다.
http://laravel.hakase-labs.io/
그러면 안전한 HTTPS 연결로 리디렉션되며 아래와 같은 기본 Laravel 홈페이지가 표시됩니다.

마지막으로, Nginx 웹 서버와 MySQL 데이터베이스로 Laravel 프로젝트의 도커화가 성공적으로 완료되었습니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.