Triển khai dự án laravel với laradock (p.1)
TIL
735
Male avatar

certainlyT viết ngày 22/01/2019

[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.

Thế giới dev đang bị xâm chiếm bởi docker. Từ khi khái niệm về container ra đời, dân tình đổ xô đi 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.

Chi tiết về docker mình sẽ không đi sâu. Lên google search sẽ có cả đống bài. Đây là 1 bài trong kipalog của Mr.Quãng mà các bạn có thể tham khảo ( ̄^ ̄)ゞ

https://kipalog.com/posts/He-sinh-thai-Docker

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

  1. Tính dễ dàng

    Scenario thế này: 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 đó.
    alt text

    1 ngày đẹp trời, thay vì vô github thì bạn lỡ gõ pỏnhub như 1 thói quen ( ͡° ͜ʖ ͡°) và dính virus. Bạn cay đắng nhận ra mình phải cài lại OS và cả cái đống tool kia. Mất toi 1 ngày quay tay, à nhầm, 1 ngày nghỉ ngơi thư giãn
    alt text
    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 "code tui 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 trên 40 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 (¬‿¬)

Bài viết này sẽ sử dụng laradock commit "d8c36ab" vào ngày 27/11/2018

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

alt text
Cùng nghía 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 - 7.1 - 7.0 - 5.6)

d) Nghía qua 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 mariadb

MARIADB_DATABASE=default
MARIADB_USER=default
MARIADB_PASSWORD=secret
MARIADB_PORT=3306
MARIADB_ROOT_PASSWORD=root
MARIADB_ENTRYPOINT_INITDB=./mariadb/docker-entrypoint-initdb.d

5 biến đầu cũng không có gì nhiều để giải thích. MARIADB_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 mariadb/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/laravel1/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 ...)

g) Tạo https cho môi trường local (Optional)

Dĩ nhiên là https này chỉ là hàng fake China thôi, nhưng mà dù sao cũng sẽ có được chữ https (bị gạch đỏ) trên trình duyệt.
Việc tạo https thật (và free) sẽ được trình bày sau trên môi trường production.

Đầu tiên cd vào thư mục nginx/ssl
Tạo file key:
openssl genrsa -des3 -out myssl.key 4096
Tạo file csr:
openssl req -new -key myssl.key -out myssl.csr
Bước này sẽ yêu cầu bạn nhập 1 số thông tin, cứ nhập đại vô. Khi yêu cầu passphrase thì cứ gõ vào 1 passphrase đơn giản. Ta sẽ loại bỏ passphrase ở bước sau:
cp myssl.key myssl.key.org && openssl rsa -in myssl.key.org -out myssl.key
Tạo file crt
openssl x509 -req -days 365 -in myssl.csr -signkey myssl.key -out myssl.crt
Giờ bạn sẽ có 4 file myssl.crt, myssl.csr, myssl.key và myssl.key.org trong thư mục. Ta sẽ dùng 2 file là myssl.crt và myssl.key để làm certificate cho https
Sửa lại laravel1.conf như sau

server {

    # listen 80 default_server;
    # listen [::]:80 default_server ipv6only=on;

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

    server_name laravel1.local;
    root /var/www/laravel1/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/laravel1_error.log;
    access_log /var/log/nginx/laravel1_access.log;
}

server {
    listen 80;
    server_name laravel1.local;
    return 301 https://$host$uri;
}

Nếu không có block cuối, khi gõ http//laravel1.local, trang của bạn sẽ là http. Block server cuối trong file conf giúp tự động redirect các http request vào https.

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ài dài vãi loằn rồi, mình viết còn thấy mệt. Thôi start lên nào. Vào thư mục laradock gõ
docker-compose up -d nginx mariadb adminer 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.

Đã 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 laravel1 cd laravel1
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=mariadb
DB_PORT=3306
DB_DATABASE=${MARIADB_DATABASE}
DB_USERNAME=${MARIADB_USER}
DB_PASSWORD=${MARIADB_PASSWORD}

các thông số của mariadb đượ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 nào (☞ ͡° ͜ʖ ͡°)☞
alt text

truy cập database qua đường dẫn laravel1.local:8080
alt text

alt text

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.

Phần tiếp theo sẽ là triển khai nhiều dự án laravel + wordpress với laradock trên môi trường local

[Phần 2]: Multi site trên laradock local

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

certainlyT

3 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
3 0
Phần 3]: Triển khai dự án laravel với laradock trên môi trường production Tiếp theo (Link), lần này ta sẽ triển khai một dự án laravel trên môi tr...
certainlyT viết 10 tháng trước
3 0
Male avatar
2 0
Phần 2]: Multi site trên laradock local Phần này ta sẽ tiếp tục những gì đã làm ở (Link). Ta sẽ triển khai thêm 2 project laravel: laravel2 với cấ...
certainlyT viết 10 tháng trước
2 0
Bài viết liên quan
White
0 4
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết hơn 1 năm trước
0 4
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 10 tháng trước
2 0
White
23 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết 3 năm trước
23 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!