Mặc định bản thân WordPress đã hỗ trợ rất nhiều phiên bản docker images, có sẵn nhiều phiên bản PHP, nhưng đa phần chỉ có các bản PHP mới, và các bản này cũng chỉ cài sẵn các extension cơ bản, nếu bạn cần chạy 1 bản PHP cũ hẳn như 7.4 hay mới hẳn như 8.4 thì WordPress chưa hỗ trợ hoặc không còn duy trì
Hay đơn giản bạn cần cài thêm các extension khác ít thông dụng hơn, kiểu composer, ioncube_loader, maxminddb … đọc 1 tấn các help hướng dẫn xong cài mãi vẫn lỗi be bét 😀
Hay công đoạn bảo mật, bảo trì, cập nhập khi ra phiên bản mới thì làm sao, ai rảnh đâu mà ngồi ngó suốt …
Mọi thứ quá là phức tạp cho một người dùng phổ thông bình thường, ơn trời là với sự giúp đỡ của chính bản thân PHP, WordPress, Github, Docker Hub và rất nhiều các lập trình viên với các dự án như docker-php-extension-installer, hiện tại mọi thứ dễ còn hơn ăn cả kẹo
- Bài này mọi công cụ mình sử dụng, đều được cung cấp chính hãng, các phiên bản images gốc được cung cấp từ chính PHP, công cụ hỗ trợ cài đặt các extension từ dự án docker-php-extension-installer của thành viên mlocati và tất nhiên file cài đặt WordPress là từ chính WordPress
Mọi người có thể tự tin sử dụng, tùy chỉnh, ít nhất tiêu chuẩn an toàn và hiệu năng của nó, được chính PHP và WordPress đảm bảo
Mình đã làm sẵn tất cả các bước build 1 bản PHP 8.4, bao gồm tất cả extension tương tự bản gốc PHP 8.3 đang được WordPress cung cấp
Bước 1: fork bản wordpress-wp-cli-php8.4-fpm-alpine về tài khoản của bạn
- 2 file
docker-entrypoint.sh
vàwp-config-docker.php
để nguyên, không cần quan tâm tới nó, chỉ cần sửa lại fileDockerfile
Nội dung 2 file docker-entrypoint.sh và wp-config-docker.php được mình bê về từ bản gốc của WordPress
Bước 2: chỉnh sửa file Dockerfile
Ấn trực tiếp vào hình cái bút để chỉnh sửa Dockerfile
, chỉ cần chú ý 20 dòng đầu như hình là được
- Ở dòng 1: chọn phiên bản PHP bạn muốn dùng, cụ thể thì mình sẽ build từ bản PHP 7.4 cho bài viết này, muốn lấy phiên bản chạy OS nào, thì vào tags của PHP xem rồi copy tên
-
Ở dòng 8, bắt đầu bằng
apk add
, muốn cài thêm gì vào Alpine thì thêm vào (curl, wget, git, htop, unzip, nano, zip, zstd …), bắt buộc giữ lạibash
,ghostscript
có sẵn không thích xóa đi tùy thích, mà do WordPress họ dùng như mặc định, nên mình cũng giữ lại -
Từ dòng 14-20: các extension bạn muốn thêm vào cho PHP, các thứ có sẵn cũng là mặc định WordPress đang dùng, nên để lại, cá nhân thì nếu build riêng mình sẽ bỏ đi
imagick
, nếu bạn không hiểu mấy extension đang có dùng để làm gì, cứ giữ nguyên là được - Để biết chính xác extension bạn cài vào, được hỗ trợ trên bản PHP nào, điền theo tên cú pháp làm sao thì xem trực tiếp từ docker-php-extension-installer
Các đoạn code còn lại bên dưới chủ yếu là cài đặt thêm WordPress sẵn vào images, cấu hình chmod các thứ, phần này mình cũng chỉ copy lại theo bản gốc từ WordPress, chỉ sửa lại 1 chút, để nó luôn tự động download bản WordPress mới nhất
Ở dòng 79-81 là cài đặt thêm WP-CLI, theo mình đây là công cụ bắt buộc mà bất cứ ai dùng WordPress cũng phải có, mặc định là cài sẵn vào
- Cụ thể mình cài PHP 7.4, bỏ đi
ghostscript
,imagick
, và cài thêm@composer
- Chỉnh sửa lại sẽ như ảnh bên trên, chú ý là ở dòng cuối cùng kết thúc lệnh, cần bổ xung thêm dấu
;
hoặc&&
Xong xuôi, ấn vào Commit changes
để save lại các thay đổi
Bước 3: chỉnh sửa file .github/workflows/main.yml
Mục đích của Github Active này giúp tự động build Dockerfile thành 1 images hoàn chỉnh, upload lên Docker Hub mỗi ngày vào lúc 0h sáng, images của bạn sẽ luôn được tự động cập nhập lên bản mới nhất, phiên bản PHP cũng sẽ được cập nhập theo, WordPress cũng sẽ tự download về bản mới nhất, cài đặt xong Github Active thì công đoạn bảo trì, bảo dưỡng không cần quan tâm nữa
Demo cho bài viết này mình build từ images gốc php:7.4-fpm-alpine
, đây là phiên bản đã kết thúc vòng đời từ 11/2022, bạn sẽ thấy images này đã hơn 2 năm không có cập nhập mới
Sửa 2 dòng cuối 34 theo tên tài khoản Docker Hub của bạn, các dòng khác để nguyên
Mình dùng trên tài khoản Docker Hub là bibicadotnet
, muốn đặt tên images là wordpress-wp-cli-php7.4-fpm-alpine
, hỗ trợ trên 2 nền tảng phổ biến amd64 và arm64 thì sửa lại như sau
tags: bibicadotnet/wordpress-wp-cli-php7.4-fpm-alpine platforms: linux/amd64,linux/arm64
- Để phân biệt tài khoản và tên images mặc định dùng dấu
/
Chỉnh sửa xong thì ấn vào Commit changes
để save lại các thay đổi
Bước 4: Thêm Docker Hub Credentials
- Truy cập tab
Settings
của repository. - Trong menu bên trái, chọn
Secrets and variables
>Actions
. - Nhấp vào nút
New repository secret
và thêm các thông tin:-
Name:
DOCKER_USERNAME
Secret: Tên người dùng Docker Hub của bạn. -
Name:
DOCKER_PASSWORD
Secret: Mật khẩu truy cập Docker Hub.
-
Name:
Xong xuôi ta sẽ có 2 repository secrets
lưu trữ thông tin Username và Password tài khoản Docker Hub
Về cơ bản, lúc này mọi bước cấu hình đã hoàn tất
Bước 5: Kiểm tra lại Workflow
- Quay lại tab
Actions
. - Bạn sẽ thấy workflow
Build and Push Docker Image
trong danh sách. - Nhấp vào workflow và chọn
Run workflow
(nếu muốn chạy ngay lập tức). - Theo dõi quá trình thực thi trong giao diện (mất tầm 10-15s mới hiện ra In progress cho bạn nhìn)
Do bản Dockerfile này thêm vào khá nhiều extension, công đoạn build hơi lâu, đa phần ~15 phút mới xong, có điều cũng không quan trọng, vì hàng ngày tự chạy rồi, không cần để ý tới nó nữa
Xong xuôi thì trên tài khoản Docker của bạn sẽ có repositories với tên chính xác như đã đặt từ trong main.yml
Bước 6: kiểm tra lại mọi thứ
Mọi thứ sẽ hoạt động chính xác như cài đặt
php -v PHP 7.4.33 (cli) (built: Nov 12 2022 05:16:49) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies
php -m [PHP Modules] bcmath Core ctype curl date dom exif fileinfo filter ftp gd hash iconv intl json libxml mbstring mysqli mysqlnd openssl pcre PDO pdo_sqlite Phar posix readline Reflection session SimpleXML sodium SPL sqlite3 standard tokenizer xml xmlreader xmlwriter Zend OPcache zip zlib
composer --version Composer version 2.8.4 2024-12-11 11:57:47 PHP version 7.4.33 (/usr/local/bin/php) Run the "diagnose" command to get more detailed diagnostics output.
Làm xong hết, kiểm tra mọi thứ chạy ổn định. có thể sửa lại README, ghi chú các cấu hình, tùy chỉnh …. để ai đó thích dùng bản images này có thể dùng
Công nhận docker-php-extension-installer hỗ trợ cài đặt các extension cho PHP tốt thật, mình cũng có thử làm 1 bản cài đặt extension thông thường trên PHP 8.4, cài đặt quá xá thứ mới xong, dùng docker-php-extension-installer điền mỗi tên extension vào là tự động mọi thứ hết, nhàn điên 🥕
Vấn đề cấu hình tối ưu hiệu năng thêm cho PHP mình nghĩ dùng trên Docker LCMP Multisite cho nhàn, mình tách sẵn mọi cấu hình quan trọng ra ngoài, tự chỉnh nhàn hơn, sửa trực tiếp trong Dockerfile nó hơi lỉnh kỉnh, lại khó tùy biến
Kết luận
Viết xong bài mới tự tin bản PHP 7.4 chạy không lỗi á, images gốc quá cũ rồi, không có Dockerfile nên cũng không rõ thời đó PHP cấu hình làm sao, may mà họ vẫn duy trì cấu hình chuẩn, mọi thứ chạy mượt, kiểu họ quên 1 lệnh chmod, quên tạo user, viết thừa 1,2 đấu chấm phẩy là đủ ngồi sửa lỗi đần luôn
Nếu bạn sử dụng các phiên bản PHP mới nhất, như 8.3, 8.4 …. mỗi khi Alpine OS hay phiên bản PHP có cập nhập mới, PHP sẽ tự cập nhập vào các file images ban đầu, với cấu hình trong bài, mỗi ngày cũng tự build 1 bản mới, bạn sẽ luôn có images với PHP, WordPress và các extension được cập nhập tự động mới nhất, không phải động tay động chân làm gì, dùng 3-6 tháng nếu hôm nào rảnh tay, muốn cập nhập lên bản mới, chạy 1 lệnh cập nhập cơ bản docker compose pull &&
docker compose up -d
là xong
Thời điểm bạn đọc thấy dòng này, thèng bibica.net đang dùng chính xác phiên bản images wordpress-wp-cli-php8.4-fpm-alpine
được nói tới trong bài
Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.
• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.
• ✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!