Create a application laravel 8 + Docker

Hôm nay mình sẽ chia sẻ với mọi người cách Setup Laravel 8 + Docker(mysql, adminer, nginx). Thông thường ta hay cài PHP  mà Laravel yêu cầu. Như vậy thì mỗi Project Laravel khác nhau ta phải cài thêm php version khác, đúng là ta phải cài, nhưng như vậy nó quá mệt mỏi khi cài thêm nửa.

Docker sẽ giúp ta xử lý chúng một cách dễ dàng hơn nhiều, Mình nghĩ mọi người cũng biết sơ qua Docker là gì? rồi, nên mình sẽ không nói thêm nhiều nửa, với lại trên mạng search từ khóa thôi cũng rất rất là nhiều rồi, nói thêm nửa cũng làm cho bài viết khá dài và mệt thêm ::)

# Tạo Project Laravel 

$ git clone -b 8.x https://github.com/laravel/laravel.git laravel-8.x
$ cd laravel-8
$ docker run --rm -v $(pwd):/app composer install

Câu lệnh trên, đầu tiên chúng ta git clone version của laravel về máy tính, sau đó trỏ tới thư mục vừa download về, tiếp tục chạy lệnh composer install , để cài thư viện laravel cho chúng ta, nó sẽ sinh ra thư mục vendor trong project

$ cp .env.example   .env

Hãy mờ thư mục project lên và tìm file .env cập nhật lại các thông số sau:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel8x
DB_USERNAME=thanhhoa
DB_PASSWORD=12345678

Chú ý ở DB_HOST hãy đặt = db

DB_USERNAME , bạn đừng để root nhé, hãy đặt 1 username nào đó, để tí ta gọi nó trong file docker-compose.yml, phía sau ta sẽ tạo file này và gọi chúng

Sau khi có được một project Laravel , tiếp tục ta cần cài một số thư quan trọng như:

+ PHP Version (7.3 - 8.1) : php của chúng ta cần cài phải nằm trong khoảng này nhé

+ Mysql : Cài mysql để quản lý cơ sở dữ liệu

+ Nginx  : Cấu hình domain của chúng ta thông qua nginx

+ Adminer : Cấu hình giao diện quản lý cơ sở dữ liệu

Các vấn đề trên chúng ta cần làm việc trong Docker nhé

# Tạo file Dockerfile trong thư mục project

File Dockerfile này chúng ta cấu hình phiên bản cài đặt version PHP phải phù hợp với Laravel đang sử dụng. Đồng thời Dockerfile này sử dụng PHP-FPM Alpine, chúng ta có thể cài đặt các tiện ích mở rộng cần thiết, đặt thư mục làm việc, sao chép các tệp dự án Laravel và đặt lệnh để chạy Laravel.

FROM php:8.1-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip
RUN apt-get update; \
    # Imagick extension
    apt-get install -y libmagickwand-dev; \
    pecl install imagick; \
    docker-php-ext-install gd; \
    docker-php-ext-enable imagick; \
    # Success
    true

# 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

# Install Postgre PDO
RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=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

# Setup working directory
WORKDIR /var/www/

CMD ["php-fpm"]

# Tạo Docker Composer

Chúng ta tạo một file docker-compose.yml để cấu hình(application, mysql, adminer, nginx), để chạy hệ thống của chúng ta

version: "3.8"
services:
          app:
            build:
              args:
                user: thanhhoa
                uid: 1000
              context: ./
              dockerfile: Dockerfile
            image: skp
            container_name: skp-app
            restart: unless-stopped
            working_dir: /var/www/
            volumes:
              - ./:/var/www
            networks:
              - skp
        
          db:
            image: mysql:5.7
            container_name: skp-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/sql:/docker-entrypoint-initdb.d
            networks:
              - skp
          adminer:
           image: adminer
           restart: always
           ports:
              - 8080:8080
           networks:
              - skp
        
          nginx:
            image: nginx:alpine
            container_name: skp-nginx
            restart: unless-stopped
            ports:
              - 8000:80
            volumes:
              - ./:/var/www
              - ./docker-compose/nginx:/etc/nginx/conf.d/
            networks:
              - skp
networks:
      skp:
        driver: bridge

OKay, các bạn xem file bên trên ta có gọi tới file Dockerfile để chạy cho ứng dụng app laravel của chúng ta. Nó sẽ đọc file Dockerfile và cài đặt php version và các tiện ích cần để chạy được laravel

Bạn sẽ thấy thư mục docker-compose/sql nó là chứa đựng file sql, bạn hãy tạo thư mục docker-compose/sql và copy file database của bạn vào thư mục đó. Chương trình sẽ tự import database

Tiếp tục tại phần nginx, mình có tạo đường dẫn thư mục docker-compose/nginx để cài đặt file cấu hình server.conf trong thư mục đó

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/public;
        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;
        }
    }

Cấu nhình nginx thì đã xong rồi, mình muốn chia sẻ thêm mọi người là bên trong file docker-compose.yml mình có sử dụng adminer để quản lý database , giúp cho chúng ta dễ dàng thao tác hơn,  bạn nào không thích thì bỏ nó ra cũng không sao, hoặc muốn sử dụng nó hay dùng phpmyadmin thay thế nó cũng được nhé, để lần sao mình chia sẻ cách sử dụng phpmyadmin trong docker nhé, nó hơi lu bu xíu

Okay vậy mọi thứ ok rồi, chúng ta thử chạy xem, thành quả nảy giờ chúng ta làm nhé

$ cd laravel-8.x
$ docker-compose up --build  

Hoặc 

$ docker-compose up -d
// close 
$ docker-composer down -v

Sau khi build thành công bạn có thể gõ trên trình duyệt : 

http://localhost:8000   -> web laravel

http://localhost:8080   -> vào quản lý adminer

Nếu bạn muốn trỏ vào app laravel sau khi chạy docker xong, bạn chạy câu lệnh sau

$ docker-compose exec app composer install
$ docker-compose exec app php artisan key:generate
$ docker-compose exec app php artisan migrate

Còn nếu bạn cần xem database trong mysql của bạn thì chạy lệnh bash sao docker exec -it [container name] bash

$ docker exec -it skp-db bash
$ mysql -u root -p

Sau đó bạn sữ dựng lệnh mysql bình thường: Chú ý:  password password trong file .env bạn vừa cấu hình bên trên "12345678"

hoặc bạn chạy lệnh :  docker-compose exec db bash

Okay trường hợp xấu là sau khi bạn chạy ok hết mà lên website rõ  http://localhost:8000 bị lỗi như sau: thì xin chúc mừng bạn đã chạy thành công, còn lỗi phía dưới chỉ là bị quyền giới hạn thôi, không sau

UnexpectedValueException The stream or file "/var/www/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied

Các xử lý như sau:

hoacode@DESKTOP-H6JD1PA:~$ cd laravel-8.x/
hoacode@DESKTOP-H6JD1PA:~/laravel-8.x$ docker-compose exec app bash
root@f2b00f085346:/var/www# chown -R $USER:www-data storage/
root@f2b00f085346:/var/www# chmod -R 777 storage/

Bây giờ bạn thử quay lại website của mình , xem hết lỗi chưa

Bài Viết Liên Quan

Messsage

Ủng hộ tôi bằng cách click vào quảng cáo. Để tôi có kinh phí tiếp tục phát triển Website!(Support me by clicking on the ad. Let me have the money to continue developing the Website!)