Ratchaphon Hinsui

System and Software Engineer | Student at Kasetsart University | Classical Piano @ABRSM

เข้าใจ Docker ฉบับ “กีกี้”

เนื่องจาก Docker เป็นเครื่องมือที่ช่วยแก้ปัญหาการจัดการสภาพแวดล้อมการพัฒนาโปรเจกต์ที่ต้องการใช้ซอฟต์แวร์หรือเวอร์ชันที่แตกต่างกัน โดยเฉพาะเมื่อมีข้อจำกัดในการใช้งานซอฟต์แวร์หลายเวอร์ชันในเครื่องเดียว ตัวอย่างเช่น:

  • ปัญหา: หากคุณมี 2 โปรเจกต์ที่ต้องใช้ Java เวอร์ชันต่างกัน (โปรเจกต์แรกใช้ Java 17 และโปรเจกต์ที่สองใช้ Java 10) การติดตั้งทั้งสองเวอร์ชันในเครื่องเดียวอาจทำให้เกิดความขัดแย้ง
  • Solution เก่า: ใช้ Virtual Machine (VM) เพื่อจำลองคอมพิวเตอร์อีกตัวหนึ่งและติดตั้ง Java เวอร์ชันที่ต้องการในแต่ละ VM

ข้อเสียของ VM

  1. กินพื้นที่และทรัพยากรสูง
    • VM ต้องติดตั้งระบบปฏิบัติการ (Guest OS) เพิ่มเติม ซึ่งทำงานควบคู่กับ Host OS (ระบบปฏิบัติการหลักของเครื่องเรา) ทำให้ใช้พื้นที่และทรัพยากรสูง เช่น RAM, CPU, และ Storage
  2. เสียเวลาในการตั้งค่า
    • การติดตั้ง Guest OS ใน VM ต้องใช้เวลา รวมถึงการตั้งค่าต่างๆ เช่น การติดตั้งซอฟต์แวร์และไลบรารีใหม่ทุกครั้ง

ข้อดีของ Docker เมื่อเทียบกับ VM

Docker แก้ปัญหาดังกล่าวได้อย่างมีประสิทธิภาพด้วยการใช้

Containerization

ซึ่งมีคุณสมบัติดังนี้:

  1. ไม่ต้องติดตั้ง Guest OS
    • Docker ใช้ Kernel ของ Host OS ร่วมกัน ทำให้ไม่ต้องจำลองระบบปฏิบัติการใหม่เหมือน VM จึงประหยัดพื้นที่และทรัพยากรมากกว่า
  2. เบาและเร็วกว่า
    • Container ของ Docker มีขนาดเล็กและเปิดใช้งานได้รวดเร็ว เพราะไม่ต้องบูตระบบปฏิบัติการใหม่
  3. จัดการหลายเวอร์ชันได้ง่าย
    • คุณสามารถสร้าง Container แยกสำหรับแต่ละโปรเจกต์ โดยใส่ Java เวอร์ชันที่ต้องการในแต่ละ Container ได้อย่างอิสระ โดยไม่กระทบกัน
  4. พกพาและใช้งานข้ามแพลตฟอร์ม
    • Container สามารถนำไปใช้งานบนเครื่องอื่นๆ ได้ทันที โดยไม่ต้องปรับแต่งเพิ่มเติม

Compare Docker and VM

Installation

วิธีการติดตั้ง Docker บน Windows และ MacBook

การติดตั้ง Docker บน Windows

  1. ตรวจสอบความต้องการของระบบ
    • Windows 10 หรือ Windows 11 (64-bit)
    • เปิดใช้งาน WSL 2 (Windows Subsystem for Linux) หรือ Hyper-V
    • RAM อย่างน้อย 4 GB
  2. ดาวน์โหลด Docker Desktop
    • ไปที่เว็บไซต์ Docker docker.com
    • ดาวน์โหลดไฟล์ Docker Desktop Installer.exe
  3. ติดตั้ง Docker Desktop
    • เปิดไฟล์ Docker Desktop Installer.exe
    • ในหน้าการตั้งค่า ให้เลือก Use WSL 2 instead of Hyper-V (ถ้าระบบรองรับ)
    • ทำตามขั้นตอนในตัวช่วยติดตั้งจนเสร็จสิ้น
  4. ตรวจสอบการติดตั้ง
    • เป็น Command Prompt หรือ Power Shell
docker --version

