docker วิชาจารย์อดุล (ยังอัพเดทเนื้อหายังไม่ครบอาจจะยัง งงๆ อยู่ เดะอธิยายเพิ่มให้)
การใช้ 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: bridgedocker
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
