Skip to main content

การใช้งาน Docker รัน php8.3/Nginx/phpmyadmin/MySQL ฉบับรวดเดียวจบ

สวัสดีครับ หลังจากที่ไม่ได้เขียนบทความมาหลายปี วันนี้ก็ได้โอกาศ เขียนกันสักที เอาไว้กันลืมครับ

ขั้นตอนแรกมาทำความรู้จักกันก่อนว่า Docker คืออะไร

Docker คือ ซอฟต์แวร์ที่สามารถจำลองเครื่องของเราให้สามารถติดตั้ง ซอฟต์แวร์ หรือ เซอร์วิส ต่าง ๆ ให้มีสภาพแวดล้อมที่เสมือนกับเครื่อง Server จริง ๆ โดยจะแยกออกจากระบบปฏิบัติการของเครื่อง ซึ่งทำให้เราสามารถติดตั้ง ซอฟต์แวร์ หรือ เซอร์วิส ใน version ต่าง ๆ ที่ต้องการรันโปรแกรมของเราได้ ซึ่งในที่นี้จะเรียกว่า Docker container

การติดตั้ง Docker Desktop

ไปที่ https://www.docker.com ทำการ Download และ ติดตั้งให้เรียบร้อย

เตรียมโครงสร้าง Folder สำหรับ ติดตั้ง php/nginx/mysql และ phpmyadmin ดังภาพ

ประกอบไปด้วย Folder และ File เตรียมไฟล์ต่าง ๆ ให้พร้อม ดังนี้

  • Folder app
    • File index.php
  • Folder database
    • File schema.sql
  • Folder mysql
    • File my.cnf
  • Folder nginx
    • File default.conf
    • File Dockerfile
  • Folder php
    • File Dockerfile
  • File docker-compose.yml

1.คำสั่งสำหรับ Download Docker Image และ ติดตั้ง Docker containter

ประกอบไปด้วย php8 / Nginx / MySQL / phpMyAdmin

ตัวอย่างไฟล์ docker-compose.yml

version: '3.9'
services:
  nginx:
    image: nginx:latest
    restart: always
    environment:
      TZ: 'Asia/Bangkok'
    ports:
      - '80:80'
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf #สำหรับกรณีที่ต้องการเรียกใช้ไฟล์ default.conf จาก Folder ภายนอก
      - ./app:/var/www/html                    
    networks:
      - web
  php-fpm-1:
    build:
      context: ./php
    container_name: php-fpm-php-v-8
    restart: always
    volumes:
      - ./app:/var/www/html 
    depends_on:
      - mysql-database
    networks:
      - web                   
  mysql-database:
    image: mysql:8.3
    container_name: mysql-database-php-v-8
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=mydb
      - ALLOW_EMPTY_PASSWORD=yes    
    volumes:
      - ./database:/var/lib/mysql #กำหนดให้บันทึกฐานข้อมูล ไว้ที่ Folder database
      - ./database/schema.sql:/docker-entrypoint-initdb.d/1.sql
    ports:
      - "3310:3306"  
    networks:
      - web   
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: phpmyadmin-php-v-8
    restart: always   
    environment:
      PMA_HOST : mysql-database
      TZ : Asia/Bangkok
      UPLOAD_LIMIT: 1024M
      MEMORY_LIMIT: 1024M
    ports:
      - 8081:80
    depends_on:
      - mysql-database
    networks:
      - web 
networks:
  web:
    name: web


2.คำสั่งสำหรับติดตั้ง PHP8

ตัวอย่างไฟล์ example/php/Dockerfile

# Add PHP-FPM base image
FROM php:8.3-fpm

# Install your extensions
# To connect to MySQL, add mysqli
RUN docker-php-ext-install mysqli pdo pdo_mysql

3.คำสั่งสำหรับติดตั้ง Nginx

ตัวอย่างไฟล์ example/nginx/Dockerfile

FROM nginx:alpine
ADD nginx/default.conf /etc/nginx/conf.d

4.ไฟล์ default.conf สำหรับ Config Nginx

server {
    listen 80; # Listen for HTTP requests on port 80
    server_name localhost; # Set the server name to localhost

    root /var/www/html; # Set the root directory for serving files

    index index.php index.html index.htm; # Define the index files to look for

    location ~ \.php$ {
        include fastcgi_params; # Include FastCGI parameters for PHP processing
        fastcgi_pass php-fpm-1:9000; # Pass PHP requests to the php-web-server service on port 9000
        fastcgi_index index.php; # Specify the index file for PHP requests
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # Set the PHP script filename
        fastcgi_param PATH_INFO $fastcgi_path_info; # Set the PATH_INFO parameter for PHP
    }
}

5.สร้างไฟล์ example/database/schema.sql สำหรับติดตั้งฐานข้อมูลเริ่มต้น

CREATE TABLE `user` (
 `id` int unsigned NOT NULL AUTO_INCREMENT,
 `firstname` varchar(30) NOT NULL,
 `lastname` varchar(30) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `user` (`id`, `firstname`, `lastname`) VALUES
(1, 'John ', 'Fitzgerald '),
(2, 'FullName', 'LastName');

6.คำสั่งแสดงข้อมูลจากฐานข้อมูล

ไฟล์ app/index.php

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" >
  </head>
  <body>

<?php
//$servername = "localhost";
$servername = "mysql-database";//เปลี่ยนไปใช้ชื่อ database container ของ Docker
$username = "root";
$password = "123456";
$dbname = "mydb";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT id, firstname, lastname FROM user";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    
  // output data of each row
  echo "<h3>User Table</h3>";
  echo "<table class='table'>";
    echo "<tr class='table-dark'>";
            echo "<th>firstname</th>";
            echo "<th>lastname</th>";
    echo "</tr>";
  while($row = mysqli_fetch_assoc($result)) {
        echo "<tr>";
            echo "<td>".$row["firstname"]."</td>";
            echo "<td>".$row["lastname"]."</td>";
        echo "</tr>";
  }
  echo "</table>";
} else {
  echo "0 results";
}

mysqli_close($conn);
?>
  </body>
  </html>

การรันโปรแกรม

1.เปิด โปรแกรม Docker Desktop เพื่อให้ Docker ทำงาน

2.เปิดโปรแกรม Visual Studio Code (VS Code) และ เปิด Folder example

เลือกไฟล์ docker-compose.yml

3.ที่ แทบ Menu ด้านบนเลือก Terminal เลือกที่ New Terminal

4.พิมพ์คำสั่ง docker-compose up

5.หากไม่มีอะไรผิดพลาดจะแสดงการสร้าง docker container ดังภาพ

6.เปิดโปรแกรม Docker Desktop เพื่อดูว่า Server ที่เราสร้าง run อยู่ที่ port ใดบ้าง

nginx ใช้งาน port : 80

mysql ใช้งาน port : 3306 และ

phpmyadmin ใช้งาน port : 8081

7.ทดสอบการรัน php เปิด Web Browser ไปที่ URL : http://localhost/index.php

8.ทดสอบการเปิดใช้งาน phpmyadmin ไปที่ URL : http://localhost:8081

9.ระบุ username : root password : 123456 เพื่อเข้าสู่หน้าจัดการข้อมูล phpmyadmin