การติดตั้ง Docker บน MacOS

  1. ตรวจสอบความต้องการของระบบ
    • macOS เวอร์ชันล่าสุดหรือสองเวอร์ชันก่อนหน้า (Intel หรือ Apple Silicon เช่น M1, M2, M3)
    • RAM อย่างน้อย 4 GB
  2. ดาวน์โหลด Docker Desktop
    • ไปที่เว็บไซต์ Docker docker.com
    • ดาวน์โหลดไฟล์ .dmg ที่เหมาะกับสถาปัตยกรรมของ Mac (Intel หรือ Apple Silicon)
  3. ติดตั้ง Docker Desktop
    • เปิดไฟล์ .dmg แล้วลากไอคอน Docker ไปที่โฟลเดอร์ Applications
    • เปิดแอปพลิเคชัน Docker จากโฟลเดอร์ Applications
  4. ตั้งค่าและยอมรับข้อตกลงการใช้งาน
    • เมื่อเปิดครั้งแรก ระบบจะขอรหัสผ่าน macOS เพื่อปรับแต่งการตั้งค่าเครือข่ายและสิทธิ์พิเศษ
    • ยอมรับข้อตกลงการใช้งาน
  5. ตรวจสอบการติดตั้ง
  • เปิด Terminal แล้วพิมพ์:
docker --version

Overview Docker Flow

Make Container

การสร้าง App container ใน docker

การสร้างและใช้งานแอปพลิเคชันใน Docker มีขั้นตอนที่สำคัญดังนี้:

1. การเขียน Dockerfile

  • Dockerfile คือไฟล์ที่ใช้กำหนดค่าหรือ setting สำหรับการสร้าง Docker Image ซึ่งระบุว่า Container ที่เราต้องการใช้งานจะมีอะไรบ้าง เช่น:
    • ระบบปฏิบัติการพื้นฐาน (Base Image)
    • ซอฟต์แวร์หรือไลบรารีที่ต้องติดตั้ง
    • การตั้งค่าต่างๆ เช่น Port, Environment Variables
  • ตัวอย่าง Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

2. การ Build Docker Image

หลังจากเขียน Dockerfile เสร็จแล้ว ให้ใช้คำสั่งเพื่อสร้าง Image:

docker build -t my-app .

3. การเริ่มใช้งาน Docker Image เพื่อใช้งาน container

  • หลังจากได้ Image เเล้วเราจะสร้าง container เพื่อ ใช้งาน
docker run -d --name my-container -p 5000:5000 my-app

Basic command

docker run -it ubuntu /bin/bash
  • it = iteractive terminal

/bin/bash บอกให้ run เสร็จแล้ว ให้ terminal access เข้าไปใน docker container ผ่าน shell

docker run -it -d --rm --name linux1 ubuntu /bin/bash
  • -rm คือเมื่อ ปิด container แล้ว จะลบ container ออกจาก docker ให้เอง
  • -name คือการตั้งชื่อให้กับ container
docker run --rm -v ${PWD}:/myvol ubuntu /bin/bash -c "ls -lha > /myvol/myfile.txt"
  • v : volume mounting from host to container (เป็นการเชื่อมต่อ ข้อมูล จาก host ไปยัง container)
  • c : comman เป็นการส่ง command เข้าไป ใน container
docker run --rm -v ${PWD}:/myvol  -w /my vol ubuntu /bin/bash

-w : working directory คือ การเปลี่ยน directory ที่เราจะทำงานใน container

docker run -p 8080:80 -d nginx

-p: port mapping คือการเชื่อมต่อ port ของ host ไปยัง port ของ container

docker system prune

เป็นการลบ container ที่ไม่ได้ใช้งานออกจาก docker

docker ps

เป็นการ list container เฉพาะที่ใช้งานได้ และกำลัง run อยู่ทั้งหมดออกมา

docker ps -a

เป็นการ list container ทั้งหมด รวมทั้งที่ใช้ไม่ได้และใช้ได้ ออกมา

เมื่อเราสร้าง container ขึ้นมาแล้ว เวลาเราจะใช้งาน จะมี process ดังนี้

docker start <container-id> or <container-name>

เป็นการ start container ที่เราต้องการ โดยระบุเป็น id หรือ ชื่อของ container

docker stop <container-id> or <container-name>

เป็นการ stop container ที่เราต้องการ โดยระบุเป็น id หรือ ชื่อของ container

docker attach <container-id> or <container-name>

เป็นการ attach เข้าไปใน container ที่เราต้องการ โดยระบุเป็น id หรือ ชื่อของ container

