วันพุธที่ 23 พฤศจิกายน พ.ศ. 2559

Docker #1 (LEMP Stack)

วิธีการติดตั้ง LEMP Stack โดยใช้ Docker 


ทดลองโดยใช้ Docker Toolbox ติดตั้งเครื่องมือให้เรียบร้อย วิธีการ เริ่มจาก Setup ติดตั้ง Install Docker Toolbox และ กด Next ไปเรื่อย ๆ ก็จะได้ Docker Quick Start Terminal ซึ่งจะเป็นเครื่องมือที่ใช้ในการปรับแต่ง 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

docker run --name phpfpm --link mysql:5.7.4 -v $(pwd)/www:/usr/share/nginx/html -d php:7-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 ด้วย


ขอจบไว้เท่านี้ก่อนนะครับ ไว้มาเขียนต่อ

ไม่มีความคิดเห็น: