วิธีการติดตั้ง LEMP Stack โดยใช้ Docker
เมื่อเราเรียก Terminal ขึ้นมา มันจะสร้าง Virtual machine ชื่อว่า Default มี IP 192.168.99.100 ทำหน้าที่เป็น Docker Host เราจะสร้าง Container (คล้าย ๆ กับ Virtual machine แต่ใช้ Kernel ของ Host ทำให้มีขนาดเล็กลงกว่ามาก) ที่ทำงานบน Docker Host นี้อีกที
Preparation
เมื่อเข้ามาที่ใน docker console สามารถใช้คำสั่งดังนี้sudo mount -t vboxsf docker (ชื่อที่ map ใน shared-folder ของ vbox) /mnt/docker
# (ต้องสร้าง folder /mnt/docker ก่อน)
docker images (แสดง images ที่ pull มาแล้ว)
docker info (แสดงข้อมูล docker)
เราจะ configure ตามโครงสร้างนี้
web browser รับ request จาก URL ของเครื่อง Host ที่เป็นเครื่องหลัก ถ้า request static files ทั้งหมดที่ไม่ใช่ .php เช่น file.html .jpg .css ก็จะใช้ nginx container ประมวลผล หากมีการร้องขอ file.php ก็จะส่งต่อไปยัง php fpm ที่ port 9000 หากต้องการติดต่อฐานข้อมูลก็จะส่งไปยัง mysql ทาง port 3306 อีกที
การติดตั้ง จะเริ่มจาก MySQL ก่อน และ เป็น PHP FPM เนื่องจากต้องมีการเชื่อมโยง (link) กับ MySQL container และ nginx เป็นตัวสุดท้าย มีขั้นตอนดังนี้
MySQL installation
docker pull mysql:5.7.4
ใช้คำสั่ง docker images เพื่อตรวจสอบ container ที่ download มา การทำงานตรงนี้จะมีการ cache file ไว้ แม้ว่าเราลบ images ออกไป การ pull images มาใหม่ ก็จะดึงมาจาก cache
mkdir /d/docker/data #ในกรณีนี้ เลือก /d/docker ใน shared folder ของ virtual box
cd /d/docker/
docker run --name mysql -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7.4
กำหนด option -v มีการ mount data volume ของ mysql เพื่อป้องกัน container ถูกทำลาย ข้อมูลจะได้ไม่หาย
ทดสอบว่า container ถูกสร้างได้ไหม โดยคำสั่ง
docker ps
ทดลองเข้า mysql ใน container (สร้าง database ใหม่ และ กำหนดสิทธิ์)
docker exec -it mysql bash
mysql -uroot -ppassword
create database dev;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
exit;PHP FPM installation
docker pull php:7.0-fpm
โหลด image ของ nginx เวอร์ชั่น 7.0 fpm
สร้าง container พร้อมสั่งให้ทำงาน โดยตั้งชื่อ container ว่า phpfpm มีการเชื่อมโยงกับ mysql และ มีการ map volume ที่เก็บไฟล์ php ที่รอรับการส่งมาจาก nginx อีกที
Nginx installaion
docker pull
nginx:1.11
โหลด image ของ nginx เวอร์ชั่น 1.11
docker run --name nginx -d nginx:1.11
สร้าง container และ สั่งให้ทำงานในชื่อ nginx
docker cp nginx:/etc/nginx/conf.d .
copy configure file ของ nginx จาก container ออกมาข้างนอก
ปรับแต่ง nginx ตามนี้
ในบรรทัด fastcgi_pass phpfpm:9000; ต้องกำหนดชื้่อ phpfpm container และ port
docker rm -f $(docker ps -aq -f name=nginx)
สั่งลบ container nginx
docker run --name
nginx --link phpfpm:7-fpm -v $(pwd)/www:/usr/share/nginx/html -v
$(pwd)/conf.d:/etc/nginx/conf.d:ro -p 80:80 -d nginx:1.11
สร้าง container nginx และ สั่งให้เริ่มทำงานอีกครั้ง โดยคราวนี้ เราจะ map volume ของ web root directory และ cofiguration ใหม่ (ใส่ ro เพื่อ map แบบ read-only) ของ nginx และมีการเชื่อมต่อกับ container ของ php
-p 80:80 (80 ตัวหน้า หมายถึง port ที่ป้อนลงไปใน web browser ในเครื่อง host ส่วน 80 ตัวหลังเป็น port ของ nginx container)
สามารถ ping ระหว่าง container ได้
docker exec -it phpfpm
ping mysql # phpfpm สามารถ ping mysql ได้
docker exec -it
nginx ping phpfpm # nginx สามารถ ping phpfpm ได้ แต่ไม่สามารถ ping ย้อนกลับได้
ทดลองสร้างไฟล์ index.html และ test.php ไว้ใน ./www
vim test.php
<?php phpinfo(); ?>
จากนั้นเปิด web browser แล้วเรียก http://192.168.99.100/test.php ถ้าแปลคำสั่ง php ได้ ถือว่าผ่านครับ
PhpMyAdmin
ส่วนสุดท้ายคือ PhpMyAdmin เครื่องมือติดต่อ Database ยอดฮิตdocker pull phpmyadmin/phpmyadmin:4.6.4-1
docker run --name myadmin -e PMA_HOST=mysql -d --link mysql -p 8080:80 phpmyadmin/phpmyadmin:4.6.4-1 -e MYSQL_ROOT_PASSWORD=password
เนื่องจากมีการแจก container ของ phpmyadmin ออกมาต่างหาก จึงต้องมีการ map port 8080 หาก browser มีการเรียก http://192.168.99.100:8080/ ก็ให้ส่งมาที่ container ของ phpmyadmin
จากนั้น เมื่อมีการติดต่อ mysql เนื่องจากอยู่คนละ container กัน จึงต้องมีการกำหนด -e PMA_HOST เพื่อให้ phpmyadmin รู้ที่อยู่ mysql container ด้วย
ขอจบไว้เท่านี้ก่อนนะครับ ไว้มาเขียนต่อ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น