Bài này mình xin trình bày không cụ thể về cách sử dụng laravel project với docker dùng docker-compose.
1. Yêu cầu.
- Bạn phải biết dùng cơ bản về docker, docker-compose.
- Bạn phải cài đặt docker trên máy trước.
- Muốn cho một project web PHP như laravel chạy được thì bạn phải có các thứ sau: PHP, hệ cơ sở dữ liệu như mysql, máy chủ web như apache hoặc nginx (bài này dùng nginx), đối với laravel thì phải cần thêm composer(là tool để quản lý các thư viện php). Nếu bạn từng cài đặt LAMP trước đây thì LAMP là viết tắt của 4 thứ phải cài đặt đó linux, apache, mysql và php)
- Bài này sẽ không cài đặt bất cứ gì như PHP, nginx, mysql, composer vào môi trường máy của bạn mà chúng sẽ được cài vào các container docker.
- Để sử dụng laravel với docker, ta không xậy dựng một container chứa tất cả các thứ từ PHP, composer, nginx,... mà cần tách chúng ra như sau cho dễ quản lý về sau:
- Container composer: Là container chứa tool composer để có thể chạy câu lệnh composer.
- Container chứa PHP: để có thể chạy được mã nguồn.
- Container chứa nginx: Là máy chủ web để người dùng có thể truy cập web bạn từ browser.
2. Cài đặt.
Giả sử bạn đã có source code một project laravel trên máy hoặc kéo từ github của bạn về.
Nếu bạn muốn tạo một project laravel mới từ đầu thì download laravel project từ địa chỉ https://github.com/laravel/laravel/archive/v5.3.16.tar.gz về rồi giải nén, đổi tên thành tên project bạn muốn.
2.1. Download container composer.
Chạy câu lệnh trên để download composer image từ docker hub về.
2.2. Download thư viện liên quan của project.
Vào thư mục project của bạn và chạy câu lệnh sau để cài đặt các thư viện liên quan cho framework:
"/app" ở trên là thư mục mặc định có trong container composer.
2.3. Tạo file docker-compose.yml
File docker-compose.yml chính là file để build lên toàn hệ thống của bạn. Bạn có thể đặt file này ở đâu bạn muốn, không nhất thiết là phải ở trong project của bạn.
File docker-compose.yml sẽ có nội dung như sau:
File này chứa 3 phần tương đương với 3 hệ thống là môi trường chạy web của bạn "app" (là môi trường cài PHP), môi trường máy chủ web "web" (là nginx) và môi trường chạy CSDL "database" (là mysql).
Trong file trên bạn chú ý một số điểm:
- "context: ." chính là đường dẫn tới file Dockerfile của bạn được đặt so với file docker-compose.yml, ở đây file app.dockerfile và web.dockerfile được đặt cùng thư mục với file docker-compose.yml nên để context là "." (2 file app.docker và web.docker sẽ được trình bày phía dưới).
- "8080:80" trong phần ports nghĩa là bạn sẽ map cổng 8080 từ máy của bạn vào cổng 80 trong container tương ứng (ở đây là container tên web). Bình thường khi bạn truy cập browser một địa chỉ trang web nào đó thì nó mặc định là cổng 80 vì giao thức http có cổng mặc định là 80.
Bạn muốn truy cập web của bạn trên local thì phải truy cập vào cổng 80 của container web này, nhưng cổng 80 của container web và cổng 80 trên máy bạn là 2 cổng không liên quan tới nhau, khi bạn gõ url một trang web nào đó vào thanh địa chỉ của browser thì mặc định đang truy cập thông qua cổng 80 của máy bạn. Vì thế bạn nên map từ cổng 8080 của máy bạn vào cổng 80 của container web để từ trình duyệt khi truy cập vào địa chỉ "0.0.0.0:8080" là bạn có thể truy cập vào web chạy project của bạn(0.0.0.0 là địa chỉ IP mặc định của docker).
- Giá trị của các environment trong database container bạn nên để là homestead và secret, còn giá trị thực sự của nó thì bạn config ở trong file .env của project ấy.
2.4. Tạo file app.dockerfile
Đây chính là file cấu hình cài đặt PHP:
2.5. Tạo file web.dockerfile
Đây chính là file cấu hình cài đặt nginx:
File vhost.conf là file cấu hình cho nginx, nội dung file vhost.conf như sau:
3. Chạy chương trình.
Sau khi làm xong các bước trên, giờ bạn chỉ cần khởi động chương trình thôi:
Lần đầu tiên chạy sẽ mất khoảng vài phút để xây dựng các container, nhưng từ lần thứ 2 trở đi sẽ phát lên luôn thôi :).
Chú ý:
- Khi bạn sửa đổi một file dockerfile (app.dockerfile, web.dockerfile) nào thì bạn phải chạy câu lệnh sau để build lại hệ thống:
- Khi đã khởi động hệ thống rồi thì bạn có thể vào trong các container để thực hiện các câu lệnh cho thoải mái. Ví dụ bạn muốn chạy câu lệnh "php artisan migrate --seed" thì có 2 cách:
Cách 1 là thực thi nó từ ngoài máy chủ mà không cần phải vào container:
Cách 2 là vào container app và thực thi:
- Bạn nên tạo một alias rút gọn trong file bash để thuận tiện, ví dụ bạn có thể rút gọn thành như sau:
Khai báo alias cho phần "docker-compose exec app" bằng "phpd", sau đó chạy:
Nguồn tham khảo:
https://medium.com/@shakyShane/laravel-docker-part-1-setup-for-development-e3daaefaf3c