Skip to content

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.conf File 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/nginx Lệnh chạy Nginx server trong Container. /usr/sbin/php-fpm Lệ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.

Tham khảo

Tạo một base image from scratch

Creating Docker Base Images