สวัสดีครับ หลังจากที่ไม่ได้เขียนบทความมาหลายปี วันนี้ก็ได้โอกาศ เขียนกันสักที เอาไว้กันลืมครับ
ขั้นตอนแรกมาทำความรู้จักกันก่อนว่า 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