Coding Gun

Docker คืออะไร?

Docker คือชุดของเครื่องมือที่ช่วยให้เราทำงานกับ container ได้ง่ายขึ้นเหมือนกับ VMWare หรือ Virtual Box ที่ช่วยให้เราทำงานกับ VM ซึ่ง Docker จะประกอบไปด้วยส่วนประกอบหลักๆ ดังนี้

  1. Dockerd หรือ Docker daemon ทำหน้าที่สร้าง, ลบ, start หรือ stop container
  2. Docker cli เป็น command line ที่เราสั่ง docker build, docker run และอื่นๆอีกมากมาย โดยที่ docker cli จะส่งคำสั่งไปยัง dockerd อีกทีนึง
  3. Docker Desktop เป็น Application ที่นำไปติดตั้งลงใน Windows หรือ MacOS เพื่อจัดการกับ Virtual Machine ที่นำมาใช้ run docker ปัจจุบันบน MacOS เราจะใช้ HyperKit ส่วนบน Windows จะเป็น Windows Sub Linux(WSL)
  4. Docker Hub เป็น Container Registry ที่รวบรวม image ต่างๆในแต่ละ version(ใน docker เราจะใช้ tag ในการแยก version) เวลาเราอยากได้เครื่องมืออะไรก็เข้าไปค้นหาใน Docker Hub ได้เลย

Container คือการแบ่งแยก Environment คล้ายๆกับ Virtual Machine แต่จะเป็นการแบ่งแยก Environment ด้วย OS แต่เราสามารถสร้าง Container ในระดับ OS ได้แต่ Linux และ Windows Server เท่านั้น ส่วน Windows แบบใช้งานส่วนตัวทั่วไปและ MacOS ต้องใช้การจำลอง Linux ขึ้นมาด้วย HyperKit, HyperV และ Windows Sub Linux(WSL)

Container vs Docker

Docker เป็น Container runtime ซึ่งจะมี docker cli เป็นเครื่องมือที่ช่วยจัดการ container ทั้งการ pull image, สร้าง container, start/stop container และอื่นๆอีกมากมาย ซึ่งการทำงานกับ container นั้นสามารถเลือกได้หลายยี่ห้อ เช่น containerd(นิยมใช้กันมากบน server) และ Cri-o ดังนั้น docker ไม่เท่ากับ container

Container vs Virtual Machine(VM)

Container นั้นต่างจาก Virtual Machine(VM) ตรงที่การทำงานกับ Container นั้นจะใช้ความสามารถของ Operating System ซึ่งต่างจาก VM ที่ใช้ความสามารถของ Application ดังนั้น VM จึงต้องสร้าง Guest OS ขึ้นมา จึงทำให้ VM ทำงานช้ากว่าและกิน resource มากกว่า container ดังรูป

Container vs Virtual Machine
Virtual Machine vs Container

ข้อดีของ Docker และ Container

จริงๆแล้วในหัวข้อนี้จะเป็นข้อดีของ Container แต่เนื่องจากเราใช้งาน Container ผ่านทาง Docker ดังนั้นเราก็ให้ credit เค้าซักหน่อย

Container Image

การทำงานของ Container นั้นจะต่างจาก VM ตรงที่เราจะต้องมี Container Image ก่อนถึงจะสร้าง Container ได้ซึ่งการได้มาซึ่ง Container Image นั้นมีได้ 2 วิธีคือ

  1. เอา Image ของคนอื่นเค้ามาใช้ วิธีการนี้เราสามารถ pull image ลงมาจาก container registry ได้เลย ซึ่ง container registry ที่ได้รับตวามนิยมมากที่สุดคือ https://hub.docker.com เวลาใช้งานเราสามารถ run สั่ง docker pull เพื่อ download image ลงมาจาก docker hub

    $ docker pull helloworld
    

    และสั่ง docker run เพื่อสร้าง container

    $ docker run hello-world
    

    และจะได้ผลลัพธ์ ดังนี้

    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/
    
    For more examples and ideas, visit:
    https://docs.docker.com/get-started/
    

    ขั้นตอนการทำงานของ Docker จะมีลำดับตามนี้

    1. Docker client ติดต่อกับ Docker daemon
    2. Docker daemon ทำการ pull image ชื่อว่า “hello-world” จาก Docker Hub
    3. Docker daemon สร้าง container จาก image ที่ได้ pull ลงมา
    4. Docker daemon ทำการ stream output ไปยัง Docker client เพื่อให้เราเห็นใน terminal
  2. สร้าง Image ขึ้นมาเอง ซึ่งเราต้องสร้าง Dockerfile ขึ้นมา โดยที่เราจะระบุ Base Image แบบนี้

    FROM alpine:3.18.4
    CMD ["echo", "Hello Docker!"]
    

    หลังจากนั้นเราก็จะทำการ Build Image ขึ้นมาจาก Dockerfile ที่เราได้สร้างขึ้น ซึ่งคำสั่งนี้เราต้อง run ใน path ที่มี Dockerfile อยู่

    $ docker build -t hello .
    

    หลังจากนั้นนำ Image ที่เราได้จากคำสั่ง docker build มาสร้างเป็น container ด้วยคำสั่ง docker run

    $ docker run --rm hello
    

    ผลลัพธ์ที่ได้จากคำสั่ง docker run จะเป็นแบบนี้

    Hello Docker!
    

เครื่องมือที่ใช้ในการจัดการ Docker Container

