Create a example Application Web PHP + Docker (Phpmyadmin , Mysql , Nginx)

Hôm nay mình chia sẻ với mọi người cách mà chúng ta chạy một ứng dụng web bằng PHP + Docker. Thông thường thì có một số lập trình viên chỉ cài xampp để chạy web php. Nhưng nó có một số khó khăn khi project của ta ở PHP version nó khác nhau. Thì rất là phiên phức, chính vì thế mà ta phải sử dụng Docker để có thể đem project của ta đi khắp mọi nơi, nó cũng sử dụng được

Đầu tiên bạn tạo cho mình một project trong thư mục làm việc của chính bạn. VD: /webphp  

Bước 1: vào thư mục project /webphp , tạo cho mình một file index.php đơn giản thôi, ghi gì cũng được

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="content">
        <h1>Welcome HoaDev - Docker , Phpmyadmin, Nginx, Mysql</h1>
        <p>https://hoanguyenit.com</p>
    </div>
</body>
</html>

Bước 2: Tạo thư mục /webphp/docker-compose  , trong thư mục này tiếp tục tạo 2 thư mục (mysql,nginx)

+ /webphp/docker-compose/nginx : tạo file server.conf như code bên dưới đây. Nó giúp setup máy chủ chạy server web php của chúng ta 

server {
        listen 80;
        index index.php index.html;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /var/www/html;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app: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;
        }
    }

+ /webphp/docker-compose/mysql : bạn phải copy file database của bạn vào thư mục này, để cho ứng dụng nó tự import database giúp bạn

Bước 3 : Tại thư mục /webphp hãy tạo file Dockerfile với nội dụng code bên dưới. Trong file Dockerfile này, nó sẽ cấu hình chỉ rỏ php version mà ta cần chạy, chỉ rỏ thư mục cần làm việc, cài đặt các thư viện của php, bên cạnh đó các bạn có thể cài đặt composer,....có rất là nhiều thứ để cài trong đây, bạn có thể lên mạng tìm hiểu thêm

FROM php:5.6.30-fpm-alpine
RUN docker-php-ext-install mysql mysqli pdo pdo_mysql && docker-php-ext-enable mysql && docker-php-ext-enable mysqli
COPY . /var/www/html
WORKDIR /var/www/html

Bước 4 : Tại thư mục /webphp  tạo một file docker-compose.yml , trong file này ta cần cấu hình ứng dụng mà ta cần chạy là cái gì? VD: phpmyadmin , mysql , ngnix 

phpmyadmin/phpmyadmin:4.9 : ở đây mình dùng phiên bản 4.9 hoặc bạn có thể dùng phiên bản mới nhất phpmyadmin:latest . Ở image phpmyadmin này giúp ta quản lý database của ta có giao diện thân thiện hơn

+ mysql : trong image này để cài đặt mysql , như mình có tạo thư mục /webphp/docker-compose/mysql, và có copy file database vào, tại image mysql này ta có thể import tự động

      db:
            image: mysql:5.6
            container_name: sail-db
            restart: unless-stopped
            environment:
              MYSQL_DATABASE: ${DB_DATABASE}
              MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
              MYSQL_PASSWORD: ${DB_PASSWORD}
              MYSQL_USER: ${DB_USERNAME}
              SERVICE_TAGS: dev
              SERVICE_NAME: mysql
            volumes:
              - ./docker-compose/mysql:/docker-entrypoint-initdb.d
            networks:
              - php56

+ nginx : giúp chúng ta cấu hình server chạy web php của chúng ta 

FullCode file docker-compose.yml 

version: "3.8"
services:
          app:
            build:
              context: ./
              dockerfile: Dockerfile
            image: sail
            container_name: sail-app
            restart: unless-stopped
            working_dir: /var/www/html
            volumes:
              - ./:/var/www/html
            networks:
              - php56
        
          db:
            image: mysql:5.6
            container_name: sail-db
            restart: unless-stopped
            environment:
              MYSQL_DATABASE: ${DB_DATABASE}
              MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
              MYSQL_PASSWORD: ${DB_PASSWORD}
              MYSQL_USER: ${DB_USERNAME}
              SERVICE_TAGS: dev
              SERVICE_NAME: mysql
            volumes:
              - ./docker-compose/mysql:/docker-entrypoint-initdb.d
            networks:
              - php56

          phpmyadmin:
              image: phpmyadmin/phpmyadmin:4.9
              ports:
                - 8080:80
              volumes:
                - ./uploads.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
              environment:
                - PMA_ARBITRARY=1
                #- PMA_HOSTS=db:localhost, db:172.23.32.1
              depends_on:
                - db
              networks:
                - php56
         
        
          nginx:
            image: nginx:alpine
            container_name: sail-nginx
            restart: unless-stopped
            ports:
              - 8000:80
            volumes:
              - ./:/var/www/html
              - ./docker-compose/nginx:/etc/nginx/conf.d/
            networks:
              - php56
networks:
      php56:
        driver: bridge

Okay vậy là xong, mà các bạn nhớ tạo file .env để đọc các thông tin DB_DATABASE, DB_USERNAME, DB_PASSWORD nghe 

DB_HOST=db
DB_USERNAME=hoadev92
DB_PASSWORD=12345678
DB_DATABASE=db_hoadev92

Tại thư mục /webphp , bạn hãy tạo file uploads.ini để setup max_size khi chúng ta cần import database một cách thủ công, mà file database của ta có dung lượng quá lớn

post_max_size=200M 
upload_max_filesize=200M

Bước 5 : Run file docker-compose.yml 

# docker-compose up --build
or
# docker-compose up -d

// nếu bạn muốn tắt chạy docker bên trên
# docker-compose down -v

Vậy là xong hết rồi, nếu mọi thứ chạy thành công, bạn hãy gõ đường dẫn sau:

+ http://localhost:8000   đây là web chạy php

+ http://localhost:8080  đây là phpmyadmin quản lý database của chúng ta , đăng nhập bằng username, password  trong file .env mà ta đã cấu hình, có một trường hợp xấu xảy ra là ta sẽ đăng nhập không được. Thì ta sẽ dùng cách sau

Mở Command line lên và chạy một số câu lệnh sau:

# docker-compose exec db bash
# mysql -u root -p 

Nó yêu cầu nhập username và password, thì bạn nhập giống trong file .env , nếu đúng nó sẽ trỏ vào bash của mysql

mysql> use mysql;
mysql> select user,host from user;

Tiếp tục chạy lệnh sau, để chỉ rỏ username của ta và setup password lại 

//câu lệnh dưới này dùng cho phiên bản mysql:5.6
SET PASSWORD FOR 'hoadev92'@'%' = PASSWORD('12345678');

//câu lệnh dưới dùng cho phiên bản mysql:latest mới nhất
ALTER USER 'hoadev92'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';

Chú ý : hoadev92->username  , 12345678 -> nó là password, nhớ nhập đúng trong file .env mà bạn đã cấu hình

Nếu ok nó sẽ hiện thông báo Query ok , thì lúc này bạn F5 web http://localhost:8080 của phpmyadmin, đăng nhập với username và password lại 

Máy chủ: db 
Tài khoản: hoadev92
Mật khẩu: 12345678

Chúc các bạn thành công!

Bài Viết Liên Quan

Messsage

Ủng hộ tôi bằng cách click vào quảng cáo. Để tôi có kinh phí tiếp tục phát triển Website!(Support me by clicking on the ad. Let me have the money to continue developing the Website!)