Laradock và siêu năng lực mà nó mang lại

Triển khai dự án laravel với laradock

[Phần 1]: Giới thiệu và làm quen với laradock

1) Laradock là gì ? Tại sao nên dùng laradock ?

Laradock = laravel + docker. Tức là dùng docker để triển khai 1 dự án laravel.

Docker đang rất phổ biến trong giới developer. Tôi đã tò mò với khái niệm Container và bắt đầu tìm hiểu về docker. Docker this docker that. Thậm chí Kubernetes cũng lấy khái niệm container để xây dựng nên một hệ thống để triển khai và quản lý các container trên quy mô lớn hơn.

Và tôi sẽ không đi sâu vào khái niệm cả docker. Bạn có thể tìm hiểu chi tiết hơn tại đây

Vậy lý do tại sao nên dùng docker ?

  1. Tính dễ dàng: bạn là anh lính mới bước chân vào công ty. Code đã có sẵn trên github. Việc đầu tiên bạn cần làm là cài đặt tất tần tật, tuốt tuồn tuột các tool để giúp bạn làm việc trên môi trường local (let say 1 dự án web php thì bạn phải chạy được trên localhost để debug chứ, nhiêu đó yêu cầu bạn cài nginx, php-fpm, composer, mysql … ) Bạn mất hẳn 1 ngày để cài và fix lỗi cho đống tool đó.Thay vì vậy, bạn tải 1 thư mục docker vài MB về, chạy 1 lệnh và nó sẽ tự động kéo image về và xây dựng các container với môi trường như bạn mong muốn.

  2. Tính nhất quán về môi trường.Với laradock, bạn có thể đảm bảo rằng môi trường production và local của bạn là gần như nhau, Sẽ không có việc “Sao code tao chạy trên Win10 local mà sao trên ubuntu server không chạy được”. Code của bạn sẽ chạy trên môi trường của các container và các môi trường này là giống nhau bất kể host OS của bạn là gì

  3. Nhẹ với các bạn đã biết về docker, container nhẹ hơn 1 VM rất nhiều vì nó sử dụng chung Linux Kernel và phần lớn tài nguyên dành để chạy app. Trong thực tế , mình đã thử triển khai 5 website có db trên 1 server 8Gb RAM với docker mà vẫn chạy ngon lành (thách VM làm được)

Đó là những lý do nên dùng docker.
Bài viết này tập trung hơn về một dự án mã nguồn mở tên là laradock, dùng các docker container để triển khai 1 dự án laravel với nginx, mariadb.

Bài viết được viết trên hệ điều hành Ubuntu và được mặc định là người xem đã cài docker và docker compose và đã loại bỏ sudo khỏi câu lệnh docker (a security risk, but for convenient

2) Mở terminal lên và triển nào

Tổng quan, ta cần những bước sau để triển khai 1 dự án laravel với laradock

  • Pull code laradock
  • Chỉnh sửa cấu hình cho các container (nếu cần)
  • Pull code laravel
  • Cho các container start lên
  • Vào workspace và chạy các câu lệnh cần thiết

Đầu tiên, pull code của laradock về

git clone https://github.com/laradock/laradock.git

Cùng xem qua 1 chút về các container mà laradock đã xây dựng trước khi ta bắt tay vào làm

  • Proxy server: nginx, apache, caddy …
  • Db: Mysql, mariadb, mongo, postgre …
  • Workspace: Đã cài đặt sẵn php, là nơi mà các bạn có thể chạy các câu lệnh của php artisan. Để lựa chọn phiên bản php, sửa biến PHP_VERSION trong file env. Hơn nữa, bạn có thể thay đổi các lựa chọn trong file .env để cài đặt các gói vào trong workspace container, tiêu biểu như composer và npm. Việc này giúp bạn không cần phải cài đặt những gói đó lên máy tính của mình, việc cài đặt sẽ trong container và bạn cần phải exec vào trong workspace để chạy những lệnh đó. Tùy thuộc vào nhu cầu sử dụng mà các bạn có thể bật nó lên. Hình dưới là một vài option của workspace container (nhiều vồn)
    alt text
  • php-fpm: php interpreter mặc định. Ngoài ra bạn cũng có thể dùng hhvm
  • selenium: bộ kiểm thử tự động

Các bạn có thể thấy số lượng service mà laradock cung cấp là khá nhiều. Bản thân mình cũng chưa bao giờ xài hết tất cả các container này của laradock nhưng nếu bạn có nhu cầu thì cứ việc start container lên mà tận hưởng thôi.

Bước tiếp theo ta copy file env-example thành .env (trong window thì bạn chịu khó dùng text editor nào đó, mở lên rồi lưu dưới tên .env nha, Window không cho phép tên được trống, tức là phần trước dấu . không được trống nên không rename được đâu)

cp env-example .env

Vậy là giờ chúng ta đã có thể chạy các container với các option mặc định bằng câu lệnh docker-compose up -d [services] (nhớ thêm -d để chạy background nha). Tuy nhiên, trước khi bắt đầu, cũng điều chỉnh vài thứ trước nào. Đầu tiên là môi trường local

a) Đổi đường dẫn mặc định của code

Mặc định, code sẽ được để ngoài thư mục laradock, một site thì không sao, nhưng với nhiều site, bạn sẽ có 1 mớ hổ lốn folder bên ngoài đấy. Gói gọn nó vào 1 folder web thôi
Vào file .env, chỉnh biến APP_CODE_PATH_HOST=../web

