มาใช้งาน Docker กันเถอะ
ก่อนอื่นเลยเรามาทำความรู้จักกับเจ้าปลาวาฬน้อย (Docker) กันก่อนเลยละกันครับ docker เป็นเครื่องมีอตัวหนึ่งที่ช่วยให้เราสามารถสร้าง server ขึ้นมาภายในเครื่องตัวเองได้
อ้าว!! แล้วมันแตกต่างจับเจ้า vm (Virtual Machine) ที่เราๆ รู้จักกันอย่างไรล่ะ
คำตอบคือ เจ้า docker ใช้ทรัพยากรน้อยกว่าครับ เพราะเจ้า docker มีการ share ทรัพยากรกันไม่จำเป็นต้อง allocate ทรัพยากรที่มีจำกัดของเราไปจมกับ vm ยิ่งถ้าต้องการจำลอง server ขึ้นมาหลายๆตัวนี่เห็นผลชัดเลยครับ
ข้อดีของเจ้า docker ที่เหนือกว่า vm อีกข้อคือเจ้านี่ใช้ os ของเครื่องเราในการทำงานเลยต่างกับ vm ที่ต้องมี Hypervisor เพื่อใช้ในการลง os อีกทีซึ่งทำให้เจ้า docker กินทรัพยากรน้อยกว่ามาก
ข้อดีมันยังไม่หมดแค่นี้เจ้า docker มีระบบ registry ซึ่งถือว่าเป็นทีเด็ดเลยครับ เพราะระบบนี้ช่วยให้คนที่ไม่ค่อยมีความรู้เกี่ยวกับ unix สามารถสร้าง server ขึ้นมาใช้เองได้อย่างง่ายๆ แค่ปลายนิ้ว!!! สิ่งที่ต้องทำก็แค่เข้าไปใน docker hub (https://hub.docker.com/) แล้วจัดการ search หาสิ่งที่ต้องการแล้วเอามาใช้ได้เลย ซึ่งผมจะอธิบายวิธีใช้งานมันอีกทีครับ
docker เหมาะกับใคร?
ถ้าถามผม ผมว่าเจ้านี่เหมาะกับ developer ที่ต้องดูแล project หลายๆ ตัวซึ่งแต่ละตัวมี environment ต่างกันซึ่งเจ้า docker นี่จะช่วยให้สามารถสร้าง environment ที่ต่างกันขึ้นมาใช้งานได้ภายในเครื่องเดียวกัน ยกตัวอย่างให้เห็นภาพหน่อยละกันครับ เช่น project a ใช้ php version 5 + apache ใช้ mysql server เป็น db ขณะที่ project b ใช้ php 7 + apache แล้วใช้ mongo db เป็น db นึกภาพก็ลำบากแล้ว แต่เจ้า docker ช่วยคุณได้ครับ อีกอย่างเจ้านี่จะทำให้คุณหมดปัญหา run บนเครื่องผมได้ แต่ไป run ที่อื่นไม่ได้ไปเลยครับ เพราะคุณแค่เอาเจ้า docker ที่คุณสร้างขึ้นมาไป run ที่เครื่องอื่นคุณก็จะได้ environment เดียวกับที่อยู่บนเครื่องราวกับเป็นเครื่องเดียวกันเลยทีเดียว ทำให้การ deploy งานง่าย ชีวิตดีขึ้นเยอะครับ
เอาละครับเกริ่มมาพอสมควรแล้วคงอยากรู้วิธีใช้งานเจ้า docker กันแล้วสินะครับมาเริ่มกันเลยแบบ step by step
เริ่มกันที่ Install เจ้า docker ลงเครื่องเราก่อนเลยครับ
- เข้า web site ของ docker https://www.docker.com/ เพื่อไป download เจ้า docker กันได้เลยครับผม
- จัดการ install มันลงเครื่องเลยครับผมขอข้ามขั้นตอนนี้ไปเลยละกัน เพราะมันง่ายมาก แค่ next ไปเรื่อยๆ ครับผม
หลังจากที่ install docker ลงเครื่องแล้วลอง เข้า terminal แล้วพิมพ์ docker -v เพื่อเช็คว่าคุณมีเจ้า docker ในเครื่องเรียบร้อยแล้วจริงๆ
Docker version 1.13.0, build 49bf474
นี่คือสิ่งที่ผมคาดหวังจะเห็นครับผม
step ถัดไปเราจะเริ่มสร้าง server ขึ้นมาครับ โดยผมจะจำลอง project basic คือ ใช้ php + apache แล้วก็ใข้ mysql เป็น db ครับ
ก่อนสร้าง server ขึ้นมาผมขออธิบายเพิ่มเติมนิดหน่อยเกี่ยวกับ docker image กับ docker container
Docker image เหมือนกับเครื่องที่ชาวบ้านเค้าทำไว้ให้แล้วเค้า register ไว้ใน docker hub เพื่อให้เราเอาไปใช้งาน ซึ่งเราเข้าไปแก้ config เอาไรของเค้าไม่ได้ครับ
Docker container คือสิ่งที่เราได้หลังจาก run เจ้า image นี่ขึ้นมาครับซึ่งเป็นเหมือนเครื่อง server ของเราเองซึ่งเราสามารถเข้าไปยำเจ้าเครื่องนี่ได้อย่างเต็มที่ครับ
ถ้าจะให้เห็นภาพยิ่งขึ้น ผมขอเปรียบเจ้า Docker image เป็นเหมือนกับ Class ส่วน docer conatainer นี้เป็น instance ที่ถูก new ขึ้นมาจาก Class (ไม่รู้ว่าช่วยให้เห็นภาพชึ้นหรือแย่ลง 555)
เอาละครับกลับมาสร้าง server กันต่อเลยดีกว่า ผมขอเแนะนำโครงสร้างที่ผมใช้ประจำละกันครับ
จะมีโครงสร้างประมาณนี้ครับ
Dockerfile จะเป็นที่ๆ เราใส่ค่า config ต่างๆของ server เช่นต้องการลง os ตัวไหน apache version ไหน php version อะไร
docker-compose.yaml เป็นตัวที่ทำให้เราสามารถ manage หลายๆ container ได้ในเวลาเดียวกัน เราสามรถทำให้แต่ละ container เห็นกันผ่าน file นี้
อธิบาย โครงสร้างคร่าวๆ นะครัับ ผมจะทำการ config mysql server ลงใน Dockerfile ที่อยู่ใน floder mysql
และผลจะทำาร config ในส่วนของ apache+php ลงใน Dockerfile ที่อยู่ใน floder web ครับผม
มาเริ่มกันที่ mysql server กันก่อนเลยครับ สำหรับคนที่ไม่ค่อยรู้เกี่ยวกับ unix อย่างที่ผมได้บอกไปตอนแรกคุณไม่ต้องตกใจว่าจะลงยังไง แค่เข้า docker hub search ว่า mysql server เลือกตัวที่คุณคิดว่าใช่ (สังเกตุจากดาวตัวไหนได้ดาวเยอะน่าจะดี) แล้วเอามาใช้ได้เลยครับในที่นี้ ผมขอเลือก mysql/mysql-server มาใช้นะครับ ที่ต้องทำก็แค่เปิด file Dockerfile
แล้วพิมพ์
FROM mysql/mysql-server:5.5
COPY [“db_data/test.sql”, “/test.sql”]
COPY [“start_script.sh”, “/start_script.sh”]
EXPOSE 3306
FROM เป็นการบอกว่าเราจะใช่ image ของตัวไหน
EXPOSE เป็นการบอกให้เจ้า container ของเรา listen port นั้นๆ
COPY เป็นการ copy file เข้าไปไว้ใน container ที่จะสร้างขึ้นมาในที่นี้ผม copy 2 file นี้เพื่อใช้ในการ import data เข้า db ครับ
สร้าง data ที่จะ import เข้า db ใน test.sql
— phpMyAdmin SQL Dump
— version 4.6.0
—
SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
SET time_zone = “+00:00”;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
—
— Database: `test`
—
— — — — — — — — — — — — — — — — — — — — — — — — — — — — —
—
— Table structure for table `user`
—
CREATE TABLE `user` (
`id` int(10) UNSIGNED NOT NULL,
`firstname` varchar(100) NOT NULL,
`lastname` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
—
— Dumping data for table `user`
—
INSERT INTO `user` (`id`, `firstname`, `lastname`) VALUES
(1, ‘Egg’, ‘Digital’);
—
— Indexes for table `user`
—
ALTER TABLE `user`
ADD PRIMARY KEY (`id`);
—
— AUTO_INCREMENT for table `user`
—
ALTER TABLE `user`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
สร้าง script เพื่อใช้ create db แล้วก็ import data ใน start_script.sh ครับ
#!/bin/sh
# MySQL start script
sleep 10;
mysql — host=localhost — port=3306 — user=root — password=[your password] -e “CREATE DATABASE test”
mysql — host=localhost — port=3306 — user=root — password=[your password] test < /test.sql
mysql — host=localhost — port=3306 — user=root — password=password -e “update mysql.user set Host = ‘%’”
mysql — host=localhost — port=3306 — user=root — password=password -e “FLUSH PRIVILEGES”
Ref: https://docs.docker.com/engine/reference/builder/
จากนั้นไปจัดการ mange container ของเราใน docker-compose.yaml
จัดการเปิด file docker-compose.yaml ขึ้นมาครับ
Add ก้อนนี้ลงไป
Ref: https://docs.docker.com/compose/compose-file/
เรียบร้อยครับรอ run ได้เลย
ทีนี้หันมาจัดการเจ้า apache+php ใน floder web บ้าง เปิด Dockerfile (ใต้ floder web) ขึ้นมาเลยครับ
Add ก้อนนี้ลงไป
FROM eboraas/apache-php
จัดการเปิด file docker-compose.yaml ขึ้นมาอีกทีครับ
Add ก้อนนี้ลงไป
Note: links เป็นการทำให้ container ของเราเห็นกันครับสามารถเช็คได้หลังจาก start container ขึ้นมาแล้วเข้าไปในเครื่องพิมพ์ cat /etc/hosts จะเห็นว่ามัน map host ไว้ให้ครับ
ใกล้จะเสร็จแล้วครับ เหลืออีกนิดเดียว เปิด file vhost.cpnf แล้ว add ก้อนนี้ลงไปครับ
file นี้จะใช้ในการ config ให้ apache รู้ว่าถ้าเรียกมาด้วยชื่อนี้ port นี้ให้ไปทำงานที่ไหน รายละเอียดขอไม่อธิบายในที่นี้นะครับน่าจะยาวลองหาข้อมูลเพิ่มเติมใน https://httpd.apache.org/docs/2.4/vhosts/examples.html ดูนะครับ
ทีนี้มาสร้าง file start_server.sh กันก่อนเพื่อทำให้สะดวกในการ run ไม่ต้องมา stop start ด้วน comand line ยาวๆ ครับ
เป็น file ขึ้นมาครับ add ก้อนนี้ลงไป
#!/bin/sh
#remove old container
docker rm -f web_server
docker rm -f mysql_server
docker-compose rm
#create container
docker-compose build mysql_server
docker-compose up -d mysql_server
docker-compose build web_server
docker-compose up -d web_server
sleep 5
# run script in mysql server for create and import data to db
docker exec -it mysql_server sh /start_script.sh
เอาละครับเสร็จแล้วครับ ต่อไปเหลือแค่สั่ง run start_server.sh
เข้าไปใน path ของ project ที่เราสร้างขึ้นใาแล้วก็ start มันเลยครับผม
$ cd docker_example
$ sh start_server.sh
เท่านี้คุณจะได้ server ขึ้นมา 2 เครื่องครับ เครื่องแรกเป็น web server ซึ่งคุณสามารถเขียน code ลงไปได้เลยเพราะเราทำการ map valumn ทุก file ใต้ project ไปไว้ที่ /var/www/html แล้วครับ ใน docker-compose.yml เผื่อใครนึกไม่ออกท่อนนี้เลยครับ
volumes:
- ../:/var/www/html
สุดท้ายมาสร้างหน้า html สักหน้าเพื่อ query data จาก db มาโชว์สักหน่อย
สร้าง file index.html
และ query.php ใต้ project ครับ
แล้วทดลอง run เลยครับ http://localhost:8000
คุณจะเห็น
Hello
Egg Digital
ถ้าเห็นแบบนี้แสดงว่าทุกอย่าง work แล้วครับผม
ผมแนบ code ตัวอย่างไว้ใน link นี้เลยครับผม