Lời tựa
Đây là một phần quan trọng mà mình tin nó cũng là key để thuyết phục mọi người dùng Laravel Sail thay vì stack AMP truyền thống như Laragon. Cơ mà dạo này lu bù quá, giờ mới viết lách xíu được, hi vọng vẫn tới tay mọi người
Vấn đề đã theo mình từ lúc mình để ý tới Docker, đó là quản lý tài nguyên! Laravel Sail mặc định đi kèm với Mysql, Redis, MailHog, mấy cái này là services đáng nói thôi chứ mình chưa nhắc tới mấy cái như supervisor các kiểu. Hãy tưởng tượng chúng ta cần mở 3 cái project Sail để dev, mỗi cái có 3 cái Mysql, 3 cái Redis, 3 cái MailHog, mỗi cái nó đòi vài trăm mb ram và kha khá space ổ cứng để lấy image, nghe hơi xót nhỉ Cái này hoàn toàn là vấn đề của Docker, đến nước này thì Laravel ko giúp đc gì quá nhiều rồi, nên mình kêu gọi sự hỗ trợ của 1 bên nữa, 1 package của tighten.co, đó là Takeout
Takeout là cái gì thế?
Takeout, giống như Sail, cũng là một công cụ để quản lý, sử dụng Docker một cách tiện lợi hơn. Nhưng mục tiêu của nó là tạo ra 1-container-duy-nhất cho mỗi service cơ bản, và có thể chia sẻ nó với tất cả local project của bạn, dù project đó có xài Docker hay không. Nghe quen không Nó giống gần như kiểu một services stack như XAMPP nhưng dùng Docker ấy mà! Thời điểm mình viết bài này thì Takeout đang hỗ trợ các services như thế này
Thấy tiềm năng chứ? Kể cả không dùng Laravel Sail cũng có vẻ hay hay đúng không
Cách sử dụng
Chúng ta cần cài đặt Takeout ở mức global
, tức là dùng ở đâu cũng được chứ ko giới hạn trong 1 project Laravel, bằng câu lệnh:
composer global require tightenco/takeout
Rồi, chúng ta đã có thể gọi takeout từ mọi nơi trên terminal Cùng điểm qua vài lệnh của Takeout nào. Đầu tiên, để soi xem chúng ta có thể có những services nào mà dùng, hãy gọi lệnh bên dưới, một list hiện ra và các bạn có thể dùng phím navigation, ấn lên lên xuống xuống để chọn rồi ấn enter!
takeout enable
Ngoài ra các bạn có thể enable 1 hoặc nhiều service bằng cách truyền thêm short name của nó
takeout enable mysql takeout enable redis mongodb
Trong quá trình enable, sẽ có vài câu hỏi hiện ra, ví dụ như bạn muốn mở service này ở cổng nào, data save của nó tên gì,... tự các bạn điền nhé, ấn enter luôn để dùng cái giá trị default trong ngoặc vuông, hoặc lười quá thì thêm option --default
vào để skip hết câu hỏi và dùng giá trị default luôn
takeout enable mysql --default takeout enable redis mongodb --default
Để tắt hẳn service, chúng ta có câu lệnh disable
takeout disable # chọn và tắt một service takeout disable --all # tắt hết tất cả service
Các bạn có thể coi link git của Takeout để coi hết giới thiệu và câu lệnh của nó nhé
Cùng thử với MySQL nào
Mặc định thì Sail đang xài MySQL v8, mình sẽ thử setup MySQL với Takeout
takeout enable mysql --default
Chúng ta vừa khởi động MySQL bản mới nhất hiện tại - chính là 8.0, tại port 3306 với tên volumn là mysql_data
. Hiện các bạn có thể connect thử với nó thông qua HeidiSQL hay phpmyAdmin chẳng hạn. Mình thì thử nhanh với CLI luôn, bạn nào muốn làm giống mình thì cố gắng cài mysql-client
nhé. Mình đang xài wsl2-ubuntu nên mình cần cài
sudo apt install mysql-client
Sau khi cài xong, bình thường mình sẽ xài mysql
, cơ mà mình xài wsl2 nên mình cần define host là 127.0.0.1
thay vì mặc định (là localhost
thì phải)
mysql -uroot -p -h 127.0.0.1
Nếu mọi thứ trôi chảy, thì bạn đang vào giao diện của mysql-client
, tại đây chúng ta sẽ tạo nhanh database cho project của chúng ta nào
create database example_app;
Laravel Sail và Tighten Takeout song kiếm hợp bích
OK, coi như 2 thằng đã hoạt động, cho nó kết hợp nào. Đầu tiên, mở file docker-compose.yml
bên trong project của các bạn lên, chúng ta sẽ cố gắng tắt mysql, redis, mailhog được cung cấp bởi Sail, bằng cách xóa hoặc comment lại hết mấy đoạn liên quan tới bọn nó.
Để kết nối Sail với Takeout, chúng ta cần thêm 1 network
nữa trong docker-compose.yml
. Các bạn kéo xuống chỗ networks
và thêm 1 mục nữa
takeout external: name: takeout
Giờ cái networks của chúng ta nó thành như này
Giờ kéo lên trên, tìm tới services, bên trong đó, tìm tới networks và thêm 1 cái - takeout
nữa
Lưu hết lại và chạy lại sail up -d
. Project của chúng ta hẳn đã kết hợp tốt với Takeout rồi. Ơ mà rồi xài mấy cái service làm sao? Thời điểm này các bạn gõ takeout list
Thấy 2 cột "Base Alias" và "Full Alias" chứ? Chúng ta có thể sử dụng 1 trong 2 cái đó để điền vào file .env
của chúng ta. Mà hiện nó cũng đang là mysql
rồi nên chỉ sửa credentials nữa là xong.
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=example_app
DB_USERNAME=root
DB_PASSWORD=
Chạy thử sail artisan migrate
nào!
Ò có vẻ chạy rồi
Vậy các bạn mò tiếp nhé, mình lại lượn đây =]]