feature-docker-101
feature-docker-101

ทําไมทํา automate test ถึงต้องมาสนใจเรื่องของ Docker ด้วยล่ะ? ทั้งๆที่มันให้ความรู้สึกจะเป็น Infrastructure ซะมากกว่า 🙂

นั้นก็เพราะการจะทําให้ครบลูปจริงๆของ automate จริงๆ มันไม่ใช่แค่นั่งทํา automate บนเครื่องของเราเองน่ะสิ ครบลูปจริงๆคือการทํา Continuous Integration และ Continuous Deployment ด้วยยยนั้นเอง เพราะฉะนั้นสิ่งเหล่านี้คือสิ่งที่ต้องเข้าใจ ถึงแม้จะไม่ได้ใช้ในชีวิตทํางานเท่าไร

  • Jenkins (ไม่ใช่แค่ Jenkins แบบไปนั่งคลิ๊กเลือกผ่าน UI น่ะ ต้องเป็น Jekins Pipeline-As-A-Code 1,2)
  • Docker
  • Puppet
  • Cloud

แล้วเจ้า Docker คือ? มันคือ

Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.

ยาวไป? แปลยากไป? เอาจริงๆมันก็แค่ การสร้างกล่องใบนึงขึ้นมาเพื่อไว้ใส่ software ที่เราต้องการจะใช้ไว้ แล้วเอาไปใช้ที่ไหนก็ได้ โดยไม่ต้องกลัวว่ามันจะทํางานไม่เหมือนกัน เพราะกล่องใบนี้จะเหมือนเดิมตลอดเวลา เท่าที่เราใส่ข้อมูลไว้

นั้นหมายความว่า docker จะมาแก้ไขปัญหาเรื่อง env. ของเราออกไปเลย โดยจะไม่มีปัญหาเรื่องการ setup env. บน env. ที่แตกต่างกันอีกต่อไปละ ไม่ว่าจะ os ไหน เช่น เราทํา image ของ chromium เอาไว้ แล้วให้ Jenkins รันผ่าน docker เอา หรือเราจะสร้าง docker compose ที่เป็นตัวควบคุม services ของ docker ทั้งหมด แล้วให้ Jenkins มาใช้ services นั้นก็ได้ (docker-compose จะพูดภายหลังต่อ)

พวกนี้จะทําให้ไม่มีคําว่า “it works on my machine” อีกต่อไปละ 🙂

รู้จัก docker คร่าวๆไปละ แล้ววันนี้จะเรียนรู้อะไรบ้าง?

  1. Overview docker architecture
  2. How to build own image
  3. What is docker compose

Overview Docker Architecture

มาดูกันดีกว่าเบื้องหลัง Docker ทําอะไรบ้าง

docker-vs-vm
docker-vs-vm

เหตุผลหลักๆเลยที่ docker เป็นที่นิยมมากๆ เพราะเรื่องของ speed เมื่อเทียบกับ VM เนี่ยแหละ ถ้าลองสังเกตุภาพข้างบนจะเห็นว่า ส่วนที่แตกต่างระหว่ง docker กับ VM คือ docker ไม่มี Guest OS (นึกถึงสมัยก่อนน่ะ ที่เราจะใช้ VM ทีไร เราต้องไปหา Ubuntu image มา แล้วโหลด Virtual Box มาคู่กันเพื่อที่จะสร้าง Ubuntu on Window อะไรแบบนั้น) และ ข้อดีออีกอย่างมัน แชร์ CPU กับ RAM ของ Host OS เลย เพราะฉะนั้นไม่ต้องไปกันที่เหมือน VM ที่ต้อง generate ขึ้นมาทั้งก้อนนั้นเอง

ทีนี้ถ้าเราจะใช้ Docker เราต้องทํายังไง?

