Giới thiệu

Bài lab này chúng ta cài đặt môi trường lập trình Nginx - PHP bằng Docker.

Tại sao dùng Docker mà không dùng XAMPP hay WAMP?
Docker là công nghệ phổ biến, cấu hình thêm, bớt các thành phần được, có thể chạy trên cả 3 hệ điều hành Windows, Linux, Mac. Trong khi XAMPP, WAMP được đóng gói mặc định, khó thay đổi.

Giải thích một số từ / khai niệm trong bài viết

  • Nginx: một web server mạnh mẽ mã nguồn mở. Nginx sử dụng kiến trúc đơn luồng, hướng sự kiện vì thế nó hiệu quả hơn Apache server
  • Docker là một nền tảng dành cho developer và system administrator, cung cấp cho họ những thành phần để build, run và share những chương trình thông qua những container. Việc sử dụng container để triển khai chương trình được gọi là containerization.’
  • Docker Compose: là một công cụ dùng để định nghĩa và chạy các chương trình Docker sử dụng nhiều container (multi-container). Với Docker Compose, chúng ta sử dụng một file YAML để thiết lập các service cần thiết cho chương trình. Cuối cùng, với một câu lệnh, chúng ta sẽ create và start tất cả service từ các thiết lập đó.
  • PHP-FPM viết tắt của FastCGI Process Manager là chương trình có chức năng phiên dịch PHP khi chạy trang web cho web server. PHP-FPM được hình thành dựa trên sự mở rộng của CGI và hiện đang được đông đảo người dùng lựa chọn.
  • Alpine Linux là bản phân phối Linux dựa trên musl và BusyBox, được thiết kế bảo mật, đơn giản và hiệu quả về tài nguyên. Nó sử dụng OpenRC cho hệ thống init. Alpine nổi lên sau khi Docker được phát triển bởi vì nó nhỏ và nhẹ, thường được sử dụng để làm docker image.

Cài đặt

Cài đặt Docker Desktop và đảm bảo Docker chạy thành công trước khi triển khai Docker compose.

Thư mục dự án

.
├── docker
│   ├── nginx
│   │   ├── Dockerfile
│   │   └── helloworld.nginx.conf
│   └── php
│       └── Dockerfile
├── src
│   ├── index.php
│   └── loop.php
├── docker-compose.yml

docker-compose.yml

File docker-compose.yml gồm 2 dịch vụ : nginx và php. Nginx là web server sẽ phục vụ các file tĩnh, với những file có đuôi php sẽ được chuyển qua dịch vụ php lắng nghe ở cổng 9000

version: "3.8"
services:
  nginx:
    container_name: nginx
    build: ./docker/nginx
    command: nginx -g "daemon off;"
    links:
      - php
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
docker-compose.yml

Dịch vụ nginx

FROM nginx:stable-alpine
ADD helloworld.nginx.conf /etc/nginx/conf.d/default.conf
docker/nginx/Dockerfile

ADD helloworld.nginx.conf /etc/nginx/conf.d/default.conf copy file docker/nginx/helloworld.nginx.conf thành file /etc/nginx/conf.d/default.conf trong docker container

File cấu hình nginx

server {
	listen 80;
	index index.php index.htm index.html;

	root /var/www/html;

	error_log  /var/log/nginx/error.log;
	access_log /var/log/nginx/access.log;

	location ~ \.php$ {
		try_files $uri =404;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass php:9000;
		fastcgi_index index.php;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param PATH_INFO $fastcgi_path_info;
	}
}
docker/nginx/helloworld.nginx.conf

Dịch vụ php

FROM php:8.1-fpm-alpine
docker/php/Dockerfile

src

Trong thư mục src chúng ta tạo 2 file mã nguồn index.php và loop.php để thử nghiệm dịch vụ nginx - php hoạt động có đúng không?

Trả về thông tin cấu hình của PHP

<?php
phpinfo();
?>
src/index.php

In ra từ 1 đến 10

<?php
for ($x = 0; $x <= 10; $x++) {
  echo "The number is: $x <br>";
}
?>
src/loop.php

Các lệnh docker-compose

Build các docker image nếu chưa có docker image

docker-compose build

Khởi động Docker compose

docker-compose up

Ảnh chụp màn hình ứng dụng Portainer quản trị Docker ở đường dẫn http://localhost:9000. Bạn có thể cài đặt Portainer ở địa chỉ https://www.portainer.io/
docker-compose up

Để dừng các dịch vụ

docker-compose down

Chạy thử

http://localhost
phpinfo

http://localhost/loop.php
php loop

Lỗi thường gặp phải

Cổng 80 bị chiếm dụng, cần phải kill process ở cổng 80 trước khi chạy lệnh docker-compose up