Docker & Gitlab Repository ง๊ายง่าย เหมาะสำหรับผู้เริ่มต้น

Jedwiwat Santandecha
InsightEra
Published in
5 min readDec 30, 2019
Docker & Gitlab Registry

ผมเชื่อว่าทุกวันนี้เราเคยได้ยินมาแล้วบ้างว่า Docker คืออะไรและใช้ทำอะไร และเราจะใช้ร่วมกับ Gitlab Registry ได้อย่างไร เอาหล่ะ เดี๋ยวเรามาทำความรู้จัก เจ้า Docker กันก่อนดีกว่า และ สำหรับใครที่ยังไม่ได้ติดตั้ง Docker อ่านข้อมูลตามลิงค์ด้านล่างได้เลยครับ

วิธีการติดตั้ง Docker CE บน Ubuntu 18.04

สิ่งที่ต้องรู้ก่อนใช้ Docker

Docker structure

จากรูปจะเห็นว่า การที่เราจะใช้ Docker ได้นั้น เราจำเป็นต้องรู้ เรื่อง Software Container มาก่อน เนื่องจากว่า Docker จะใช้ Docker Container (Software Container)เพื่อสร้าง Service ที่เราต้องการ

Software Container คืออะไร

Software Container คือ concept การสร้างสภาพแวดล้อมเสมือน (Virtual environment) ที่ทำให้ซอฟต์แวร์ต่างๆ สามารถทำงานได้ด้วย Environment ที่แตกต่างกันตามที่ซอฟต์แวร์แต่ละตัวต้องการได้ และเป็นอิสระจากเครื่อง Host (เครื่องที่ติดตั้ง Docker Engine) ซึ่งจะแตกต่างกับการทำงานของซอฟต์แวร์สมัยก่อน ที่ทุกตัวจะใช้ Environment เดียวกันซึ่งเป็น Environment ของเครื่อง Host ซึ่งถ้ามีใครไปลบ library หรือ Software บางตัวออกจากเครื่อง Host อาจจะทำให้ Software ตัวอื่นๆ ทำงานไม่ได้เลย การใช้ Software Container ทำให้เรามั่นใจได้ว่า จะไม่มีใครมาเปลี่ยนแปลง Environment ของ Software เราและเราสามารถนำ Container ไปรันบน server อื่นๆ ได้ โดยที่ซอฟต์แวร์ยังทำงานได้เหมือนเดิม

Software Container ถูกสร้างขึ้นมาเพื่อแก้ปัญหาของ Virtual Machine โดยที่แชร์ Hardware เดียวกัน ให้เหลือเพียงแค่การสร้าง Environment เสมือนขึ้นมา และแชร์เฉพาะ Kernel กัน (Kernel คือส่วนที่เป็น Core ของ OS ประกอบด้วยชุดคำสั่งพื้นฐานต่างๆ ที่ใช้ควบคุม Hardware) เพื่อลดความซ้ำซ้อนของการใช้ทรัพยากรลง ซึ่ง Docker ก็คือ Software ที่เข้ามาช่วยจัดการแต่ละ Container ให้ทำงานได้และป้องกันไม่ให้ Container แอบเข้าถึงข้อมูลของ Container ตัวอื่นๆ

Docker คืออะไร

VMs vs Docker

Docker เป็น Engine ที่ทำการจำลองสภาพแวดล้อมขึ้นมาบน OS เพื่อที่จะรัน Docker Container ซึ่ง container ก็จะทำการจำลองสภาพแวดล้อมที่จะใช้ในการรัน Service อีกทีนึง จากรูปด้านบนจะเห็นว่า Docker จะทำการตัดในส่วนของ Guest OS ออกไป จึงทำมีขนาดที่เบากว่า และกินทรัพยากรน้อยกว่า Virtual Machine นั่นเอง แล้ว Docker มีดียังไงอะ ไปดูต่อดีกว่า

Docker ดียังไง

ใช้ memory น้อย (Low Memory Usage) — เนื่องจากว่า Docker Engine ไม่จำเป็นต้องสร้างทั้ง Guest OS เหมือน Virtual Machine แต่สร้างแค่ส่วนที่เป็น Environment จึงทำให้ใช้ memory น้อยกว่ามาก

พกพาสะดวก (Portability)— Docker ดีตรงที่ว่าเราสามารถที่จะ deploy บน Operating System (OS) อะไรก็ได้ เช่น MacOS, Windows, Linux ซึ่งทำให้เราไม่ต้องมากังวลว่า ถ้านำ Docker Image ของเราไป deploy บนเครื่องอื่นแล้วจะใช้ไม่ได้ ถ้าเราสามารถรัน Docker Image ในเครื่องเราได้ เอาไปลงเครื่องอื่นๆ ก็จะรันได้เหมือนกัน แถมมาด้วยขนาดที่เล็กกว่า Virtual Machine Image มากๆ เลยทำให้สามารถเคลื่อนย้ายไปมาได้สะดวกกว่านั่นเอง

