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

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

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

Phần này ta sẽ tiếp tục những gì đã làm ở phần 1. Ta sẽ triển khai thêm 2 project laravel: laravel2 với cấu hình mariadb giống laravel1; laravel3 với cấu hình mariadb khác và 1 project wordpress.

Việc đầu tiên cần làm là bạn hãy clone về thêm 2 project laravel, đặt tên lần lượt là laravel2 và laravel3, 1 project wordpress vào thư mục web.

Tổng quan, để triển khai 1 project mới, ta cần làm những bước sau:

  • Tạo mariadb mới
  • Cho container mariadb start lên bằng câu lệnh docker-compose up -d mariadb_abc
  • Chỉnh sửa file .env của project đó để sử dụng đúng mariadb
  • Chạy các câu lệnh cần thiết (composer, npm ...) trong workspace
  • Tạo file conf cho nginx (tạo https fake cho local)
  • Restart container nginx bằng câu lệnh docker-compose restart nginx
  • Thêm dns trong file /etc/host

Khi đó laradock sẽ có cấu trúc như sau:

alt text

  • Request sẽ được đưa nginx xử lý và sử dụng đúng code cho mỗi site.
  • Php-fpm container sẽ là người xử lý code php và ghi các thay đổi data xuống đúng mariadb
  • Workspace được "volume" với các code, dùng để cài đặt các gói cần thiết
  • Adminer sẽ là container đứng trung gian để giúp người dùng có thể truy cập trực tiếp các mariadb container. Nếu bạn tắt adminer đi thì không thể truy cập được database từ ngoài vào (môi trường production sẽ khuyến khích bạn làm vậy)

Lý thuyết đủ rồi, bắt tay vào làm nào

1) Build laravel2

Theo đúng trình tự trên, ta sẽ làm theo đầy đủ các bước trên. Ta vào thư mục laradock để bắt đầu chỉnh sửa

a) Tạo mariadb_laravel2:

Thêm đoạn sau vào file docker-compose.yml. 1 lưu ý nhỏ là file yaml không nhận tab nên bạn phải dùng space nhé

    mariadb_laravel2:
      build: ./mariadb
      volumes:
        - ${DATA_PATH_HOST_LARAVEL2}/mariadb:/var/lib/mysql
        - ${MARIADB_ENTRYPOINT_INITDB_LARAVEL2}:/docker-entrypoint-initdb.d
      ports:
        - "${MARIADB_PORT_LARAVEL2}:3306"
      environment:
        - MYSQL_DATABASE=${MARIADB_DATABASE_LARAVEL2}
        - MYSQL_USER=${MARIADB_USER_LARAVEL2}
        - MYSQL_PASSWORD=${MARIADB_PASSWORD_LARAVEL2}
        - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD_LARAVEL2}
      networks:
        - backend

Ở dòng build: ./mariadb bạn có thể thấy ta đang build mariadb_laravel2 cùng thư mục với mariadb, tức là cấu hình lúc đầu của cả 2 đều giống nhau (được build từ cùng 1 source).

Thêm đoạn sau vào file .env

DATA_PATH_HOST_LARAVEL2=~/.laradock/data_laravel2
...
MARIADB_DATABASE_LARAVEL2=laravel2
MARIADB_USER_LARAVEL2=laravel2
MARIADB_PASSWORD_LARAVEL2=secret
MARIADB_PORT_LARAVEL2=3307
MARIADB_ROOT_PASSWORD_LARAVEL2=root
MARIADB_ENTRYPOINT_INITDB_LARAVEL2=./mariadb_laravel2/docker-entrypoint-initdb.d

Các biến khác nhau của mariadb_laravel2 phân biệt nó với mariadb. Nếu có file sql có sẵn thì bạn chỉ việc bỏ vào mariadb_laravel2/docker-entrypoint-initdb.d để start lên. Db của mariadb_laravel2 cũng sẽ được lưu trữ trong ~/.laradock/data_laravel2

b) docker-compose up -d mariadb_laravel2

alt text

c) Chỉnh sửa file .env của laravel2 như sau

