cover

docker วิชาจารย์อดุล (ยังอัพเดทเนื้อหายังไม่ครบอาจจะยัง งงๆ อยู่ เดะอธิยายเพิ่มให้)

21 ตุลาคม 2568

การใช้ docker compose ในการสร้าง container ของ nginx และ mysqli

ให้ทุกคนสร้าง folder หรือใช้ command line หรือ powershell ในการจัดการ

mkdir my_project

และ

cd my_project

ต่อมาให้

code .

และให้สร้างไฟล์ docker-compose.yml

yaml

1version: '3.9'
2
3services:
4  nginx:
5    image: nginx:latest
6    container_name: nginx_app
7    ports:
8      - "80:80"
9    volumes:
10      - ./nginx/conf.d:/etc/nginx/conf.d 
11      - ./www:/usr/share/nginx/html
12    depends_on:
13      - mysql
14    networks:
15      - app_network
16
17  mysql:
18    image: mysql:8.0
19    container_name: mysql_db
20    restart: always
21    environment:
22      MYSQL_ROOT_PASSWORD: rootpass
23      MYSQL_DATABASE: mydb
24      MYSQL_USER: myuser
25      MYSQL_PASSWORD: mypass
26    volumes:
27      - mysql_data:/var/lib/mysql
28    ports:
29      - "3306:3306"
30    networks:
31      - app_network
32
33networks:
34  app_network:
35    driver: bridge
36
37volumes:
38  mysql_data:

และสร้าง folder www ใน my_project

และสร้าง nginx/conf.d/default.conf

coffeescript

1server {
2    listen 80;
3    server_name localhost;
4
5    root /usr/share/nginx/html;
6    index index.html index.php;
7
8    location / {
9        try_files $uri $uri/ =404;
10    }
11
12    # ตัวอย่าง PHP-FPM (ถ้าคุณจะเพิ่ม php ในภายหลัง)
13    # location ~ \.php$ {
14    #     fastcgi_pass php:9000;
15    #     fastcgi_index index.php;
16    #     include fastcgi_params;
17    #     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
18    # }
19}

และให้ใช้คำสั่ง

docker-compose up -d

จากนั้นทดสอบโดย สร้าง index.html ใน www และเขียนอะไรก็ได้ไว้ในนั้นเลย เช่น

html

1<!DOCTYPE html>
2<html lang="en">
3<head>
4    <meta charset="UTF-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
6    <title>สวัสดีครับจารย์อะดุล</title>
7</head>
8<body>
9    <h1>Hello จารย์อดุล</h1>
10</body>
11</html>

และไปดูที่ http://localhost ก็จะเห็น

💡
ขอให้ทุกคนสนุกกับการทดลอง แต่ยังไม่จบหรอกเดะมาต่อให้

โอเคตอนนี้เราใช้ nginx ในการให้แสดง index.html ได้แล้วแต่ถ้าเราต้องการที่จะใช้ php ละให้เราทำตามนี้

yaml

1version: '3.9'
2
3services:
4  nginx:
5    image: nginx:latest
6    container_name: nginx_app
7    ports:
8      - "80:80"
9    volumes:
10      - ./nginx/conf.d:/etc/nginx/conf.d
11      - ./www:/var/www/html 
12    depends_on:
13      - php
14      - mysql
15    networks:
16      - app_network
17
18  php:
19    build: ./php
20    image: php:8.2-fpm
21    container_name: php_fpm
22    volumes:
23      - ./www:/var/www/html
24    networks:
25      - app_network
26
27  mysql:
28    image: mysql:8.0
29    container_name: mysql_db
30    restart: always
31    environment:
32      MYSQL_ROOT_PASSWORD: rootpass
33      MYSQL_DATABASE: mydb
34      MYSQL_USER: myuser
35      MYSQL_PASSWORD: mypass
36      TZ: "Asia/Bangkok"
37    volumes:
38      - mysql_data:/var/lib/mysql
39    ports:
40      - "3306:3306"
41    networks:
42      - app_network
43
44networks:
45  app_network:
46    driver: bridge
47
48volumes:
49  mysql_data:

และให้เราสร้างไฟล์ในการทดสอบ www/info.php

จากนั้นให้เขียนใน info.php

php

1<?php 
2phpinfo();
3?>

และมา config ที่ nginx/conf.d/default.conf ต่อ

coffeescript

