Tự xây dựng môi trường phát triển cho Laravel với Docker
Chào các bạn vài năm gần đây chúng ta không còn quá xa lạ với cái tên docker. Trước khi Docker được sinh ra với laravel chúng ta phải sử dụng XAMPP hay là tự build môi trường LAMP, LEMP trên máy tính để có thể khởi chạy dự án, vì bản chất hướng client như vậy đã gây ra không ít khó khăn cho các project phát triển theo team, rất hay có các câu hỏi tại sao trên máy tôi chạy tốt còn máy bạn thì lại không được, tại sao trên local chạy tốt trên server lại chạy không được.
💥Bùm, docker sinh ra để giải quyết các vấn đề đó cho bạn. Bản thân mình khi phát triển dự án với Laravel một trong những công cụ yêu thích là Laradock rất nhanh phải không? Hừm @@ trông Laradock có vẻ phức tạp nhỉ ? Vậy tại sao mình lại không tự build một cái nho nhỏ nhỉ ?
Thôi không dài dòng thêm nữa chúng ta vào việc nào!
Giới thiệu
Trong dự án này mình sẽ build một LEMP Stack (Nginx, PHP và MYSQL)
Về phần cài đặt docker thì bạn lên trên trang chủ làm theo hướng dẫn nhé, vì phần cài đặt cho từng máy Windows, Mac và Linux khá khác nhau cho nên mình không hướng dẫn cụ thể ở đây.
Mình có để link vào trang chủ của Docker các bạn vào đó tải theo hệ điều hành của bác bạn .
https://docs.docker.com/desktop/
Một số khái niệm cần thiết
Image: bao gồm 1 môi trường và những thứ trong môi trường đó, ví dụ: Môi trường Ubuntu 16.04 + PHP 7.2 + MySQL 5.2
Container: là mội thực thể của Image nói trên. Có thể hiểu giống như lập trình OOP, Image là class còn Container nó chính là 1 Object được khởi tạo từ class.
Port: Vì các container trong Docker là độc lập hoàn toàn với môi trường thực bên ngoài để có thể truy cập vào bên trong container ta cần mở port để giao tiếp.
Volume: dùng để chia sẻ dữ liệu giữa máy host(ở đây là máy tính của mình) và container.
Network: Mặc định khi container được tạo ra nó sẽ sử dụng network là bridge nhưng chúng ta có thể tạo thêm network để tránh xung đột giữa các project chạy đồng thời do cùng chung network thì các container có thể kết nối được với nhau và sử dụng chung cổng sẽ gây ra lỗi.
Cấu trúc của dự án
Dự án này mình sẽ đặt theo cấu trúc thư mục như sau, nếu bạn thích bạn có thể sửa tùy thích.
my-project.test/
├── nginx/
│ └── default.conf
├── src/
│ └── (Đây là nơi chứa source code Laravel)
├── docker-compose.yml
└── Dockerfile
Sau khi tạo xong cấu trúc thư mục như trên, hãy mở nó trên 1 editor nhé.
Đầu tiên chúng ta mở file: docker-compose.yml
và thêm các dòng sau.
version '3'
networks:
laravel:
services:
Network: Mình tạo ra thêm network laravel (cái này là option nhé có thể tạo hay không cũng được).
Service: đây là nơi mình sẽ liệt kê các container cần thiết cho dự án: Nginx, MYSQL, PHP.
Thêm Nginx
Vẫn trong tệp tin docker-compose.yml
chúng ta thêm các dòng sau đây vào cuối tệp tin.
nginx:
image: nginx
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www
- ./nginx/default.conf:/etc/nginx/conf.d/defaut.conf
depends_on:
- php
- mysql
networks:
- laravel
Bạn có tự hỏi cái đống phía trên kia là gì nhỉ ?
Chúng ta nói với docker rằng tạo cho tạo 1 container tên là nginx và sử dụng:
Image: nginx (mặc định nếu bạn không ghi gì nó hiểu là bản latest).
Port: 8080(cổng trên máy host), 80(cổng trên container nginx).
Volumes: (dùng để ánh xạ dữ liệu như mình nói ở trên, nó giúp chia sẻ dữ liệu từ máy host vào bên trong cái container).
Ví dụ: ./src:/var/www
: ./src thư mục của máy host, /var/www thư mục tồn tại trong container, bất cứ file nào tồn tại trên thư mục ./src ở máy host đều tồn tại bên trong thư mục /var/www (hiểu nó là sharing file đó). Nếu bạn xóa container đi thì dữ liệu đã được ghi trong thư mục đó sẽ vẫn còn.
depends_on: chỉ ra sự phụ thuộc, container này sẽ run khi 2 container mysql và php được run trước.