Hướng dẫn docker-php-ext-enable sodium - docker-php-ext-enable natri
Trong hướng dẫn này, tôi sẽ trình bày cách thiết lập môi trường phát triển PHP, cách thiết lập với Docker. Show Nội dung chính
Có rất nhiều cách để cài đặt môi trường PHP, nhưng sử dụng Docker là cách tốt nhất hiện tại. Dưới đây là một vài cách mọi người đã dùng để cài đặt môi trường phát triển PHP của họ trong những năm qua Kiến thức cơ bản1. Cài đặt thủ công PHP, MySQL và Apache 2. Các gói được cấu hình sẵn như XAMPP 1. Cài đặt thủ công PHP, MySQL và Apache2. Các gói được cấu hình sẵn như XAMPP 3. Máy ảo và Vagrant 2. Các gói được cấu hình sẵn như XAMPP3. Máy ảo và Vagrant Giới thiệu Docker Cài đặt 3. Máy ảo và VagrantGiới thiệu Docker Cài đặt Chuẩn bịBắt đầu docker-compose.yml cho NGINX Chạy service Tại sao không phải là Apache Đưa file lên máy chủ Kết luận Có rất nhiều cách để cài đặt môi trường PHP, nhưng sử dụng Docker là cách tốt nhất hiện tại.
Giới thiệu DockerDocker giải quyết tất cả các vấn đề được liệt kê ở trên. Nhưng Docker là gì và nó hoạt động như thế nào? Có khá nhiều bài viết nói về Docker nên tôi sẽ không đề cập quá chi tiết lý thuyết. Lợi ích thiết thực đối với nhà phát triển web là Docker cho phép chúng ta đóng gói mọi thứ mà trang web cần, tất cả mã PHP cùng với tệp thực thi PHP, máy chủ MySQL và máy chủ NGINX và các tệp cấu hình được sử dụng bởi các chương trình đó. Tất cả code của trang web và các phiên bản của chương trình cần để chạy mã đó được đóng gói cùng nhau, coi như là một ứng dụng duy nhất. Toàn bộ ứng dụng này sau đó có thể được chạy trên bất kỳ hệ điều hành nào. Khi ai đó chạy ứng dụng được đóng gói, PHP, MySQL, NGINX và tất cả các tệp PHP bạn đã viết đều được nhúng vào chính ứng dụng đó. Khi bạn chạy ứng dụng, các phiên bản chính xác của các công cụ này sẽ được tải xuống và cài đặt. Với Vagrant, khi đang chạy Máy ảo, hệ điều hành đã bao gồm phiên bản PHP, MySQL cố định và cấu hình máy chủ (thường) được sao chép từ máy chủ web thực. Khi máy chủ được cập nhật, máy ảo cũng phải được cập nhật. Tuy nhiên, khi sử dụng Docker, phiên bản PHP / MySQL / NGINX được cung cấp dưới dạng một gói duy nhất được gọi là 3 và máy chủ có thể chạy nhiều image khác nhau tùy thích.Lợi ích ở đây là máy chủ web và máy local của bạn đều chạy cùng một image. Bạn chỉ cần tải image của mình lên máy chủ web, chạy toàn bộ ứng dụng ở đó và trang web của bạn hoạt động mà không cần bất kỳ cấu hình máy chủ web nào. Ngoài ra, mỗi image sẽ hoàn toàn tách biệt với image khác trên máy chủ. Mỗi trang web sẽ có cấu hình NGINX riêng, php.ini riêng và các bản cài đặt PHP và MySQL riêng. Mỗi trang web có thể chạy các phiên bản PHP hoàn toàn khác nhau. Bạn thậm chí có thể có một trang web chạy trên Apache và một trang web chạy trên NGINX, trên cùng một máy cùng một lúc. Ngay cả khi bạn đang chạy hai trang web NGINX khác nhau, bạn sẽ có hai process NGINX khác nhau, với các cấu hình riêng, chạy cùng một lúc. Điều này yêu cầu chi phí bộ nhớ không nhỏ, nhưng tính linh hoạt mà nó mang lại thì là một sự đánh đổi rất đáng giá Cài đặtChuẩn bịTrước khi bắt đầu, bạn cần tải xuống và cài đặt Docker. Truy cập trang web Docker, sau đó tải xuống và cài đặt nó cho hệ điều hành của bạn. Nếu đang sử dụng Linux, bạn nên cài đặt các gói phần mềm docker thông qua trình quản lý gói của bản phân phối của bạn. Bắt đầuMột máy chủ web thường bao gồm nhiều chương trình khác nhau - chẳng hạn như NGINX, PHP và MySQL. Theo thuật ngữ của Docker, mỗi chương trình bạn muốn cài đặt là một service. Có một số cách để tạo các service này trong Docker. Docker hỗ trợ tạo tệp cấu hình bằng YAML. Bạn có thể chạy lệnh trên command line, tuy nhiên vẫn nên sử dụng tệp cấu hình YAML vì một số lý do:
docker-compose.yml cho NGINXDocker cung cấp một công cụ có tên là docker-compose, lấy một tệp cấu hình có tên là 4 và khởi chạy các service được liệt kê bên trong nó.Đầu tiên, hãy thêm một máy chủ web, NGINX. Bạn tạo một thư mục ở đâu đó trên máy tính để lưu trữ trang web của bạn. Tạo docker-compose.yml với các nội dung sau:
Ánh xạ các cổng máy ảo với máy thật. Nó sẽ chuyển tiếp cổng 80 trên máy cục bộ đến cổng 80 trên container. Mọi yêu cầu trên máy chủ tới http://127.0.0.1 sẽ được chuyển tiếp đến máy chủ NGINX đang chạy trong container. Chạy serviceMở terminal và chạy lệnh 5Bạn sẽ thấy đầu ra tương tự như hình ảnh bên dưới Nếu chạy thành công, bạn có thể kết nối với máy chủ bằng cách truy cập http://127.0.0.1 trong trình duyệt của mình. Khi đấy, bạn sẽ thấy trang default của NGINX, như hình bên dưới Tại sao không phải là ApacheTrước khi chúng ta tiếp tục, bạn có thể thắc mắc tại sao tôi không sử dụng Apache ở đây. Nếu bạn đang sử dụng XAMPP hoặc một gói tương tự thì máy chủ web bạn đang sử dụng là Apache. Apache vẫn ổn và nó vẫn hoạt động hiệu quả. Khi Apache được tạo ra, Web là rất khác với hiện nay. Apache có rất nhiều tính năng khác nhau đã xuất hiện và biến mất - nhưng Apache vẫn hỗ trợ. Nhưng trang web đã thay đổi rất nhiều kể từ khi Apache được tạo ra và mặc dù đây là một máy chủ có khả năng hoạt động tốt, hầu hết các trang web ngày nay đều có xu hướng sử dụng NGINX. Nó dễ cấu hình hơn, nhẹ hơn và được điều chỉnh tốt hơn cho các loại tác vụ mà nhiều trang web hiện đại sử dụng (chẳng hạn như phát trực tuyến video) và do đó, thị phần của nó đang tăng lên nhanh chóng với chi phí của Apache. Lời khuyên chung của tôi là: nếu bạn đã có một trang web đang chạy Apache, không có lý do gì để bạn phải vất vả thay đổi lại, nhưng nếu bạn đang bắt đầu một dự án mới từ đầu, hãy sử dụng NGINX Đưa file lên máy chủBây giờ server đã được cài đặt và chạy qua Docker, chúng tôi có thể hiển thị các file của mình trên máy chủ. Nếu bạn đã quen với Apache, bạn sẽ đặt chúng vào httpdocs, htdocs hoặc thư mục public ở đâu đó trên máy tính của mình. Vì máy chủ đang chạy trong container, nên nó không có quyền truy cập vào bất kỳ tệp nào trên máy tính của bạn. Tuy nhiên, Docker cho phép bạn chỉ định một file hoặc thư mục trên máy tính của bạn để chia sẻ với container. Bạn sẽ cần hai file: file cấu hình nginx.conf và một thư mục sẽ lưu trữ các file trên trang web của bạn. Vây, ta sẽ sửa lại docker-compose.yml:
Điều này làm cho tệp nginx.conf và thư mục app map với thư mục app có sẵn trong container. Bất kỳ thay đổi nào bạn thực hiện đối với file trong app hoặc nginx.conf sẽ được thay đổi ngay lập tức trong container Tệp nginx.conf từ máy chủ được đặt tại /etc/nginx/conf.d/nginx.conf bên trong container. Đây là thư mục mà NGINX đọc các file cấu hình. Thư mục app là nơi bạn sẽ đặt tất cả các file PHP, hình ảnh và JavaScript trên trang web của mình. Trước khi khởi động lại máy chủ, hãy tạo tệp nginx.conf trong cùng thư mục với docker-compose.yml của bạn với nội dung sau
Điều này cho NGINX biết rằng đây là cấu hình nó sẽ sử dụng cho máy chủ mặc định và nó sẽ phân phát các file từ thư mục /app/public. Để kiểm tra xem nó có hoạt động không, hãy tạo trang “Hello, World” tại app/public/index.html, VD:
Chạy lại lệnh docker-compose up để khởi động lại server Mở url http://127.0.0.1 ta sẽ thấy Hello world PHPNếu bạn muốn chạy các file PHP, bạn sẽ cần thêm một service khác cho PHP trong docker-compose.yml của mình và liên kết nó với nginx:
Service php sử dụng image php:fpm. Đối với NGINX, bạn sẽ cần sử dụng gói fpm (FastCGI Process Manager), nhưng bạn có thể chọn bất kỳ phiên bản PHP nào bạn thích - chẳng hạn như php: 7.4-fpm, php: 7.3-fpm, php: 8.0-fpm. Nếu bạn không chỉ định phiên bản và chỉ sử dụng php: fpm, nó sẽ sử dụng phiên bản mới nhất - tại thời điểm viết bài, là 8.0. Bởi vì PHP sẽ cần truy cập các tệp .php của bạn từ thư mục /app, bạn sẽ cần gắn map folder trong image PHP giống như cách bạn đã làm cho image NGINX. Trước khi khởi động lại máy chủ, chúng ta cần cấu hình NGINX để chạy các tệp .php thông qua service PHP. Thay đổi file nginx.conf như sau:
Dòng index cho phép máy chủ tìm kiếm index.php thay vì index.html như trang mặc định. Block location hướng dẫn NGINX chạy bất kỳ tệp nào có phần mở rộng .php thông qua service PHP (fastcgi_pass php:9000, trong đó php là tên của service được cấu hình trong docker-compose.yml). Tạo tệp phpinfo tại app/public/index.php:
Khởi động lại bằng lệnh docker-compose up. Nếu mọi thứ được thiết lập chính xác, khi bạn truy cập http://127.0.0.1, bạn sẽ thấy kết quả phpinfo() Giả sử trang web của bạn đang sử dụng MySQL, nếu bạn xem qua trang phpinfo(), bạn sẽ nhận thấy rằng không có bộ adapter MySQL nào được cài đặt. Chúng ta sẽ cần cài đặt gói PDO trong PHP. Điều này hơi phức tạp, vì chúng ta cần cài đặt gói này trong image, tuy nhiên, trong PHP image bản chính thức đã cài sẵn rồi Chúng tôi sẽ sử dụng image php:fpm làm base image và cài đặt adapter PDO MySQL vào đó. Trước tiên, hãy sửa đổi docker-compose.yml để tạo image PHP mới từ image php: fpm hiện có:
Thay vì nhập image có sẵn, bây giờ ta cần build một bản image mới. Tạo PHP.Dockerfile trong cùng một thư mục với docker-compose.yml của bạn và thêm những thứ sau:
Thao tác này sẽ cài đặt phần mở rộng pdo_mysql cho PHP. Chỉ thị FROM nói với Docker rằng nó nên sử dụng php: fpm làm base image và RUN được sử dụng để chạy các lệnh bên trong image. Bạn có thể chạy bất kỳ lệnh Linux nào tại đây. Trong trường hợp này, chúng tôi đang chạy tập lệnh docker-php-ext-install, được cung cấp sẵn trong gói PHP chính thức và cho phép chúng ta cài đặt các phần mở rộng PHP. Nếu bạn muốn sử dụng thư viện MySQLi, bạn có thể cài đặt nó thay vì PDO:
Khởi động lại máy chủ của bạn bằng lệnh docker-compose up. Bạn có thể xác định pdo_mysql đã được cài đặt bằng cách xem output phpinfo () trên http://127.0.0.1. Ngoài ra có thể cài thêm xdebug để có thông báo lỗi đẹp hơn trên local: 0xdebug được cài đặt thông qua pecl, được cung cấp như một phần của image PHP offical. Chạy lại docker-compose up và kiểm tra output của phpinfo () sẽ cho thấy rằng cả pdo_mysql và xdebug đều được cài đặt. MYSQLBây giờ chúng tôi đã sẵn sàng cài đặt MySQL. Một lần nữa, chúng tôi sẽ thêm nó dưới dạng một service trong docker-compose.yml. Tuy nhiên, thay vì cài đặt image MySQL chính thức, chúng tôi sẽ sử dụng MariaDB, một giải pháp thay thế với các điều khoản cấp phép trong tương lai có khả năng tốt hơn hiện tại mà MySQL thuộc sở hữu của Oracle. Nếu bạn đã sử dụng MySQL trước đây, MariaDB sẽ hoạt động giống như vậy: 1Image đang sử dụng là mariadb:lastest. Cũng như NGINX và PHP, nếu muốn, bạn có thể chỉ định một phiên bản cụ thể của MariaDB tại đây. Lần này cần bổ sung thêm một vài biến môi trường: MYSQL_ROOT_PASSWORD: mật khẩu gốc của cơ sở dữ liệu. Bạn có thể sử dụng điều này để đăng nhập với tư cách người chủ và quản lý cơ sở dữ liệu. MYSQL_USER và MYSQL_PASSWORD: tên và mật khẩu cho người dùng MySQL được tạo với các quyền hạn chế. MYSQL_DATABASE: tên của database Lý do tôi không muốn sử dụng thư mục trong hệ thống tệp cục bộ là khi ứng dụng được tải lên máy chủ web thực, bạn không muốn ghi đè cơ sở dữ liệu thực bằng máy chủ ảo của mình. Tất cả các bản ghi môi trường thử nghiệm / phát triển của bạn sẽ được lưu trữ tại đây. Điều này cho phép bạn có một cơ sở dữ liệu khác nhau trên máy chủ trực tiếp và máy chủ phát triển khi bạn tải lên trang web của mình. Cuối cùng, map cổng hiển thị cổng 3306 để chúng ta có thể kết nối với nó với một máy khách như MySQL Workbench để quản lý cơ sở dữ liệu. Khởi động lại máy chủ của bạn. Sẽ mất một hoặc hai phút để tải xuống và cấu hình MariaDB lần đầu tiên. Sau đó, trong một tập lệnh PHP, hãy thử kết nối với MySQL bằng PDO và tên người dùng, mật khẩu và tên cơ sở dữ liệu đã chọn của bạn: 2Chạy tập lệnh này trên máy chủ. Nếu bạn thấy phiên bản MySQL và không có thông báo lỗi, bạn đã kết nối với máy chủ MySQL của mình và tất cả đều được thiết lập chính xác. Kết luậnKhi bạn làm cho trang web của mình hoạt động, bạn sẽ chỉ cần tải lên toàn bộ dự án, bao gồm docker-compose.yml, nginx.conf và PHP.Dockerfile, chạy docker-compose up -d trên máy chủ (option -d nghĩa là chạy service ở background). Bạn sẽ không cần thiết lập và cài đặt thủ công PHP, MariaDB và NGINX trên máy chủ web. Docker làm cho quá trình phát triển một trang web trở nên đơn giản hơn rất nhiều vì mọi thứ đều được tự động hóa. |