Setting up Laravel with Docker : Part 2

“A large number of shipping containers in a busy cargo port” by chuttersnap on Unsplash

Directory structure

+-- laravel
| +-- docker
| | +-- Dockerfile
| | +-- default
| +-- docker-compose.yml
| +-- app

Building PHP image

FROM php:7.0-fpm 
LABEL maintainer="Subash Adhikari <[email protected]>"
RUN apt-get update \
&& apt-get install -y git zlib1g-dev zip unzip \
&& php -r "readfile('http://getcomposer.org/installer');" | \
php -- --install-dir=/usr/bin/ --filename=composer \
&& docker-php-ext-install pdo_mysql zip \
&& apt-get -y autoremove && apt-get clean \ 
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/www/html/*
FROM php:7.0-fpm

LABEL maintainer="Subash Adhikari <me@subash.com.au>"

RUN apt-get update \
&& apt-get install -y git zlib1g-dev zip unzip \
&& php -r "readfile('http://getcomposer.org/installer');" | \
php -- --install-dir=/usr/bin/ --filename=composer \
&& docker-php-ext-install pdo_mysql zip \
&& apt-get -y autoremove && apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/www/html/*

Docker compose

version: '2'
volumes:
mysqldata:
driver: "local"
redisdata:
driver: "local"
networks:
app-network:
driver: "bridge"
services:
app:
build:
context: ./docker
dockerfile: Dockerfile
image: adikari/laravel
volumes:
- ./app/:/var/www/html/
networks:
- app-network
nginx:
image: nginx:1.12-alpine
volumes:
- ./app/:/var/www/html/
- ./docker/default:/etc/nginx/conf.d/default.conf
ports:
- 8000:80
networks:
- app-network
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysqldata:/var/lib/mysql
networks:
- app-network
redis:
image: redis:4.0-alpine
volumes:
- redisdata:/data
networks:
- app-network
version: '2'
services:
app:
build:
context: ./docker
dockerfile: Dockerfile
image: adikari/laravel
volumes:
- ./app/:/var/www/html/
networks:
- app-network
nginx:
image: nginx:1.12-alpine
volumes:
- ./app/:/var/www/html/
- ./docker/default:/etc/nginx/conf.d/default.conf
ports:
- 8000:80
networks:
- app-network
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysqldata:/var/lib/mysql
networks:
- app-network
redis:
image: redis:4.0-alpine
volumes:
- redisdata:/data
networks:
- app-network
volumes:
mysqldata:
driver: "local"
redisdata:
driver: "local"
networks:
app-network:
driver: "bridge"

Nginx configuration

server {
root /var/www/html/public;

index index.html index.htm index.php;

server_name _;
charset utf-8;

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
# include snippets/fastcgi-php.conf;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass app:9000;
fastcgi_index index.php;
}

error_page 404 /index.php;

location ~ /\.ht {
deny all;
}
}

Installing Laravel

docker-compose run --rm -w /var/www/ app \ 
composer create-project --prefer-dist laravel/laravel html
docker-compose run --rm -w /var/www/html app composer require predis/predis
DB_HOST=mysql 
REDIS_HOST=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
docker-compose up
docker-compose run --rm -w /var/www/html app php artisan make:auth
docker-compose run --rm -w /var/www/html app php artisan migrate

Conclusion

Related Posts

--

--

Lead Software Engineer at A Cloud Guru

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store