Hãy tưởng tượng mình có 1 con APP cần API và mình dùng Laravel Framework viết API. Trong dự án này mình dự định sẽ sử dụng php, laravel, nginx, redis, mysql và supervisord. Chúng ta sẽ bắt đầu từ bước khi mình đã code xong dự án rồi mà mình muốn sử dụng Docker để deploy dự án đó. Mình sẽ dụng docker compose để có thể chạy multi-container.
Hãy xem cấu trúc thư mục của mình.
Mình sẽ mô tả cấu trúc thư mục và file.
– Thư mục code: Thư mục này mình dùng để chứa code, hiện tài mình để tên project là api và project này sử dụng Laravel Framework ^9.0. Trong project này thì mình chỉ thêm 1 vài route cho client test redis, mysql và queue
– Thư mục command: Thư mục này chứa các command mình sẽ copy vào trong container. Hiện tại chỉ có 1 command api để deploy code. Ví dụ như composer install, php artisan migrate,…
– Thư mục deploy: Thư mục này chứa command api. Ví dụ để CI/CD mình có sử dụng jenkins, khi repository có sự thay đổi jenkins có thể sẽ lấy code về hoặc build 1 image nào đó… sau đó run command api này của mình. (Trong VD này của mình không có jenkins mình chỉ ví dụ vậy để mô tả file này chạy khi nào)
– Thư mục dockerfiles: Thư mục này chứa các Dockerfile của mình để build image. Hiện tại sẽ có 4 file để mình build 4 image redis, mysql ,php và nginx.
– Thư mục nginx: Thư mục này hiện đang chứa thông tin config nginx.conf được sử dụng để mount vào container và ghi đè config mặc định của nginx, nguyên nhân ghi đè là mình cần update lại user process, bên trong còn có thêm 1 file để config cho site của mình là nginx-sites-api.conf. Thêm nữa trong thư mục còn chứa command start hiện mình dùng để add group, user và update permission nếu cần thiết, trong file còn có command để replace file nginx.conf với biến env. (Nguyên nhân tạo ra command start là do để start container có quá nhiều lệnh phải chạy nên mình tạo ra 1 file bash)
– Thư mục php: Thư mục này hiện tại chứa thông tin file config www.conf và supervisord.conf 2 file này mình sẽ mount vào trong container, đối với file www.conf thì hiện tại mình có update lại thông tin user và group run process. Còn file supervisord.conf chứa thông tin config cần thiết để test queue trong Laravel Project. Trong thư mục này cũng có command start hiện mình dùng để add group, user, thêm mới thư mục và update permission nếu cần thiết đồng thời sẽ run supervisord với file config supervisord.conf mình đã mount vào trong container. (Nguyên nhân tạo ra command start là do để start container có quá nhiều lệnh phải chạy nên mình tạo ra 1 file bash)
– Thư mục redis: Thư mục này hiện tại chứa thông tin file config redis, file này mình chưa cần sửa gì nhưng mình cứ thêm vào nếu cần sửa gì bạn có thể sửa và build lại image.
– File .env.example: File này chứa thông tin environment của mình để mình sử dụng cho 2 file docker-compose.yaml và docker-compose.product.yaml khi pull project về thì sẽ cần tạo ra file .env từ file .env.example này.
– File docker-compose.yaml: File này hiện mình dùng để sử dụng cho môi trường develop, mình dùng nó để build image khi có thay đổi và push image lên Docker hub
– File docker-compose.product.yaml: File này hiện mình sử dụng trên môi trường product pull image từ Docker hub về và run container
OK mình đã mô tả xong. Nếu bạn muốn thử nghiệm hoặc muốn xem project này bạn có thể truy cập vào đường dẫn bên dưới, trường hợp bạn muốn thử nghiệm hãy làm theo hướng dẫn tại mục “Setup Test“, trong project các file command, dockerfile, docker-compose mình có mô tả về những gì mình tìm hiểu được bên trong file. Hiện tại mình có để 2 branch
- Branch main: mình setup config nginx không có ssl
- Branch ssl: mình setup config nginx ssl và sử dụng Certbot create ssl. Test thử ssl bạn cần sửa lại các thông tin domain, thông tin config ssl trong file config
/nginx/site/nginx-sites-api.conf
Link github: https://github.com/quyenvkbn/laravel-docker
Trên đây là nội dung mình muốn chia sẻ về cấu trúc thư mục file cũng như tác dụng của từng file khi mình sử dụng Docker, Docker compose cho Laravel Project.
Cảm ơn các bạn đã đọc!