Giải pháp xây dựng Container chứa: Nginx, PHP-FPM trên Centos 8
Giải pháp là build 1 con server Centos trên Docker Container, trong container này sẽ chứa sẵn Nginx, PHP-FPM để chạy website php. Từ đó chúng ta có thể tạo thành 1 Image và từ Image này tạo ra nhiều container php, chạy các source clone từ git server vào thư mục /var/www của container. Ưu điểm là nó như 1 con server đầy đủ, nhược điểm là size cài đặt lớn (>= 800MB)
Tham khảo từ Docker Centos Nginx Php Fpm Docker file install từ Centos 6 Thằng này cũ hơn dùng tham khảo
Tạo Container Image Centos8 + Nginx + PHP-FPM
Các phần được cài sẵn trên Centos Container: Nginx, PHP-PFM (any modules), compose, npm, git, wget, unzip ... Phiên bản: Centos 8, Nginx/1.14.1, PHP 7.2.24
Tạo Dockerfile cho Image Centos8 + Nginx + PHP-FPM
FROM centos:latest
# Chạy nhiều dòng lệnh, chưa optimaze
RUN export LC_ALL=C
# Set timezone
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# Run update Centos repos
# Fix Failed to download metadata for repo ‘AppStream’ [CentOS]
WORKDIR /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# Change workdir
WORKDIR /
# Install Nginx and PHP-FPM
RUN yum -y update &&
yum -y install epel-release wget unzip curl git &&
yum -y install npm nginx php-fpm php-mysqlnd php-common php-cli php-json php-zip
# -- Cài đặt thêm modules
# RUN yum install php php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json php-pdo php-pecl-apcu php-pecl-apcu-devel
# Install compose
RUN curl -sS https://getcomposer.org/installer |php
# Move the Composer file to /usr/local/bin directory:
RUN mv composer.phar /usr/local/bin/composer
# Expose port 80
EXPOSE 80
Chạy lệnh để lưu thành Image Centos80-Nginx-Php:1.0
docker build -t Centos80-Nginx-Php:1.0 --force-rm -f Dockerfile .
Lưu Image ra file để chuyển cho server khác (nếu cần)
# lưu ra file, có thể chỉ ra đường dẫn đầy đủ nơi lưu file
docker save --output Centos80-Nginx-Php:1.0.tar Centos80-Nginx-Php:1.0
# Nạp Image vào Docker của server khác
docker load -i Centos80-Nginx-Php:1.0.tar
Với server trên chúng ta chú ý các thư mục và chỉ thị chạy lệnh
/etc/nginx/conf.d/Nơi sẽ lưu file cấu hình Nginx Default (default.conf)/etc/php-fpm.d/www.confFile cấu hình php-pfm. Ta có thể nạp vào sau hay sửa trực tiếp trong Image Container/usr/sbin/nginxLệnh chạy Nginx server trong Container./usr/sbin/php-fpmLệnh chạy PHP-FPM trong Container.
Thay đổi file cấu hình (Optional)
# -- Lấy file cấu hình từ trong Image
# -- Tạo container từ Centos80-Nginx-Php:1.0, copy file cấu hình vào thư mục chia sẽ với host là /home/conf rồi xóa container đi ngay, file cấu hình sẽ nằm trong thư mục /mycode/conf
docker run -it --rm -v /mycode/conf:/home/conf Centos80-Nginx-Php:1.0 \
cp /etc/nginx/nginx.conf /home/conf/default.conf
docker run -it --rm -v /mycode/conf:/home/conf Centos80-Nginx-Php:1.0 \
cp /etc/php-fpm.d/www.conf /home/conf/www.conf
Chỉnh sửa file cấu hình
# -- Xóa hết nội dung, chỉ để lại
server {
listen 80;
# server_name example.com;
# server_name _;
root /var/www/public_html;
index index.php index.html index.htm;
location / {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
..........
; Thay doi sang user/group
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
.......
Khi chạy Dockerfile thì nạp vào lại
# ....
# Configure Nginx and PHP-FPM (optional)
COPY /home/conf/default.conf /etc/nginx/conf.d/default.conf
COPY /home/conf/www.conf /etc/php-fpm.d/www.conf
# ....
Sử dụng Centos80-Nginx-Php:1.0 cho dự án PHP
Soạn Dockerfile sử dụng Image vừa tạo
FROM Centos80-Nginx-Php:1.0
# -- Cài đặt thêm modules
# RUN yum install php php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json php-pdo php-pecl-apcu php-pecl-apcu-devel
WORKDIR /var/www
# clone source từ git, sử dụng Username/PersonalAccessTokens
RUN git clone [git@gitlab.com:buivantienduc/php-mvc.git]
# Chú ý, trỏ file cấu hình run PHP vào thư mục /var/www/public_html (nếu cần)
# Configure Nginx and PHP-FPM (optional)
# COPY default.conf /etc/nginx/conf.d/default.conf
# COPY www.conf /etc/php-fpm.d/www.conf
# Expose port 80
EXPOSE 80
# Start Nginx and PHP-FPM services
CMD ["sh", "-c", "usr/sbin/php-fpm && usr/sbin/nginx -g 'daemon off;'"]
# OR - Start
# ENTRYPOINT ["/usr/sbin/php-fpm", "-D", "FOREGROUND"]
# ENTRYPOINT ["/usr/sbin/nginx", "-D", "FOREGROUND"]
Chạy lệnh để lưu thành Image project PHP ProjectPhp:2.3.4
docker build -t ProjectPhp:2.3.4 --force-rm -f Dockerfile .
Build container từ Image trên
docker run -it --name ProjectPhp \
-v /path/log/host:/var/log/nginx \
-v /path/config-nginx/host:/etc/nginx \
-p 8080:80 -h ProjectPhp ProjectPhp:2.3.4
-it : truy cập commandline
-h : set hostname
-p : map port 8080(host):80(container)
-v : Mount volume
# Truy cập cổng 8080 trên máy host cho kết quả
http://[ip_host]:8080
Với giải pháp này ta có thể kết hợp với HAProxy chạy load balance nhiều container php để chia tải.