ได้ประสิทธิภาพสูง (High Performance) — เนื่องจาก Docker ลดการใช้ทรัพยากรไปเยอะมากเมื่อเทียบกับ Virtual Machine แถมยังสามารถแชร์ทรัพยากรของแต่ละ Container ด้วยกันได้ ซึ่งทำให้สามารถจัดการกับทรัพยากรได้ดีกว่า จึงทำให้การเปิดใช้งาน Container มีความรวดเร็วกว่า

ดีไหมหละ!! ต่อไปเราก็มาทำความรู้จักกับ Docker Image กันต่อเลย

Docker Image คืออะไร

หากเรามี Project ที่เราทำไว้เสร็จแล้ว และ ต้องการที่จะนำไปรัน หรือ deploy ในเครื่องอื่น เราต้องทำการแพ็ค ให้มันอยู่ในรูปแบบของไฟล์ก้อนนึงเสียก่อน ซึ่งนั่นก็คือการทำ Docker Image นั่นเอง เอ๊ะ! แล้วเราจะทำ Docker Image ยังไงหละ

วิธีการสร้าง Docker Image

เดี๋ยวเราจะมาทดลองสร้าง Docker Image ที่ใช้รัน website ด้วย Image ของ nginx กัน

เรามาดูวิธีการสร้าง Docker Image กันดีกว่า ตัวอย่างด้านล่างจะเป็นการนำเว็บไซต์มาสร้างเป็น Docker Image หละนะ ซึ่งมันก็จะมีขั้นตอนในการทำดังนี้

  1. เริ่มต้นด้วยการวาง Folder และ ไฟล์ ต่างๆ ตามด้านล่างเลย
my-project
- Dockerfile
- dist
-- index.html

2. สร้าง Dockerfile ขึ้นมาก่อน ว่าแต่ Dockerfile มันคืออะไรกันนะ

Dockerfile คือตัวที่บอกเราว่า ในการสร้างเจ้า Docker Image มีขั้นตอนอะไรในการสร้างบ้าง เพื่อความเข้าใจมากยิ่งขึ้น เราลองไปดูตัวอย่างกันดีกว่า

#DockerfileFROM nginx
COPY dist /usr/share/nginx/html

จากตัวอย่าง Code ด้านบน จะเห็นว่า เรามีขั้นตอนในการ Build เจ้า Docker Image อยู่ 2 ขั้นตอน ด้วยกัน

1. FROM nginx ในส่วนนี้คือการดึง Docker Image ที่มีชื่อว่า nginx มาใช้ในการสร้าง Docker Image ของเราอีกทีนึง

2. ทำการ copy ข้อมูลในโฟลเดอร์ dist ไปวางไว้ที่ /usr/share/nginx/html ใน nginx นั่นเอง

หลังจากจบขั้นตอนนี้แล้ว ให้เราทำการ build Docker Image โดยใช้คำสั่งด้านล่าง

docker build -t [docker image name] .# ตัวอย่าง
# docker build -t my-project .

อธิบายคำสั่งนิดนึงครับ

จากด้านบนจะเห็นว่าเราทำการ build Docker Image ซึ่งสิ่งที่เกี่ยวข้องกันคือ Dockerfile ที่นำมาใช้ในกระบวนการ build นั่นเองการทำงานของคำสั่ง docker build -t my-project . ก็คือ Docker Engine จะทำการอ่านไฟล์ Dockerfile ที่อยู่ตาม path ที่เราสร้าง Dockerfile ไว้เท่านั้น เช่น ถ้าเราสร้างไฟล์ Dockerfile ไว้ใน /home/my-project/ เราก็ควรจะเข้าไปยัง path ที่มี Dockerfile เท่านั้น แล้วค่อยพิมพ์คำสั่ง docker build -t my-project . เพื่อทำการ build image

** ย้ำว่า อย่าลืม — จุด — ข้างหลังสุดนะครับ

หลังจากที่เรา build Docker Image เสร็จแล้ว ให้เราพิมพ์คำสั่ง เพื่อดูว่าในเครื่องเราตอนนี้มี image อะไรบ้าง

docker images

เราก็จะเห็น Docker Image ของเราแล้ว เย้

ขั้นตอนถัดไปเป็นสิ่งที่สำคัญที่สุดนั่นก็คือ การรัน Docker Image ของเรา ตรงจุดนี้เราต้องทำการรัน Docker Image แล้วเช็คว่ามันสามารถทำงานได้ถูกต้องหรือไม่ โดยใช้คำสั่ง