docker restart <container-id> or <container-name>

เป็นการ restart container ที่เราต้องการ โดยระบุเป็น id หรือ ชื่อของ container

docker log <container-id> or <container-name>

เป็นการ log สิ่งที่เกิดขึ้นใน container ที่เราต้องการ โดยระบุเป็น id หรือ ชื่อของ container

Write Docker File

Dockerfile คือไฟล์ข้อความที่ใช้กำหนดขั้นตอนการสร้าง Docker Image โดยระบุสิ่งที่ต้องการให้ Docker ติดตั้งและตั้งค่าใน Container ซึ่งเป็นขั้นตอนสำคัญสำหรับการพัฒนาและรันแอปพลิเคชันใน Docker

องค์ประกอบสำคัญของ Dockerfile

  1. Base Image (FROM)
    • ระบุ Base Image ที่ต้องการใช้ เช่น ระบบปฏิบัติการหรือซอฟต์แวร์พื้นฐาน
    • ตัวอย่าง: FROM python:3.9-slim
  1. คำสั่ง RUN
    • ใช้รันคำสั่งต่างๆ ในระหว่างการสร้าง Image เช่น การติดตั้งไลบรารีหรือแพ็กเกจ
    • ตัวอย่าง: RUN pip install django
  2. การคัดลอกไฟล์ (COPY/ADD)
    • คำสั่ง COPY ใช้คัดลอกไฟล์จากเครื่องเราไปยัง Container
    • ตัวอย่าง: COPY . /app
  3. Working Directory (WORKDIR)
    • กำหนดโฟลเดอร์ทำงานใน Container
    • ตัวอย่าง: WORKDIR /app
  4. Environment Variables (ENV)
    • ใช้กำหนดตัวแปรที่ส่งค่าเข้าไปใน Container เพื่อใช้ในการตั้งค่าหรือรันแอปพลิเคชัน
    • ตัวอย่าง: ENV APP_ENV=production
  5. Port (EXPOSE)
    • ระบุ Port ที่ Container จะใช้เพื่อสื่อสารกับ Host หรือ Container อื่นๆ
    • ตัวอย่าง: EXPOSE 8080
  6. Start Command (CMD/ENTRYPOINT)
    • CMD ใช้กำหนดคำสั่งเริ่มต้นเมื่อ Container ถูกสร้างขึ้น เช่น รันเซิร์ฟเวอร์หรือแอปพลิเคชัน
    • ENTRYPOINT คล้าย CMD แต่มีความสำคัญสูงกว่า สามารถใช้ร่วมกับ CMD ได้เพื่อกำหนดค่าเริ่มต้นและพารามิเตอร์เพิ่มเติม

Example Dockerfile

FROM php:8.1.5-cli

EXPOSE 8000
RUN mkdir /myproject
COPY index.php /myproject
WORKDIR /myproject
CMD php index.php

FROM : คือการบอกว่า จะใช้ image อะไรในการ build

EXPOSE : คือการบอกว่า จะใช้ port อะไรในการ run

RUN : คือการรันคำสั่งใน container

COPY: คือการ copy file จาก host ไปยัง container

WORKDIR: คือการเปลี่ยน directory ที่เราจะทำงานใน container

CMD: คือการรันคำสั่งใน container ตอนที่เรา run container

การสร้าง image จาก dockerfile

docker build -t myapp .
  • t : คือการตั้งชื่อ image ที่เราจะสร้าง

. : คือ path ของ dockerfile

docker images

เป็นการ list image ทั้งหมดที่เรามีอยู่

เมื่อเราสร้าง images เสร็จเราสามารถนำไปเก็บไว้ใน docker hub ได้

docker push <image-name>

การ push image ไป เราต้อง push ตัว image ที่ เป็น ชื่อ repo เราไป docker push (my repo / nameimage)

เมื่อเพื่อนต้องการนำมาใช้งาน เพื่อนสามารถ pull มาใช้ได้

docker pull <image-name>

Docker Compose

เป็น tool ที่ใช้ในการ จัดการ และ สร้าง container หลายๆ ตัว ในเวลาเดียวกัน โดย จะใช้ file ชื่อ docker-compose.yml ในการ กำหนด ว่าจะใช้ container อะไรบ้าง และ จะใช้ อะไรบ้าง ในการ สร้าง container นั้นๆ

Leave a Reply

Your email address will not be published. Required fields are marked *