Hướng dẫn php-fpm docker

BÀi viết này sẽ dùng docker compose version 3 để làm việc với các service tạo nên môi trường phát triển php

2022-03-20 774 lượt xem

  1. Trang Chủ
  2. docker
  3. Cài đặt môi trường phát triển php với docker

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

hùng ebudezain

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng đẹp trai

hùng thông minh lắm

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

Một máy chủ web thường bao gồm nhiều chương trình khác nhau - chẳng hạn như NGINX, PHP và MySQL. Theo thuật ngữ của Docker, mỗi chương trình bạn muốn cài đặt là một service. Và trong bài viết này chúng ta sẽ thiết lập php chạy nginx làm máy chủ chạy php-fpm 

tôi thích vậy đó

đọc dữ liệu hộ bố

hùng thông minh lắm

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

tôi thích vậy đó

Bắt đầu thôi!

hùng ebudezain

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

hùng ebudezain

đọc dữ liệu hộ bố

Cài máy chủ nginx

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

hùng thông minh lắm

tôi thích vậy đó

tôi thích vậy đó

ahihi đồ ngốc trương thanh hùng nè

hùng thông minh lắm

tôi thích vậy đó

hùng thông minh lắm

Đầu tiên, hãy thêm một máy chủ web Nginx với việc tạo 1 file thực thi docker compose: docker-compose.yml

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

Nội dung file docker-compose.yml: 

hùng thông minh lắm

ahihi đồ ngốc trương thanh hùng nè

 
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"

hùng đẹp trai

ahihi đồ ngốc trương thanh hùng nè

ahihi đồ ngốc trương thanh hùng nè

hùng đẹp trai

tôi thích vậy đó

hùng đẹp trai

hùng thông minh lắm

hùng thông minh lắm

Khúc này bạn tạm hiểu là nó build image nginx:latest về rồi tạo 1 service với việc bind port trong docker là 80 ra port ngoài là 80. nếu bạn nghịch 8080:80 thì ý nghĩa là bind port trong docker là 80 ra port thực tế máy bạn là 8080 😄 

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

đọc dữ liệu hộ bố

Chạy service

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

Để chạy service thì bạn gọi lệnh : docker-compose up

hùng đẹp trai

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

hùng đẹp trai

hùng đẹp trai

hùng đẹp trai

hùng thông minh lắm

hùng thông minh lắm

khi đó bạn gõ vào trình duyệt dòng : //127.0.0.1 thì sẽ hiện thị như sau: 

bài viết được viết bởi trương thanh hùng //ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng //ebudezain.com/

Bây giờ server đã được cài đặt và chạy qua Docker, chúng tôi có thể hiển thị các file của mình trên máy chủ.

hùng ebudezain

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

hùng đẹp trai

Bind code và cài đặt nginx

hùng đẹp trai

hùng ebudezain

hùng ebudezain

Docker có thể cho phép bạn chia sẽ 1 file hoặc 1 folder lên container. Vậy nên bạn sẽ tạo ra 1 file config nginx là app.conf trong folder nginx và folder code của bạn là app

hùng thông minh lắm

hùng thông minh lắm

Ta có việc binding volumn như sau:

ahihi đồ ngốc trương thanh hùng nè

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx:/etc/nginx/conf.d/
            - ./app:/app

hùng thông minh lắm

tôi thích vậy đó

Bây giờ bất kỳ thay đổi nào thuộc folder /app/nginx đều được bind liên tục vào trong container đang chạy!

ahihi đồ ngốc trương thanh hùng nè

Bạn vào document của //hub.docker.com/_/nginx có nói về việc nginx này config ở thư mục nào: outputs to /etc/nginx/conf.d/default.conf like this ... 

bài viết được viết bởi trương thanh hùng //ebudezain.com/

ahihi đồ ngốc trương thanh hùng nè

tôi thích vậy đó

=> Mọi file config đều được nạp từ folder /etc/nginx/conf.d

tôi thích vậy đó

Điều đó giải thích cho việc chúng ta vừa code ở trên là bind từ ./nginx vào /etc/nginx/conf.d/

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

Ok hiểu là thế, vậy giờ chúng ta sẽ tạo file nginx/app.conf config như sau: 

hùng ebudezain

hùng ebudezain

đọc dữ liệu hộ bố

server {
    listen 80 default_server;
    root /app/public;
} 

ahihi đồ ngốc trương thanh hùng nè

đọc dữ liệu hộ bố

hùng ebudezain

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng thông minh lắm

hùng ebudezain

tôi thích vậy đó

hùng thông minh lắm

hùng thông minh lắm

Khi bạn viết như vậy là bạn đang thông báo cho nginx chạy trong cái container đó là: hey nginx, cứ có truy cập nào mày cũng cho nó lấy code trong folder /app/public nha!

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

đọc dữ liệu hộ bố

hùng ebudezain

Mà cái code trong folder app/public thì chả có 😄 nhưng chúng ta cũng từng khai báo với nginx là binding cái folder code app ở ngoài với cái app trong container rồi nên là giờ chúng ta chỉ viẹc tạo file app/public/index.html với nội dung như sau:

đọc dữ liệu hộ bố

hùng ebudezain




    
    
    
    test thử nha


    đây là trang tao mới thử tạo code html chưa có liên quan gì php

hùng ebudezain

tôi thích vậy đó

hùng thông minh lắm

hùng đẹp trai

Ta được kết quả như sau: 

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng đẹp trai

hùng thông minh lắm

hùng ebudezain

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

bài viết được viết bởi trương thanh hùng //ebudezain.com/

Cài đặt PHP-FPM

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

tôi thích vậy đó

hùng thông minh lắm

đọc dữ liệu hộ bố

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

1 file docker compose có thể chạy nhiều cái service cùng 1 lúc nên nhiệm vụ chúng ta là thêm service php vào trong file docker compose tiếp như sau: 

hùng ebudezain

hùng đẹp trai

hùng đẹp trai

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx:/etc/nginx/conf.d/
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

hùng đẹp trai

hùng đẹp trai

Cái đoạn: image: php:fpm là sử dụng image php:fpm. Đối với NGINX, bạn sẽ cần sử dụng gói fpm. Hiện tại mình ghi vậy là không chỉ định phiên bản và chỉ sử dụng php: fpm, nó sẽ sử dụng phiên bản mới nhất - tại thời điểm viết bài, là 8.0.

đọc dữ liệu hộ bố

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

Nếu bạn muốn chỉ định cụ thể thì dùng: php:7.4-fpm, php:7.3-fpm, php:8.0-fpm Tuỳ ý và có thể xem chi tiết ở đây: //hub.docker.com/_/php

ahihi đồ ngốc trương thanh hùng nè

tôi thích vậy đó

đọc dữ liệu hộ bố

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

hùng ebudezain

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

Như bạn đã biết hay không biết thì bạn cũng phải biết: nginx muốn chạy php phải config cho nó chạy file đuôi php 😄 nãy chưa config đâu giừo sửa lại file nginx/app.conf 1 tí: 

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

server {
    listen 80;
    index index.php index.html;
    
    root /app/public;
    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;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
} 

hùng đẹp trai

hùng ebudezain

hùng ebudezain

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng ebudezain

hùng ebudezain

hùng ebudezain

hùng đẹp trai

Cuối cùng muốn thực thi file php thì phải có file php mà thực thi chứ 😄 vậy trong folder app/public tạo file index.php với nội dung như sau: 

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng //ebudezain.com/

hùng ebudezain

Chủ Đề