docker run  --name my-website -p 8080:80 my-project

อธิบายคำสั่งนิดนึงครับ

docker run  --name [container-name] -p [host-port]:[container-port] [image-name]
--name เป็นการตั้งชื่อของ container ที่เราจะรัน-p เป็นการกำหนด port ให้ host และ container port โดยทั่วไป nginx image จะมี container port เป็น 80 และเรากำลังจะให้ทำ เครื่อง server ของเราสามารถที่จะเข้าถึง port 80 ของ nginx ได้ เราจึงต้องทำการเชื่อม port ของ container กับ host port เข้าด้วยกัน ซึ่งจากตัวอย่างด้านบน เราทำการเชื่อม port 8080 เข้ากับ port 80 ของ nginx จากนั้นเราจะก็สามารถเข้าเว็บผ่าน port 8080 ได้** host port จะต้องไม่ซ้ำกันในเครื่อง server นั้นๆ

หลังจากที่รันคำสั่งด้านบนเสร็จแล้ว ให้เช็คอีกครั้งว่าเรามี container รันอยู่แล้วหรือยังโดยใช้คำสั่ง

docker ps

ถ้าเห็นว่ามี container ที่เรารันไปเมื่อกี้ชื่อว่า my-website แล้วละก็ แสดงว่า project เราสามารถใช้งานได้แล้ว

ซึ่งในตัวอย่างด้านบน เราทำการรันเว็บไซต์ ไว้ 1 ตัว ดังนั้นให้เราลองเข้าเว็บไซต์ localhost:8080/index.html ถ้าเห็นหน้าเว็บของเราก็แสดงว่า สำเร็จแล้ววว ยินดีด้วย คุณสามารถสร้าง Docker Image และ deploy ได้แล้ว แต่ๆ ในตอนนี้เราสามารถ deploy ได้แค่ในเครื่องเราเท่านั้นนะ ถ้าเราอยากให้ Docker Image ของเรา สามารถนำไปรันบนเครื่องอื่นได้ หรือ แชร์ให้เพื่อนเราได้หละ เราจะทำยังไง !! เราก็ต้องใช้ Docker Registry ยังไงหละ

Docker Registry คืออะไร

มันก็คือ ที่เก็บเจ้า Docker Image นั่นเอง ซึ่งโดยปกติแล้ว จะมีเว็บที่ชื่อว่า DockerHub เว็บตัวนี้จะเป็นที่เก็บ Docker Image Official ที่เราจำเป็นต้องใช้ ตัวอย่างเช่น nginx, nodejs, mongodb และอื่นๆ อีกมากมาย เลือกใช้ตามสะดวกได้เลย ยังไม่หมดแค่นั้น ถ้าเราต้องการจะแชร์ Docker Image เราให้คนอื่นใช้ เราสามารถที่จะใช้บริการผ่าน DockerHub ได้เลย สะดวกมากๆ แต่ DockerHub จำกัดจำนวน private image เพราะฉะนั้นถ้าใครอยากแชร์ Image ไว้ใช้เอง หรือแชร์กันภายในทีมจำนวนหลายๆ Image แนะนำให้ไปใช้ Gitlab repository แทนครับ ซึ่งก็สามารถที่จะเก็บ Docker Image (ใน Gitlab Registry จะเรียกว่า Container Registry) พร้อมกับเก็บ Source Code ของเราไปในตัวได้ด้วย อ่านมาถึงตรงนี้แล้วก็ขอสรุปสั้นๆ สักหน่อยละกัน

Docker Registry คือ ที่เก็บ Docker Image นั่นเอง เอาหละเราลองไปสร้าง Docker Image กัน

จากที่เคยกล่าวมาแล้วด้านบนว่า เราสามารถแชร์ Docker Image ให้คนอื่นใช้ได้ซึ่งทั้งนี้ทั้งนั้น จะเลือกใช้บริการเจ้าไหน ก็แล้วแต่ผู้อ่านสะดวกเลยนะ DockerHub ก็ได้ แต่จะมีการจำกัดจำนวน Private Image ดังนั้น ในบทความนี้เราจะใช้ตัว Gitlab Registry ในการเก็บ Docker Image ของเรา โดยก่อนที่จะใช้ Gitlab Registry มาทำความรู้จัก Gitlab สักนิดนึงก่อน

Gitlab คืออะไร

Gitlab เป็น DevOps Platform ที่ช่วยในการจัดการ source code และ deploy application ซึ่งใน Gitlab ก็จะมีของเล่นมากมาย เช่น Gitlab Repository, Gitlab Registry, Gitlab CI/CD, Gitlab Runners

อธิบายแบบสั้นๆ

  • Gitlab Repository — เก็บ source code
  • Gitlab Registry — เก็บ Docker Image
  • Gitlab CI/CD — กระบวนการที่ช่วยในการ build & deploy
  • Gitlab Runners — ตัวช่วย build project

และในที่นี้ เราจะพูดถึงอยู่2 ตัว คือ Gitlab Repository และ Gitlab Registry

เก็บ Docker Image บน Gitlab Registry

  1. ให้เราสมัครใช้บริการของ Gitlab ก่อนนะครับ และที่สำคัญ ฟรี!!
  2. สร้าง project ของเราขึ้นมา 1 project ตั้งชื่อ my-project จริงๆ จะตั้งว่าอะไรก็ได้เนอะ ตามสะดวกเลยครับ
  3. เข้าไปใน project ที่เราสร้างได้เลย
  4. หลังจากเข้ามาแล้ว หากเราต้องการเก็บ Source Code ไว้บน Gitlab (Gitlab Repository) ก็ทำตาม คำสั่งของ Gitlab ที่ขึ้นอยู่ได้เลย ถ้าใครไม่ต้องการเก็บก็ไปต่อเลยจ้า
  5. หลังจากนั้นให้ไปดูในส่วนของ Packages ตรงเมนูด้านซ้าย และ เลือก Container Registry ซึ่งก็คือที่เก็บไฟล์ Image ของเรานั่นเอง
  6. พอมาถึงขั้นตอนนี้แล้ว ใน Gitlab ก็จะมีคำสั่งให้เราทำ เพื่อที่จะอัพโหลด Docker Image ของเราขึ้นมาเก็บไว้ที่ Gitlab

ขั้นตอนการ push Docker Image ขึ้นบน Gitlab Registry

  • ให้เราเปิด terminal หรือ command line จากนั้นรันคำสั่ง ด้านล่าง เพื่อทำการ Login เข้าสู่ Gitlab
docker login registry.gitlab.com
  • จากนั้น ให้เราเข้าไปที่ Folder “my-project” จากขั้นตอนการสร้าง Docker Image ด้านบน ซึ่งในขั้นตอนนี้เราจะเปลี่ยนชื่อ Docker Image ของเราจาก my-project ไปเป็น registry.gitlab.com/[your-username]/my-project ตามด้านล่าง
# แบบเก่าที่ build ในเครื่อง
#docker build -t my-project .
# เปลี่ยนเป็นแบบใหม่
docker build -t registry.gitlab.com/[your-username]/my-project .
  • หลังจากนั้นก็ทำการ push Docker Image ของเราขึ้น Gitlab ได้เลย โดยใช้คำสั่ง
docker push registry.gitlab.com/[your-username]/my-project
  • หลังจากเสร็จเรียบร้อยแล้ว เราก็จะเห็น Docker Image ของเราขึ้นมาอยู่บน Gitlab แล้ว และ เราสามารถ copy ลิงค์ไปใช้ได้ทันที ซึ่งการใช้งาน Docker Image จะสามารถใช้งานได้แค่ Gitlab User ของเราเท่านั้นนะ (ในกรณีที่ project ของเราเป็น private ) ซึ่งวิธีการโหลด Docker Image ไปใช้ ทำได้โดยใช้คำสั่ง
docker pull registry.gitlab.com/[your-username]/my-project

แค่นี้เราก็มีที่เก็บ Source Code และ ที่เก็บ Docker Image ของเราแล้ว

  • และหากเราต้องการที่จะรัน Docker Image ของเราเราก็สามารถที่จะใช้คำสั่งด้านล่างได้เลย
docker run --name my-website -p 8080:80 registry.gitlab.com/[your-username]/my-project

สรุป command ต่างๆ ที่ใช้ในบทความนี้

Docker Command

  • docker login registry.gitlab.com — ล็อกอินเข้าสู่ Gitlab Registry
  • docker build -t [project-name] . — สร้าง Docker Image
  • docker pull registry.gitlab.com/[your-username]/my-project — ดึง Docker Image
  • docker push registry.gitlab.com/[your-username]/my-project — อัพโหลด Docker Image ไปยัง Gitlab Registry
  • docker images — ดู Docker Image ที่อยู่ในเครื่อง
  • docker ps — ดู container ที่รันอยู่ในเครื่อง

ขอบคุณที่อ่านมาถึงตรงนี้ครับ หวังว่าทุกคนคงจะได้ประโยชน์ไม่มากก็น้อยนะครับ หากผิดพลาดประการใดก็ขออภัยไว้ ณ ที่นี้ด้วยครับ

ขอบคุณครับ…

References

  1. https://www.hostpacific.com/using-docker-on-centos7/

--

--