Laravel Development with Docker and VS Code
A flexible starting template for full stack development with Laravel as API endpoint and admin dashboard and vuejs SPA as frontend application. It enables unit testing with each components, regular dependency updates, local hosting and development servers. VS Code is the default coding tool.
1. PHP7.4-FPM Container(with Composer)
1.1 Dockerfile
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# change sources list of update to local repository
RUN rm -rf /etc/apt/sources.list.d/buster.list
COPY sources.list /etc/apt/sources.list
RUN apt-get update
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
1.2 sources.list
For example, Aliyun in for Chinese user
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb-src http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
2. Docker compose
- app: PHP7.4-FPM
- MySQL 5.7
- nginx service
version: "3.7"
services:
app:
build:
args:
user: laradev
uid: 1000
context: ./
dockerfile: Dockerfile
image: wylaradev
container_name: wylaradev-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- wylaradev
db:
image: mysql:5.7
container_name: wylaradev-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- wylaradev
nginx:
image: nginx:alpine
container_name: wylaradev-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- wylaradev
networks:
wylaradev:
driver: bridge
2.1 nginx configuration (app.conf)
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;
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;
}
}
3. Command (Composer or Artisan)
- build app (PHP7.4-FPM)
docker-compose build app
- boot up all three containers
docker-compose up -d
- check condition of the containers
docker-compose ps
- check file in the app container
docker-compose exec app ls -l
- check nginx log
docker-compose logs nginx
- pause
docker-compose pause
- unpause
docker-compose unpause
- down
docker-compose down
3.1 Composer
- composer install
docker-compose exec app composer install
3.2 Artisan
- artisan key:generate
docker-compose exec app php artisan key:generate