ตอนนี้ Docker ได้รื้อโครงสร้างเดิมออกหมดละ แต่ก่อนคนจะใช้ Docker เช่น Window 7 จะมี tool ตัวนึงชื่อ Docker Toolbox รวบรวม tools ที่จะใช้ในการจัดการกับ Docker ไว้ให้ เช่น

  • Docker Engine
  • Compose
  • Machine (ไว้จัดการกับ docker a.k.a docker engine และ manage มันด้วย docker-machine command)
  • Kitematic (GUI สําหรับจัดการ container ต่างๆ)
docker-toolbox
docker-toolbox

แต่ปัจจุบันเป็น Legacy ไปแล้วน่ะครัช!!! ตอนนี้เค้าให้โหลดจากที่นี้แทน มันกลายเป็น native Windows application ไปแล้วล่ะ

new-version-docker-community
new-version-docker-community

ทดลองใช้ docker ครั้งแรกกัน

ถ้าเรายังใช้ window 7 อยู่น่ะ ไปเปิดตัว “Docker Quickstart Terminal” มันจะสร้าง MINGW64 ขึ้นมาเป็น shell command ให้

docker-shell-interact
docker-shell-interact

หลังจากนั้นมาลองเล่นกับ Hello World กัน ด้วยนี้เลย

docker-run-hello-world
docker-run-hello-world

ซึ่งเจ้า Hello-World Docker ตัวนี้ดีมากเลย เพราะมันบอกด้วยว่าทําไร แบบมือใหม่เลย

  • docker client วิ่งไปหา docker daemon แบบรูปข้างบนเลยๆ
  • docker daemon ไป pull “hello-world” image มาจาก docker hub (registry)
  • docker daemon created container จาก image hello world โดยที่มันจะทํางานและส่ง output กลับมา
  • docker daemon เอา output ส่งไปให้ docker client และกลับมาที่ terminal เรา 🙂

ง่ายมั้ย? นี่แหละ docker มันทํางานแค่นี้เลยล่ะ #วิ่งวนไป โดยข้อมูล image จาก docker hub เราก็สร้างเก็บไว้เองได้ เพื่อไว้ใช้ในการจัดการเฉพาะงานของเราได้ ถ้ายังสงสัยลองอ่านขั้นตอนที่มีและขึ้นไปดูรูปอีกทีจะเข้าใจว่ามันทํางานยังไง

How to build own image

เห็นภาพรวมของ Docker ไปละ ทีนี้ถ้าเราจะสร้าง image ขึ้นมาใช้เองเพื่อให้เหมาะกับงานที่เราทําอยู่ ให้เวลา docker daemon หาใน hub เจอเราต้องเตรียมอะไรบ้าง? (เราสามารถทําเป็น private repository ได้ด้วย)

โดยอย่างแรกเลย ตัวสําคัญตัวเดียวของเราก็คือ DockerFile นี้เอง

DockerFile

เป็นตัวที่รวบรวมคําสั่งที่ใช้ในการสร้าง docker image ไว้ เช่น เราจะให้มันสร้างบน Unix และ มี nginx กับ mysql อยู่ด้วย เราก็มาสร้างรวมไว้ใน docker file และ build ขึ้น repository ของเรานั้นเอง

โดยให้เข้าใจภาพรวมของ dockerfile ก่อนว่ามันทํางานยังไง โดยสามารถดูจากด้านล่างได้

dockerfiles-stage
dockerfiles-stage

เมื่อ dockerfile ถูก build มันจะไปทําการสร้างตามนี้เลยย

  1. docker มันจะเช็คว่าทุกอย่างที่จะใช้ในการ build พร้อมมั้ย
  2. docker ไปดูว่า image ที่เราต้องการจะ build อะมันมีใน locally มั้ย ถ้าไม่มีมันก็จะไป pull ลงมาให้ (เช่นต้องการ server nginx แต่เราไม่มีมันก็จะไป pull ให้ – FROM keywords)
  3. หลังจากนั้น docker ก็จะเอาจาก FROM keyword ลงมา แล้วก็ไปทําการ RUN ใน image นั้นๆ และทําตามคําสั่งอื่นๆต่อไป โดยมี เบสเป็น docker image นั้น
  4. แค่นั้นแหละมันก็จะมี docker image ในเครื่อง แล้วเราก็สามารถ push ขึ้นไปบน Docker Hub ได้ โดยใช้ commandline TAG และ PUSH ขึ้นไป

ตัวอย่างไฟล์จะออกมาหน้าตาแบบนี้

dockerfile-offical-example
dockerfile-offical-example

ดู Tutorial ตัวเต็มจากของ docker เองก็ได้ ส่วนถ้าอยากดู keyword ต่างๆที่ใช้ในการสร้าง DockerFile ก็มีไว้พร้อมมากก

noted: คนนี้ทําตัวอย่างของ Dockerfile ไว้เยอะมาก ลองศึกษาดูจากอันนี้ก็ได้ Github Kstaken

What is Docker Compose

หลังจากที่เรารู้ว่า docker คืออะไร? และ image คืออะไรแล้ว ทีนี้ลองนึกอนาคตไกลๆ สมมุติถ้าเราสร้าง container ขึ้นมาเป็น 10 ตัวเลย เพื่อใช้งานในการทํา automate flow ทีนี้เวลา Jenkins หรือใครมาใช้งาน flow นี้ เค้าจะจัดการกับ container ทั้ง 10ตัวยังไง จะมากดเปิด กดปิด container เองหรอ มันก็ไม่ใช่ เพราะถ้าทําอย่างนั้นมันก็ไม่ automate และไม่สะดวกสบายแน่ๆ ดังนั้นมันเลยมี

Docker Compose ขึ้นมาเป็นตัวที่ควบคุมกับ multi-container เลย ใช้เพียงแค่ compose file ในรูปแบบของ yaml ในการควบคุม โดยมีแค่ 3 steps ง่ายๆคือ

  1. สร้าง Dockerfile ขึ้นมาเพื่อไว้ใช้จัดการ container เรา
  2. ระบุ services ที่จะใช้กับ app ใน docker-compose.yml จะได้ช่วยให้มันทํางานด้วยกันได้
  3. คําสั่งง่ายๆเลยคือ “docker-compose up” แค่นี้มันก็จะรัน app ทั้ง services ทั้งหมดขึ้นมา

อย่างตัวอย่างนี้

docker-compose-example
docker-compose-example

ดู keywords ที่จะใช้ได้ที่นี้ Compose file reference

สรุปแล้ว?

Docker ยังมีอะไรให้เล่นอีกเยอะมากๆๆๆ เอาไปผูกกับ Jenkins ทํา CI อะไรได้อีกหลายอย่างมากๆ (ถ้าเป็น dev. ก็ไปสร้าง docker ไว้ทํา env. หลากหลายได้ เช่น phpทุก version ไว้เวลา dev. เลย)  แต่หลักๆแล้วก็ Docker ก็มีตัวสําคัญๆตามนี้แหละ

  • DockerFiles
  • Docker Compose

กับเข้าใจ Life Cycle มันที่เหลือก็ไปประยุกต์เอาว่าจะจัดการกับมันยังไงแค่นั้นเลย 🙂

แต่ถ้าในมุมของ Automate test เรานํามาผูกกับ Jenkins เป็นดีสุด จําลอง env. ให้เหมือนจริงที่สุดโดยแบ่งเป็น UAT,Prod ก็ว่าไปเพื่อใช้ในการเทสจะช่วยให้เราทํางานได้สะดวกขึ้นเยอะ

Noted:

  • docker rm -f $(docker ps -a -f status=running -q)
    • คําสั่งน่าสนใจสําหรับในการ remove container ที่ running อยู่ด้วยการ force ลบด้วย (โหดนิด)
    • $() เป็น Nested command เพื่อเพิ่ม condition ใน linux แบบง่ายๆ
  • docker port [container id]
  • docker ps -a
  • docker run -d -v -p

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.