Hướng dẫn scale Laravel horizontally với Docker
Homestead đã được tạo ra bởi Taylor (người tạo ra Laravel) để dễ dàng tạo ra các môi trường phát triển PHP, nó cung cấp một môi trường phát triển ổn định qua các dự án và hoàn toàn tương thích với Laravel. Vậy Docker là gì? Tạo sao ta nên sử dụng nó? Docker về cơ bản là một programmable ...
Homestead đã được tạo ra bởi Taylor (người tạo ra Laravel) để dễ dàng tạo ra các môi trường phát triển PHP, nó cung cấp một môi trường phát triển ổn định qua các dự án và hoàn toàn tương thích với Laravel.
Vậy Docker là gì? Tạo sao ta nên sử dụng nó?
Docker về cơ bản là một programmable infrastructure (tạm dịch là cơ sở hạ tầng có thể lập trình), hoặc đơn giản hơn: Docker cho phép bạn tạo ra một môi trường Server cho dự án của bạn từ một file cấu hình. Với Docker bạn luôn luôn chạy với cùng một môi trường bất kể ở production, development hay testing. Khi môi trường của bạn được quản lý bởi một file, nó được kiểm tra với tính nhất quán trên cơ sở kiểm soát source và thậm chí cả các phiên bản khác nhau của codebase.
Tại sao điều này lại quan trọng
Bạn đã bao giờ làm việc với một dự án và nghe đến cụm từ "tốt, nó hoạt động trên máy tính của tôi". Các nhà phát triển thường sẽ cài đặt dependancies dịch vụ như RabbitMQ, Redis, MySQL và ElasticSearch để hỗ trợ trong một dự án. Hiện nay, họ phải thông báo cho tất cả các nhà phát triển của mỗi dependancy hoặc chia sẽ máy ảo với dung lượng lớn. Đây có thể là một cơn ác mộng, thậm chí không đề cập đến xung đột phiên bản giữa phụ thuộc và giữa các phiên bản khác nhau của codebase. Phức tạp đến mức độ thứ n ...
Docker containers
Docker tách riêng mỗi tiến trình đang chạy trên một máy chủ linux vào containers. Ví dụ bạn có thể có container chạy PHP-FPM, MySQL, và Redis. Các quá trình này (đọc containers) tất cả chạy trong một môi trường hoàn toàn cô lập, không có xung đột. Container có thể chạy trên máy chủ cùng với một máy chủ khác hoặc thậm trí một nhà cung cấp đám mây (cloud)
Ví dụ
Tôi sẽ minh chứng sức mạnh của Docker thông qua một công cụ được gọi là Docker Compose - một công cụ được xây dựng trên Docker. Công cụ này cho phép chúng ta bắt đầu nhiều container Docker cùng một lúc từ một tập tin cấu hình duy nhất.
Đầu tiên hay cài đặt Docker toolbox
Tiếp theo hãy clone phiên bản cài đặt mới của Laravel:
git clone https://github.com/laravel/laravel.git cd laravel composer install --prefer-dist
Khi Laravel được clone xong và cài đặt xong caics dependancies, sử dụng một editor và tạo một file có tên docker-compose.yml trong thư mục root của project với nội dung sau:
load_balancer: image: tutum/haproxy links: - web ports: - "80:80" cache: image: redis database: image: mysql environment: - MYSQL_ROOT_PASSWORD=SuperSecretPassword123 - MYSQL_DATABASE=laravel web: image: andrewmclagan/nginx-hhvm links: - database - cache volumes: - ./:/var/www environment: - APP_ENV=production - DB_DATABASE=laravel - DB_PASSWORD=SuperSecretPassword123 - VIRTUAL_HOST=laravel.local
Chúng ta cũng cần bắt đầu một Docker Machine để lưu trữ các containers, như OSX và Windows không hỗ trợ các linux containers tại thời điểm hiện tại. Với Docker thì không có sự khác biệt từ tương tác với một nhà cung cấp đám mây từ xa. Docker có trình điều khiển cho tất cả các nhà cung cấp cloud lớn. Trong bài viết này chúng tôi sẽ sử dụng VirtualBox để bắt đầu một máy cục bộ.
docker-machine create laravel-app-host --driver virtualbox
Hãy chắc chắn rằng bạn chỉnh sửa file hosts để phản ánh các máy chủ, tôi đã tạo ở trên laravel.local. Docker của bạn có thể có địa chỉ IP khác:
# /etc/hosts file 192.168.99.100 laravel.local # the IP of your docker-machine
Để bắt đầu ứng dụng Laravel đơn giản bằng cách gõ như sau tại thư mục root của project:
docker-compose up
Docker sẽ tải về tất cả các layer cho mỗi services, load_balancer, bộ nhớ cache, cơ sở dữ liệu của chúng tôi và PHP HHVM. Sau đó khởi động một container cho mỗi dịch vụ.
Nó sẽ mất một chút thời gian cho lần đầu tải về tất cả layers cho mỗi container, mặc dù nó nhanh hơn nhiều so với Homestead VM. Lần tới sử dụng thì nó sẽ khởi động nhanh như chớp =))!
Khi khởi động xong hay truy cập: http://laravel.local để xem ứng dụng Laravel của bạn. Để dừng các containers nhấn ctrl + C hoặc gõ command sau:
docker-compose stop
Horizontally scaled Laravel một cách dễ dàng
Giả sử bạn có một trang web có lượng truy cập cao hoặc đang chạy ứng dụng quan trọng đòi hỏi 99,99% thời gian hoạt động. Bạn sẽ cần scale ứng dụng Laravel trên nhiều servers nhằm cung cấp dịch vụ một cách xuyên suốt. Chạy với một load-balancer như HAProxy hay Nginx. Vậy làm thế nào để quản lý nó, khi lượng truy cập giảm xuống bạn cần thu nhỏ lượng scale instants xuống. Với Docker thì điều này khá đơn giản. Với các containers dừng scale server:
docker-compose scale web=3 docker-compose up
Hiện nay chúng ta không thể nhìn thấy web container được phục vụ dưới load balancer, cho phép chỉnh sửa nó. Hay thêm vào resources/views/welcome.blade.php những dòng sau:
<div class="content"> <div class="title">Laravel 5</div> <h3>{{ gethostname() }}</h3> </div>
Lưu file và truy cập lại trang laravel.local bạn sẽ thấy các hostname của container mà server request. Hãy refresh trang và xem sự thay đổi hostname. Như vậy bạn đã có một hệ thống tự động mở rộng theo chiều ngang của Laravel.
Để kiểm tra fail-over, chúng ta có thể sử dụng docker để dùng một trong số containers như sau:
docker ps
tìm một container theo tên và dừng nó:
docker stop laravel_web_2
Refresh lại trang và bạn sẽ thấy có một container down và web của chúng ta vẫn chạy ngon lành.
Bài viết gốc
How to scale Laravel horizontally with Docker