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 https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://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 https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://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 https://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 https://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 https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://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 https://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 https://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 https://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 : http://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 https://ebudezain.com/

tôi thích vậy đó

Hướng dẫn php-fpm docker

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://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 https://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 https://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 https://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 https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://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 https://ebudezain.com/

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

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

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

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

hùng đẹp trai

hùng thông minh lắm

hùng ebudezain

hùng đẹp trai

Hướng dẫn php-fpm docker

hùng ebudezain

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://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 https://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 https://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: https://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 https://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 https://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 https://ebudezain.com/

hùng ebudezain

hùng ebudezain

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

hùng ebudezain

hùng đẹp trai

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

hùng đẹp trai

hùng thông minh lắm

hùng đẹp trai

Okey! giừo restart lại docker compose là thôi! 

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

hùng ebudezain

hùng thông minh lắm

Chờ xíu nó download xong thì gõ :  http://127.0.0.1 thì sẽ hiện thị ví dụ php:7.3-fpm như sau: 

tôi thích vậy đó

hùng ebudezain

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

tôi thích vậy đó

Hướng dẫn php-fpm docker

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

hùng ebudezain

hùng thông minh lắm

tôi thích vậy đó

hùng đẹp trai

Bạn nhớ khi cài xampp bạn muốn dùng mysql rồi mấy cái extention như PDO hay là image magic đều được start lên NHƯNG với tình huống này chúng ta kiểm tra thì không thấy nó được start + muốn start cũng chả biết chỗ quái nào mà start!!!

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

hùng đẹp trai

tôi thích vậy đó

hùng ebudezain

hùng đẹp trai

Vậy thì căng 😄 idea là mình sẽ tạo 1 image custom việc này cùng cấp với docker compose rồi trong docker compose mình tái sử dụng! 

hùng ebudezain

1. Bước 1 sửa docker compose

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

hùng thông minh lắm

tôi thích vậy đó

hùng ebudezain

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx:/etc/nginx/conf.d/
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP_CUSTOM.Dockerfile
        volumes:
            - ./app:/app

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

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

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

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

Tạo file PHP_CUSTOM.Dockerfile ngang cấp docker-compose.yml với nội dung:

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

hùng ebudezain

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

FROM php:7.3-fpm
RUN docker-php-ext-install pdo pdo_mysql

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

tôi thích vậy đó

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

hùng ebudezain

Ok như vậy là bạn đã có pdo cho mysql chạy rồi. Tương tự nếu bạn muốn cài thêm extention khác thì cứ nghịch trong PHP_CUSTOM.Dockerfile là ok rồi. Ví dụ bạn muốn cài thêm cho php là chạy cái xdebug thì gọi như sau: 

hùng thông minh lắm

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

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

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

FROM php:7.3-fpm

RUN docker-php-ext-install pdo pdo_mysql

RUN pecl install xdebug && docker-php-ext-enable xdebug

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

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

Chạy lại docker-compose up và kiểm tra output của phpinfo () sẽ cho thấy rằng cả pdo_mysql và xdebug đều được cài đặt:

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

hùng ebudezain

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

tôi thích vậy đó

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

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

Hướng dẫn php-fpm docker

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

hùng thông minh lắm

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

Lưu ý to đùng: Đôi khi bạn build docker compose bạn sẽ dính cache và nó không nhận code mới của bạn! bạn dùng lệnh build này trước: 

hùng đẹp trai

hùng thông minh lắm

docker-compose build --no-cache
# sau đó mới gọi 
docker-compose up

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

CàiMariaDB thay cho mysql

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"
        volumes:
            - ./nginx:/etc/nginx/conf.d/
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP_CUSTOM.Dockerfile
        volumes:
            - ./app:/app
    mysql:
        image: mariadb:latest
        environment:
            MYSQL_ROOT_PASSWORD: 'secret'
            MYSQL_USER: 'admin'
            MYSQL_PASSWORD: 'secret'
            MYSQL_DATABASE: 'testing'
        volumes:
            - mysqldata:/var/lib/mysql
        ports:
            - 3306:3306
volumes:
    mysqldata: {}

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

hùng thông minh lắm

hùng đẹp trai

tôi thích vậy đó

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

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

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

hùng ebudezain

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