DB_CONNECTION=mysql
DB_HOST=mariadb_laravel2
DB_PORT=3306
DB_DATABASE=laravel2
DB_USERNAME=laravel2
DB_PASSWORD=secret

d) Chạy các câu lệnh cần thiết

docker-compose exec --user=laradock workspace bash để vào workspace. Vào thư mục laravel2
Sau đó chạy composer install, php artisan key:generatephp artisan migrate
alt text

e) Tạo file laravel2.conf

Tạo file larvel2.conf trong nginx/sites với nội dung như sau:

server {

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

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

    server_name laravel2.local;
    root /var/www/laravel2/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/laravel2_error.log debug;
    access_log /var/log/nginx/laravel2_access.log;
}

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

Hiện tại thì mình đang dùng chung certification (myssl.crt và myssl.key) với laravel1.local. Sau này khi triển khai thật ở môi trường production thì bạn có thể cho mỗi site dùng 1 certification riêng.

f) docker-compose restart nginx

g) Thêm dns vào /etc/hosts

Thêm dòng sau vào file /etc/hosts
laravel2.local 127.0.0.1

Để chắc rằng mình đang sử dụng code của laravel2 và mariadb_laravel2, ta vào thư mục laravel2/resources/views và sửa file welcome.blade.php

...
            <div class="content">
                <div class="title m-b-md">
                    This is Laravel 2
                </div>

        <?php
            echo "Laravel 2 is using " . "<br/>\r\n";
            echo "Host: " . Config::get('database.connections.mysql.host') . "<br/>\r\n";
            echo "Database: " . Config::get('database.connections.mysql.database') . "<br/>\r\n";
        ?>

                <div class="links">
                    <a href="https://laravel.com/docs">Documentation</a>
                    <a href="https://laracasts.com">Laracasts</a>
                    <a href="https://laravel-news.com">News</a>
                    <a href="https://nova.laravel.com">Nova</a>
                    <a href="https://forge.laravel.com">Forge</a>
                    <a href="https://github.com/laravel/laravel">GitHub</a>
                </div>
            </div>
 ...

Mở chrome lên và tận hưởng laravel2.local nào

alt text

Vậy là ta đã start xong laravel2 với mariadb_laravel2 riêng biệt.

2) Start laravel3

Okay, giờ là đến project laravel3. Các bước triển khai cũng giống y như trên nhưng cấu hình khi start lên sẽ khác nên phần này mình sẽ chỉ trình bày bước 1.

Ví dụ ở trường hợp này mình cần set table_definition_cache=1024 cho mariadb_laravel3.

Đầu tiên, copy thư mục mariadb thành mariadb_with_table_cache
cp -r mariadb mariadb_with_table_cache

Vào thư mục mariadb_with_table_cache và thêm dòng sau vào my.cnf:
table_definition_cache=1024

Thêm đoạn sau vào file docker-compose.yml

    mariadb_laravel3:
      build: ./mariadb_with_table_cache
      volumes:
        - ${DATA_PATH_HOST_LARAVEL3}/mariadb:/var/lib/mysql
        - ${MARIADB_ENTRYPOINT_INITDB_LARAVEL3}:/docker-entrypoint-initdb.d
      ports:
        - "${MARIADB_PORT_LARAVEL3}:3306"
      environment:
        - MYSQL_DATABASE=${MARIADB_DATABASE_LARAVEL3}
        - MYSQL_USER=${MARIADB_USER_LARAVEL3}
        - MYSQL_PASSWORD=${MARIADB_PASSWORD_LARAVEL3}
        - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD_LARAVEL3}
      networks:
        - backend

Ta sẽ build mariadb_laravel3 từ thư mục mariadb_with_table_cache. Nếu bạn có các project cần cấu hình tương tự thì chỉ việc build từ thư mục mariadb_with_table_cache

Thêm vào file .env