Lúc này thì pull code laravel vào trong thư mục web thôi

git clone https://github.com/laravel/laravel.git laravel1

alt text

b) Đổi đường dẫn chứa data

Thay đổi đường dẫn chứa data ở biến DATA_PATH_HOST nếu bạn có nhu cầu. Đây sẽ là nơi chứa data của mariadb

c) Chỉnh phiên bản php

PHP_VERSION=7.2 là mặc định. Bạn có thể chọn các phiên bản khác (7.2 - 8.1-…)

d) Với php-fpm

Nếu có gói nào bạn cần dùng để chạy code php thì cứ enable nó lên.

e) Thay đổi cấu hình mySQL

MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mariadb/docker-entrypoint-initdb.d

5 biến đầu cũng không có gì nhiều để giải thích. MYSQL_ENTRYPOINT_INITDB là nơi chứa file sql mà khi khởi tạo mariadb thì sẽ chạy file sql đó. Nếu bạn có file sql để khởi tạo lúc đầu thì copy vào thư mục mysql/docker-entrypoint-initdb.d. Bạn có thể thay đổi các thông số trên nếu muốn.

f) Tạo file laravel1.conf

Thư mục nginx/sites đã có sẵn file default.conf mà bạn có thể dùng luôn cho 1 dự án laravel.
Ta sẽ chỉnh sửa vài chỗ để mọi thứ có thể chạy ngon lành

  • Thay các chỗ default_server bằng laravel1.local (hay bất kỳ tên nào bạn muốn)
  • thêm 2 dòng để ghi log truy cập và log lỗi của nginx
  • để nginx có thể tìm đúng thư mục code, ta điều chỉnh mục root trỏ vào thư mục của code.

Sau đây là ví dụ của file laravel1.conf hoàn chỉnh

server {

    listen 80 laravel1;
    listen [::]:80 laravel1 ipv6only=on;

    # For https
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name laravel1.local;
    root /var/www/laravel/public;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/lararvel1_error.log debug;
    access_log /var/log/nginx/laravel1_access.log;
}

Tới bước này, bạn đã có thể đẩy code laradock của mình lên cho các dev khác dùng. Viết 1 cái doc README, kêu họ dùng câu lệnh để start service là xong. Phần phía dưới là phần tùy chọn và thiết lập ban đầu cho 1 dự án laravel (chạy composer, php artisan key generate …)

h) Ghi thêm vào file /etc/hosts

Lưu ý bạn cần quyền root để được ghi vào file này
Thêm dòng sau dưới dòng localhost laravel1.local 127.0.0.1

alt text

Bây giờ thì start lên nào. Vào thư mục laradock gõ
docker-compose up -d nginx mysql workspace
Nhớ ghi cụ thể service muốn start lên, nếu không là nó start lên tất cả đó

Docker lúc này sẽ bắt đầu pull các image về và build. Nếu bạn để ý thì nó sẽ build và start lên nhiều hơn số service trong câu lệnh này. Lý do là vì nó đã được ràng buộc, ví dụ muốn chạy được nginx thì container php-fpm phải start lên trước

alt text

Ra làm tách cafe, đi qua đi lại cho đỡ bị trĩ. Chừng 10ph sau là build xong.(lưu ý lần đầu thì docker build hơi lâu nhưng từ lần 2 thì sẽ nhanh hơn nhiều)

Đã start xong, gõ câu lệnh docker-compose ps để xem tình trạng các container yêu dấu nào

alt text

Mọi thứ đã lên. Tiếp theo là cài đặt các gói cần thiết cho laravel. Dùng câu lệnh sau để vào được workspace
docker-compose exec --user=laradock workspace bash

Bạn sẽ thấy mình đang ở trong địa chỉ /var/www của workspace, user là laradock. Địa chỉ này sẽ được “volume” ra ngoài thư mục web, tức là mọi thay đổi bạn làm trong /var/www của workspace sẽ thay đổi ở thư mục web bên ngoài

Đầu tiên truy cập vào thư mục laravel cd laravel
copy file .env.example thành .env cp .env.example .env
Thay đổi nội dung của database

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

thành

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=${MYSQL_DATABASE}
DB_USERNAME=${MYSQL_USER}
DB_PASSWORD=${MYSQL_PASSWORD}

các thông số của mysql được lấy trong file .env của laradock.

Bây giờ ta chạy câu lệnh composer install, thư mục vendor sẽ được tạo

alt text

chạy câu lệnh php artisan key:generate để tạo APP_KEY, php artisan migrate để tạo database
Và thế là xong. Gõ exit để thoát ra khỏi workspace.

alt text

Việc gõ các câu lệnh trên cho thấy lợi ích của việc dùng docker, bạn không cần cài composer hay php (cũng như npm hay 1 tá thứ hầm bà lằng khác) vào máy mình mà vẫn chạy được 1 project laravel.

Bật chrome lên gõ vào laravel1.local để tận hưởng thôi .

alt text

truy cập database qua đường dẫn laravel.test

3) Kết:

Sau khi xong những phần điều chỉnh trên, laradock đã sẵn sàng cho bạn và các dev khác cùng work. Môi trường là như nhau, không cần cài nginx hay php-fpm hay composer.