Env HOST
- Ubuntu 21.10
- MySQl 8
- PHP 8
Step
- ติดตั้ง docker service และ docker-compose ให้เรียบร้อย
$ sudo apt install docker docker-compose
- start docker service และ กำหนดมันให้เป็น service จะได้ start ตอนบูตระบบทุกครั้ง ด้วยคำสั่ง
$ systemctl enable --now docker
- เตรียม folder project เราจะไปสร้างไว้ที่ home ของ user เราใช้งานปัจจุบันโดย
- สร้าง directory ใหม่แบบ พาธเลย โดยใช้ option p (ในที่นี้เรายังไม่มี linuxconfig และ www folder ถ้าเราไม่ใช้ -p มันจะบอกว่าไม่พบ folder linuxconfig แบบนี้แหละ)
$ cd ~ && mkdir -p linuxconfig/www
- จากนั้นสร้างไฟล์ docker-compose ไว้พาธนี้
$ nano linuxconfig/docker-compose.yml
- เพิ่มประมาณนี้ในไฟล์
- จากนั้นสร้าง Dockerfile อีกอันเอาไว้แก้ปัญหา php mysql driver การเชื่อมต่อระหว่าง php กับ mysql
$ nano linuxconfig/Dockerfile
- จากด้านบน เราสร้าง container 3 อัน (services 3 ชื่อ www, database, phpmyadmin) โดยทำ link ให้ container เห็นกันได้เลย
- สร้างไฟล์ทดสอบ phpinfo โดย
$ echo "<?php phpinfo();" > ~/linuxconfig/www/index.php
- จากนั้นสั่งให้ build container ทั้งหมดผ่าน docker-compose โดยคำสั่ง
$ cd linuxconfig && sudo docker-compose up -d
- เพิ่มเติมใส่ -d เพราะทำให้มันเป็น daemon (background service สั่งรันคำสั่งนี้แล้วสามารถ รับคำสั่งอื่นต่อไปด้าน โดยไม่แสดง output ของ service นี้)
- รันได้ไม่มีปัญหาก็จะแสดง done ประมาณนั้น
- ทดสอบโดยเข้า http://host_ip:8001/index.php
Note
- คำสั้งสำหรับ stop project ของเรา
$ sudo docker-compose stop
- คำสั่งในกรณีเราแก้ docker-compose.yml หรือ แก้ Dockerfile เราต้อง build container ใหม่ด้วยคำสั่ง
$ sudo docker-compose up -d --build
- อธิบายคอนฟิกที่สำคัญ
command: --default-authentication-plugin=mysql_native_password
- เอาไว้แก้ไขปัญหานี้
the server requested authentication method unknown to the client [caching_sha2_password]
- ส่วนที่เราต้องมี Dockfile เอาไว้เพิ่มคำสั่ง load library ที่จำเป็นสำหรับ php library mysql pdo
- ในไฟล์ docker-compose เราจะเห็น build: . คือ ตัว service www เราจะมีการเรียก Dockerfile ใน path ปัจจุบันที่มันทำงานอยู่ด้วย
- อีกเรื่องใน dockerfile มีคำสั่งแบบนี้ RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
- เอาไว้แก้ปัญหาเรื่อง json response มี php warning ออกมาด้วย มันจะ ajax error เป็นการใช้ php.ini ด้วย production config ไปเลย คล้ายกับ php framework ที่เปิดใช้งาน production env นั่นแหละคับ
Ref
- https://linuxconfig.org/how-to-create-a-docker-based-lamp-stack-using-docker-on-ubuntu-20-04
- https://blog.devgenius.io/docker-php-pdo-mysql-how-to-8c0aee437539
- https://javakoon.blogspot.com/2020/11/docker-compose-lamp-stack-linux-apache.html
- https://arnondora.in.th/docker-tip-lamp-stack-docker/
- https://medium.com/touch-technologies/%E0%B8%97%E0%B8%B3%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81-docker-compose-b6688fc98c6f
- https://medium.com/@somprasongd/docker-compose-%E0%B8%84%E0%B8%B7%E0%B8%AD-fc8b35e0c8bc
- https://sysadmin.psu.ac.th/2017/09/19/get-started-with-docker-part-11-docker-compose-ldap-services/