Simple Docker Setup for Laravel Apps

Dockerfile and docker-compose configuration for running Laravel in containers.

Fri May 05 2023
— words · — minutes

Overview

Dockerfile and docker-compose configuration for running Laravel in containers.

Originally published on Jang Keyte's Blog.

This article covers Simple Docker Setup for Laravel Apps — practical notes from real-world web development experience.

Code Examples

version: '1.0' # xác định phiên bản docker
services:
  # The Application - Laravel Container
  app:
      container_name: laravel_app # tên tham chiếu đến container - có thể tùy ý lựa chọn
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/app.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container. Ở đây, development/app.dockerfile nghĩa là docker file được để trong development của thư mục laravel gốc
      volumes:
        - ./storage:/var/www/storage # định nghĩa nơi lưu trữ chia sẻ giữa ứng dụng và docker container đang chạy
      env_file: '.env.prod' # nơi định nghĩa file .env của laravel
      environment: # khai báo các biến môi trường
        - "DB_HOST=database"
        - "REDIS_HOST=cache"

  # The Web Server - NGINX Container
  web:
      container_name: nginx_server # tên tham chiếu đến container
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/web.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container.
      volumes:
        - ./storage/logs/:/var/log/nginx # ở đây ta chia sẻ folder log của laravel với log của nginx
      ports:
        - 8990:80 # định nghĩa port mà docker container sẽ lắng nghe, port của máy chủ / port của docker container

  # The Database - MYSQL container
  database:
      container_name: mysql_database # tên tham chiếu đến container
      image: mysql:8.0.30 # ở đây ta dùng luôn từ 1 image sẵn là mysql:8.0.30 chứ không tự định nghĩa docker file nữa
      volumes:
        - ./dbdata:/var/lib/mysql # định nghĩa nơi lưu trữ chia sẻ giữa database và mysql
      environment:
        - "MYSQL_DATABASE=laravel"
        - "MYSQL_USER=test"
        - "MYSQL_PASSWORD=test"
        - "MYSQL_ROOT_PASSWORD=root"
      ports:
        - 8991:3306 # ở đây mysql container sẽ lắng nghe từ cổng 8991 trên máy chủ và 3306 trên mạng của container
# Build container từ image: php:7.2-fpm
FROM php:8.1-fpm

# Thực thi command copy các folder tương ứng từ máy chủ vào docker container
COPY composer.lock composer.json /var/www/
COPY database /var/www/database

# Set không gian làm việc docker container vào thẳng /var/www, sau này chạy các command ở bash thì không cần cd vào đó
WORKDIR /var/www

# Cài đặt các trình phục thuộc mà laravel cần (tương tự composer install ở máy chủ và 1 số phần khác), lưu ý dòng if(hash_file('SHA384'... vì mỗi lần cập nhật thì giá trị băm sẽ thay đổi, cho nên cần Get Hash Value
RUN apt-get update && apt-get -y install git && apt-get -y install zip
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php -r "if (hash_file('SHA384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && php composer-setup.php && php -r "unlink('composer-setup.php');" && php composer.phar install --no-dev --no-scripts && rm composer.phar

# Copy toàn bộ source code vào foler làm việc
COPY . /var/www
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache

RUN php artisan cache:clear
RUN php artisan optimize
RUN apt-get install -y libmcrypt-dev libmagickwand-dev --no-install-recommends && pecl install mcrypt-1.0.6 && docker-php-ext-install pdo_mysql && docker-php-ext-enable mcrypt

RUN mv .env.prod .env
RUN php artisan optimize
# build container từ iamge: nginx:1.10-alpine và thay thế default.conf của nginx bằng vhost.conf
# Vì vậy ta cần tạo file vhost.conf cùng thư mục với web.dockerfile (development)
FROM nginx:1.10-alpine
ADD development/vhost.conf /etc/nginx/conf.d/default.conf
COPY public /var/www/public

Read More

For the full Vietnamese version, switch language using the VI | EN toggle above, or visit the original post.


Thanks for reading!

Simple Docker Setup for Laravel Apps

Fri May 05 2023
— words · — minutes