ในการทำงานกับ container นั้นมีเครื่องมือที่เป็น Opensource ให้เลือกใช้อยู่มากมาย แต่เครื่องมือที่คุณต้องรู้จักและต้องนำไปใช้แน่ๆ คือ

  1. Docker Compose ถ้าเราต้องการให้ container มากกว่า 1 ตัวมาทำงานร่วมกันเราจะใช้ docker compose ในการสร้าง network ของ container เช่น container ที่ทำหน้าที่เป็น Web API และ container ที่ทำหน้าที่เป็น database มาทำงานร่วมกัน เราจะประกาศ services ไว้ในไฟล์ docker-compose.yml หลังจากนั้นเราสามารถ start containers ทั้ง 2 ตัวนี้่ด้วยคำสั่ง
$ docker-compose up -d

และถ้าเราต้องการให้หยุดการทำงานพร้อมกับลบ containers ทั้ง 2 ตัวนี้ออก เราจะใช้คำสั่ง

$ docker-compose down
  1. Portainer เป็นเครื่องมือที่ใช้ในการจัดการ container ผ่านทาง GUI เหมาะสำหรับผู้ใช้งานที่ไม่ค่อยถูกกับ command line และนอกจากจะใช้งานง่ายขึ้นแล้ว portainer ยังสามารถ deploy container ข้าม platform ได้อย่างง่ายดาย

ลองดูการทำงานอื่นๆของ Docker ได้ที่บทความต่อไปนี้

วิธีการดู logs ใน container
Jan 21, 24

docker

วิธีการดู logs ใน container
Log จะเป็นพระเอกในการแก้ปัญหาเวลา container ของเรา error บทความนี้จะรวมคำสั่งในการจัดการกับ Logs file ไว้ที่นี่
จัดการกับ Docker Network
Jan 21, 24

docker

จัดการกับ Docker Network
docker network คือการเชื่อม(connected) container เข้าหากันทำให้ container สามารถคุยกันได้
Top 20 Docker Commands ที่ต้องรู้จัก
Jan 21, 24

docker

Top 20 Docker Commands ที่ต้องรู้จัก
รวม docker commands ที่เราต้องใช้ในชีวิตประจำวันซึ่งผมจะเรียงจาก command ที่ใช้บ่อยมากที่สุด ไปหา commands ที่ใช้น้อยสุด
ติดต้ัง Sql Server ด้วย Docker
Jan 6, 24

docker

ติดต้ัง Sql Server ด้วย Docker
การติดต้ัง SQL Server ลงใน docker จะช่วยให้เราสามารถเปลี่ยน version ของ database server ได้ง่าย และยังจำลอง SQL Server บนเครื่อง dev ได้ง่ายขึ้นอีกด้วย
Podman คืออะไร? ต่างจาก docker ยังไง?
Jan 3, 24

docker

Podman คืออะไร? ต่างจาก docker ยังไง?
podman ย่อมาจาก Pod Manager คือเครื่องมือที่ใช้สร้าง container เหมือนกับ docker แต่จะมีความปลอดภัยมากกว่า
Docker Image คืออะไร?
Dec 3, 23

docker

Docker Image คืออะไร?
Container จะสร้างได้เราต้องมี image มาก่อน ในบทความนี้เราจะพาคุณไปรู้จักกับการทำงานของ Image และคำสั่งที่ใช้จัดการ docker image
วิธีการเขียน Dockerfile เบื้องต้น
Dec 2, 23

docker

วิธีการเขียน Dockerfile เบื้องต้น
ถ้าเราใช้งาน Container ยังไงเราก็ต้องเขียน Dockerfile ดังนั้นเราต้องทำความเข้าใจวิธีการเขียน Dockerfile ให้ถูกต้อง
การ run Node JS ด้วย Docker
Dec 1, 23

docker

การ run Node JS ด้วย Docker
เราสามารถสร้าง Docker Container เพื่อ run Web Application ที่พัฒนาด้วย NodeJS โดยมีขั้นตอน ดังนี้
การทำงานกับ Docker Volume
Dec 1, 23

docker

การทำงานกับ Docker Volume
การใช้งาน Volume มีหลายวิธีดังนั้นเราต้องเลือกวิธีการ Mount Volume เข้าไปใน Container ให้ถูกต้อง
วิธีการติดตั้ง MySQL ด้วย docker
Nov 24, 23

docker

วิธีการติดตั้ง MySQL ด้วย docker
การใช้งาน MySql Database ด้วย Docker จะช่วยให้เราสร้าง development environment ขึ่้นมาได้อย่างรวดเร็ว รวมทั้งยังสามารถนำไป deploy บน server ได้ง่ายขึ้น
Run dotnet core ด้วย Docker
Aug 25, 23

docker

Run dotnet core ด้วย Docker
การนำ Web API ที่พัฒนาด้วย .NET Core เข้าไป Run ใน Docker Container จะมีขั้นตอนต่างๆ ดังนี้
การใช้งาน Kong บน Docker
Oct 27, 23

kong

การใช้งาน Kong บน Docker
ถ้าเราใช้ Kong API Gateway บน Docker เราจะใช้การ Config แบบ DBLess(ใช้ YAML) ซึ่งจะทำให้ Kong มีความเป็น Stateless มากกว่าแบบมี Databse
ติดตั้ง SonarQube ด้วย Docker
May 3, 23

sonarqube

ติดตั้ง SonarQube ด้วย Docker
การใข้ sonarqube ผ่านทาง docker compose จะสะดวกกว่า dokcer ตรงที่เราสามารถสร้าง network ที่เชื่อม sonarqube server กับ sonarqube database ได้เลย
การติดตั้ง gitlab บน docker
Mar 23, 23

gitlab

การติดตั้ง gitlab บน docker
แนะนำวิธีติดตั้ง gitlab บน docker และ docker compose มาลองดูว่าเราต้อง mount volume ยังไงและต้อง config อะไรบ้าง
Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security