Đây là bộ docker-compose dùng để phát triển các ứng dụng trên nền PHP/MySQL. Gồm có:
-
PHP PHP 8.1,8.2,8.4
-
MySQL 8.2
-
Postgres 17
-
Nginx
Hệ thống tách thành các service độc lập:
- PHP-FPM:
php81,php82,php84 - Web:
nginx - Database:
mysql(MySQL 8.x),postgres(tuỳ chọn) - Cache:
redis
Ưu điểm: linh hoạt chọn phiên bản PHP, có thể chạy nhiều phiên bản song song, dễ mở rộng và debug.
- Tạo file
.env(nếu chưa có), ví dụ các biến hay dùng:
USER_ID=1000
GROUP_ID=1000
HTTP_PORT=8080
PROJECTS_PATH=/home/youruser/Projects
MYSQL_PWD=root
POSTGRES_PWD=postgres
REDIS_PORT=6379
MYSQL_PORT=3306
POSTGRES_PORT=5432- Chọn phiên bản PHP cho Nginx
Sửa fastcgi_pass trong site để trỏ đúng upstream đã định nghĩa sẵn:
# trong nginx/sites/default.conf
fastcgi_pass php82-fpm; # hoặc php81-fpm / php84-fpm- Build và chạy
docker compose build php81 php82 php84 nginx
docker compose up -d- Thêm hosts (Adminer nếu dùng):
127.0.0.1 adminer.local
::1 adminer.local
Truy cập: http://adminer.local:${HTTP_PORT} (mặc định 8080 nếu bạn đặt như trên)
- Tất cả PHP-FPM containers listen nội bộ trên cổng 9000; không xung đột vì nằm trong các container khác nhau. Nginx kết nối qua tên service + 9000.
- Mount toàn bộ
PROJECTS_PATHkhông làm tăng dung lượng container; nếu thư mục quá lớn, cân nhắc mount chọn lọc để giảm overhead khi tools quét file. - Trên Ubuntu (Linux), bind mount là native, hiệu năng tốt. Nếu dùng nhiều watcher, có thể tăng inotify:
sudo sysctl -w fs.inotify.max_user_watches=524288sudo sysctl -w fs.inotify.max_user_instances=1024
-
Copy file .env.example sang một file mới và đặt tên là .env, sửa các giá trị nếu muôn
-
Copy file docker-compose.yml.example sang một file mới và đặt tên là docker-compose.yml, sửa các giá trị tại các row có dòng
// need to editcho chính xác
- Thêm hai dòng này vào hosts file
127.0.0.1 adminer.local
::1 adminer.local
-
Tại thư mục root (ngang hàng với file docker-composer.yml), gõ lệnh
docker-compose up -d -
Vào trình duyệt gõ http:://adminer.local:9090. Servername nhập mariadb, username/pass thì tìm ở file .env. Nếu login thành công vào adminer thì đã setup thành công
- Khi import file Data (SQL) có dung lượng lớn, hãy copy vào thư mục data/shared (được mount vào /var/shared ở container mariadb) và dùng command line để import
- Khi setup biến môi trường cho ứng dụng php, ví dụ file .env của dự án Laravel, hãy chú ý
DB_HOST=mariadb # không phải là localhost
DB_PORT=3306 # không phải là 33069Ví dụ muốn setup site Laravel mysite:
- Thêm domain vào hosts trên máy local
127.0.0.1 mysite.local
::1 mysite.local
- Đặt mã nguồn
- Đảm bảo dự án nằm trong
${PROJECTS_PATH}/mysitetrên host. - Trong container, đường dẫn sẽ là
/var/www/Projects/mysite.
- Tạo virtual host Nginx
Tạo file nginx/sites/mysite.conf với nội dung:
server {
listen 80;
server_name mysite.local;
root /var/www/Projects/mysite/public; # Laravel public
index index.php index.html;
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/mysite.error.log;
client_max_body_size 0;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php82-fpm; # hoặc php81-fpm / php84-fpm
fastcgi_index index.php;
}
}
- Khởi động lại Nginx
docker compose restart nginx
- Truy cập
Mở http://mysite.local:${HTTP_PORT} (ví dụ 8080).