DATA_PATH_HOST_LARAVEL3=~/.laradock/data_laravel3
...
MARIADB_DATABASE_LARAVEL3=laravel3
MARIADB_USER_LARAVEL3=laravel3
MARIADB_PASSWORD_LARAVEL2=secret
MARIADB_PORT_LARAVEL2=3308
MARIADB_ROOT_PASSWORD_LARAVEL3=root
MARIADB_ENTRYPOINT_INITDB_LARAVEL3=./mariadb_laravel2/docker-entrypoint-initdb.d

Và giờ ta chỉ việc start mariadb_laravel3 để chạy laravel3 ヽ(⌐■_■)ノ♪♬

3) Start wordpress

Okay, giờ đến phần vui. Mặc dù laradock = laravel + docker nhưng không có nghĩa là nó chỉ triển khai được cho laravel. Với những cấu hình như trên, bạn cũng có thể start 1 project wordpress của riêng mình. Lý do là các framework đó cũng chỉ cần db(mariadb), 1 reverse proxy (nginx) và php interpreter (php-fpm) để chạy. Với những service được cung cấp sẵn của laradock thì ngại gì mà không chạy

Tải source code wordpress về và để trong thư mục web.

Ta sẽ theo từng bước như trên để triển khai trang wordpress.local.

a) Tạo mariadb

File docker-compose.yml

    mariadb_wordpress:
      build: ./mariadb
      volumes:
        - ${DATA_PATH_HOST_WORDPRESS}/mariadb:/var/lib/mysql
        - ${MARIADB_ENTRYPOINT_INITDB_WORDPRESS}:/docker-entrypoint-initdb.d
      ports:
        - "${MARIADB_PORT_WORDPRESS}:3306"
      environment:
        - MYSQL_DATABASE=${MARIADB_DATABASE_WORDPRESS}
        - MYSQL_USER=${MARIADB_USER_WORDPRESS}
        - MYSQL_PASSWORD=${MARIADB_PASSWORD_WORDPRESS}
        - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD_WORDPRESS}
      networks:
        - backend

File .env

DATA_PATH_HOST_WORDPRESS=~/.laradock/data_wordpress
...
MARIADB_DATABASE_WORDPRESS=wordpress
MARIADB_USER_WORDPRESS=wordpress
MARIADB_PASSWORD_WORDPRESS=secret
MARIADB_PORT_WORDPRESS=3310
MARIADB_ROOT_PASSWORD_WORDPRESS=root
MARIADB_ENTRYPOINT_INITDB_WORDPRESS=./mariadb_wordpress/docker-entrypoint-initdb.d

b) docker-compose up -d mariadb_wordpress

c) Chỉnh sửa file wp-config.php

Đầu tiên copy file wp-config-sample thành wp-config
cp wp-config-sample.php wp-config.php

Sửa file wp-config.php

/** Tên database MySQL */
define('DB_NAME', 'wordpress');

/** Username của database */
define('DB_USER', 'wordpress');

/** Mật khẩu của database */
define('DB_PASSWORD', 'secret');

/** Hostname của database */
define('DB_HOST', 'mariadb_wordpress');

d) Chạy các câu lệnh cần thiết (nah, we don't need it)

e) Tạo file wordpress.conf

server {

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

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

    server_name wordpress.local;
    root /var/www/wordpress;
    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/wordpress_error.log debug;
    access_log /var/log/nginx/wordpress_access.log;
}

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

Nhớ thay đổi mục root thành /var/www/wordpress vì file index.php của wordpress nằm ngay trong thư mục wordpress

f) docker-compose restart nginx

g) Thêm dns vào /etc/hosts

wordpress.local 127.0.0.1

Sau đó vào địa chỉ wordpress.local, điền các thông tin cần thiết về username, password. Và đây là thành quả
alt text

Vậy là đã xong phần 2 với laradock. Ta có thể thấy với việc cung cấp các service có sẵn như vậy, ta có thể deploy rất nhiều các trang web hiện nay.

Tiếp theo sau sẽ là phần 3: triển khai trên môi trường production. Với môi trường production, 1 số điểm best practice sẽ được nhắc đến, cũng như hướng dẫn các bạn có https free cho website của mình

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
4 1
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 để tr...
certainlyT viết 11 tháng trước
4 1
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
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á!