Image đang sử dụng là mariadb:lastest. Cũng như NGINX và PHP, nếu muốn, bạn có thể chỉ định một phiên bản cụ thể của MariaDB tại đây.

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

tôi thích vậy đó

tôi thích vậy đó

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

hùng đẹp trai

Bạn có mấy biến để khi dùng php bạn config connection đến: 

hùng ebudezain

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

hùng ebudezain

hùng ebudezain

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

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

hùng thông minh lắm

hùng đẹp trai

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

MYSQL_ROOT_PASSWORD: mật khẩu gốc của cơ sở dữ liệu.

hùng ebudezain

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

hùng thông minh lắm

hùng đẹp trai

tôi thích vậy đó

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

tôi thích vậy đó

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

MYSQL_USER và MYSQL_PASSWORD: tên và mật khẩu cho người dùng MySQL được tạo với các quyền hạn chế.

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

hùng đẹp trai

tôi thích vậy đó

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

tôi thích vậy đó

hùng thông minh lắm

hùng thông minh lắm

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

hùng ebudezain

tôi thích vậy đó

MYSQL_DATABASE: tên của database

hùng đẹp trai

hùng thông minh lắm

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

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

tôi thích vậy đó

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

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

hùng thông minh lắm

hùng thông minh lắm

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

cổng 3306 để chúng ta có thể kết nối với nó với một máy khách như MySQL Workbench để quản lý cơ sở dữ liệu.

hùng ebudezain

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

tôi thích vậy đó

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

hùng thông minh lắm

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

hùng thông minh lắm

hùng thông minh lắm

Khởi động lại máy chủ của bạn: 

hùng ebudezain

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

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

hùng đẹp trai

hùng thông minh lắm

tôi thích vậy đó

Vào file php edit đoạn code này thử xem chạy được chưa: 

hùng đẹp trai

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

hùng thông minh lắm

 PDO::ERRMODE_EXCEPTION]
);

$query = $pdo->query('SHOW VARIABLES like "version"');

$row = $query->fetch();

echo 'MySQL version:' . $row['Value'];

hùng ebudezain

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

hùng đẹp trai

hùng ebudezain

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

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

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

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

hùng ebudezain

hùng ebudezain

Hướng dẫn php-fpm docker
 

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

hùng đẹp trai

hùng ebudezain

Bonus cuối:

hùng ebudezain

tôi thích vậy đó

hùng ebudezain

# nếu bạn muốn thực thi command trong 1 container nào đó thì gõ:
docker exec -it ID_CONTAINER /bin/sh
docker exec -it ID_CONTAINER /bin/bash
# ví dụ
docker exec -it 092d7adebed9 /bin/bash
# ID_CONTAINER lấy đâu ra : 
docker ps

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

hùng đẹp trai

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

hùng đẹp trai

hùng ebudezain

tôi thích vậy đó

Để vào mysql xem connect của php xem thế nào:

hùng thông minh lắm

hùng ebudezain

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

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

hùng thông minh lắm

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

hùng thông minh lắm

Kết quả 

hùng thông minh lắm

hùng đẹp trai

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

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

 ###########
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                              NAMES
092d7adebed9   nginx:latest         "/docker-entrypoint.…"   31 minutes ago   Up 29 minutes   0.0.0.0:80->80/tcp                 learningdocker-webserver-1
a20fda699208   learningdocker_php   "docker-php-entrypoi…"   31 minutes ago   Up 29 minutes   9000/tcp                           learningdocker-php-1
52ff7e05beb0   mysql:5.7.22         "docker-entrypoint.s…"   31 minutes ago   Up 29 minutes   0.0.0.0:3306->3306/tcp             db1

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

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

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

hùng ebudezain

hùng ebudezain

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

 Chạy vào terminal mysql

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

hùng đẹp trai

hùng thông minh lắm

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

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

hùng đẹp trai

hùng ebudezain

Nhập password là secret vào:

hùng ebudezain

Hướng dẫn php-fpm docker

hùng ebudezain

hùng ebudezain

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

hùng ebudezain

hùng thông minh lắm

hùng thông minh lắm

hùng thông minh lắm

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

Gõ lệnh kiểm tra connect:

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

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

hùng thông minh lắm

hùng thông minh lắm

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

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

hùng ebudezain

hùng ebudezain

Hướng dẫn php-fpm docker