1server {
2    listen 80;
3    server_name localhost;
4
5    root /var/www/html;
6    index index.php index.html;
7
8    location / {
9        try_files $uri $uri/ /index.php?$query_string;
10    }
11
12    location ~ \.php$ {
13        include fastcgi_params;
14        fastcgi_pass php:9000;
15        fastcgi_index index.php;
16        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
17    }
18
19    location ~ /\.ht {
20        deny all;
21    }
22}

จากนั้นสร้าง mysql/conf.d/my.cnf

coffeescript

1[mysqld]
2character-set-server = utf8mb4
3collation-server = utf8mb4_general_ci
4default-time-zone = +07:00
5innodb_buffer_pool_size = 128M
6max_connections = 200
7
8[client]
9default-character-set = utf8mb4

และให้ใช้ทำสั่ง

docker-compose down

จากนั้น

docker-compose up -d

แบบนี้

และลองเข้าไปดูที่ http://localhost/info.php ก็จะเห็นว่า php ใช้งานได้แล้ว

จากนั้นถ้าเราจะใช้ mysqli ของ php ละทำไงวะ? ให้เรา สร้าง php/Dockerfile

docker

1FROM php:8.2-fpm
2
3# ติดตั้ง extension ที่จำเป็น
4RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli
5
6# ตั้ง timezone (เลือกได้)
7ENV TZ=Asia/Bangkok

จากนั้นให้เราสร้าง file test.php หรือจะเขียน index.php ก็ได้นะ

php

1<!-- www/test.php -->
2<?php
3$servername = "mysql";
4$username = "root";
5$password = "rootpass";
6$dbname = "mydb";
7
8$conn = new mysqli($servername, $username, $password, $dbname);
9
10if ($conn->connect_error) {
11  die("Connection failed: " . $conn->connect_error);
12}
13echo "Connected successfully to MySQL!";
14
15$result = $conn->query("SELECT NOW() AS time");
16$row = $result->fetch_assoc();
17echo "Server Time: " . $row['time'];
18
19$conn->close();
20?>

และให้ใช้คำสั่ง

docker-compose down

จากนั้น

docker-compose up -d —build

แบบนี้

เสร็จแล้วเราก็จะใช้ mysqli หรือ pdo ได้แล้ว

ให้เราไปทดสอบที่ http://localhost/test.php เราก็จะเห็น

แบบนี้แสดงว่าเราใช้ mysqli เพื่อดึงข้อมูลจาก database ได้แล้ว 🥳

💡
ถ้าติดตรงไหนก็สามารถ comment ด้านล่างได้เลย

สำหรับใครที่อยากได้ folder config เต็มของผม https://github.com/ntdotjsx/adul-docker-config

โอเคสำหรับ apache

yaml

1version: '3.9'
2
3services:
4  php:
5    build:
6      context: ./www
7      dockerfile: Dockerfile
8    container_name: php_diwa
9    restart: always
10    ports:
11      - '80:80'
12    volumes:
13      - ./www:/var/www/html
14    networks:
15      - app_network
16
17  db:
18    image: mariadb:latest
19    container_name: mydatabase
20    restart: always
21    environment:
22      - MYSQL_ROOT_PASSWORD=1234
23      - MYSQL_DATABASE=pro_db
24      - MYSQL_USER=myadmin
25      - MYSQL_PASSWORD=1234
26    volumes:
27      - ./mysql/initdb/:/docker-entrypoint-initdb.d/
28      - ./mysql/data/:/var/lib/mysql
29    ports:
30      - '3306:3306'
31    networks:
32      - app_network
33
34  phpmyadmin:
35    image: phpmyadmin/phpmyadmin:latest
36    container_name: phpmyadmin
37    environment:
38      - PMA_HOST=db
39      - PMA_PORT=3306
40      - PMA_USER=root
41      - PMA_PASSWORD=1234
42    ports:
43      - '8080:80'
44    depends_on:
45      - db
46    networks:
47      - app_network
48
49networks:
50  app_network:
51    driver: bridge

docker

1FROM php:8.3-fpm
2
3# ติดตั้ง dependencies ที่จำเป็นก่อน
4RUN apt-get update && apt-get install -y \
5    libzip-dev \
6    libonig-dev \
7    zip \
8    unzip \
9    && docker-php-ext-install mysqli pdo_mysql mbstring \
10    && docker-php-ext-enable mysqli pdo_mysql