Docker คืออะไร

Docker คือ engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง server เพื่อใช้ในการ run service ที่ต้องการ มีการทำงานคล้ายคลึงกับ Virtual Machine เช่น VMWare, VirtualBox, XEN, KVM แต่ข้อแตกต่างที่ชัดเจนคือ Virtual Machine ที่รู้จักกันก่อนหน้านี้นั้น เป็นการจำลองทั้ง OS เพื่อใช้งานและหากต้องการใช้งาน service ใดๆ จึงทำการติดตั้งเพิ่มเติมบน OS นั้นๆ แต่สำหรับ docker แล้วจะใช้ container ในการจำลองสภาพแวดล้อมขึ้นมา เพื่อใช้งานสำหรับ 1 service ที่ต้องการใช้งานเท่านั้น โดยไม่ต้องมีส่วนของ OS เข้าไปเกี่ยวข้องเหมือน Virtual Machines อื่นๆ ตัวอย่างดังรูป

Docker นั้น เป็นที่รู้จักกันอย่างแพร่หลายในช่วง 1-2 ปีที่ผ่านมานี้ เนื่องจากสามารถใช้งานได้อย่างสะดวกและตอบสนองความต้องการของ ผู้พัฒนาโปรแกรม (Developer) หรือ ผู้ดูแลระบบ (System admin)

Docker image คืออะไร

Docker image เป็นเหมือนตัวต้นแบบของ container ซึ่งภายในจะประกอบด้วย application ต่างๆ ที่มีการติดตั้งไว้เพื่อใช้งานสำหรับ service นั้นๆ รวมทั้งมีการ config ค่าต่างๆ ไว้เรียบร้อยแล้ว จากนั้นก็นำมาสร้างเป็น docker image บน registry เพื่อนำใช้งาน ทั้งนี้ผู้ใช้งานสามารถยังสร้าง docker image สำหรับใช้งานเองได้อีกด้วย

Docker container คืออะไร

Docker container สามารถมองได้เสมือนกล่อง ซึ่งนำ docker image มาติดตั้ง เพื่อให้สามารถใช้งาน service ที่ต้องการจาก image นั้นๆ ได้ โดยใน container แต่ละตัวจะมีการใช้งาน RAM, CPU, ไฟล์ config ต่างๆ เป็นของแต่ละ container เอง และยังสามารถสั่ง start, stop ได้ที่ container นั้นๆ อีกด้วย

ความน่าสนใจของ docker

  • Docker engine สามารถใช้งานได้บนหลาย platform ทั้งบน Linux, Mac และ Windows
  • Docker มีขนาดเล็ก สามารถใช้งาน และติดตั้งได้อย่างรวดเร็ว และสะดวกในการ start / stop หรือแม้แต่การย้ายไปใช้งานสำหรับเครื่อง server อื่นที่มีการ run docker engine ก็สามารถทำได้โดยไม่ซับซ้อน
  • ผู้ใช้งาน docker ไม่จำเป็นต้องติดตั้ง OS อีกครั้งเพื่อติดตั้ง container รวมทั้งไม่จำเป็นต้อง config เพิ่มเติมในส่วนที่ไม่จำเป็นอีกด้วย
  • Docker มีความต้องการในการใช้ CPU, RAM และพื้นที่น้อยกว่า Virtual Machine ทั้งนี้ในทรัพยากรที่มีเท่ากัน docker สามารถใช้งาน container ได้มากกว่า Virtual Machine
  • เนื่องจากผู้ใช้งาน สามารถสร้าง docker image ได้เอง จาก dockerfile ดังนั้นการใช้งาน docker ยังช่วยลดปัญหาสภาพแวดล้อมที่ต่างกัน ที่มักพบเมื่อบาง application สามารถทำงานได้บน development server แต่ไม่สามารถใช้งานบน production server ได้
  • Docker ยังมี docker registry ซึ้งผู้ใช้งานสามารถเลือก pull image ต่างๆ ที่มีการสร้างไว้ให้แล้วมาใช้งาน โดยมี Docker Hub เป็น registry หลักในการเรียกใช้ image

การติดตั้ง docker บน centOS 7

สามารถตรวจสอบ การตั้งค่าเบื้องต้นของ centos 7 เพิ่มเติมได้จาก https://www.hostpacific.com/basic-centos7-configuration/

เริ่มต้นการติดตั้งด้วยการ update package ต่าง และติดตั้ง docker

yum -y update
yum -y install yum-utils docker-engine

หลังจากติดตั้งเรียบร้อย ก็ทำการ start docker daemon

systemctl start docker
systemctl enable docker

ตรวจสอบสถานการณ์ทำงานว่ามีการ active เรียบร้อย

systemctl status docker

เริ่มต้นการใช้งาน Docker

รูปแบบคำสั้งการใช้งาน จะคล้ายกับคำสั่ง Linux ทั่วๆไป เช่น

การตรวจสอบ version
# docker -v
Docker version 1.13.0, build 49bf474

การตรวจสอบ option ต่างๆ ของคำสั่ง
# docker --help

รูปแบบคำสั้งเพิ่มเติม เช่น

# docker [option] [command] [arguments]
# docker docker-subcommand –help

COMAND เบื้องต้นที่ควรทราบ

port      List port mappings or a specific mapping for the container

images แสดงรายละเอียดของ image ที่มีบนเครื่อง server

ps        แสดงรายละเอียดของ container ที่มีการ start การทำงาน

pull       ดึง image จาก registry มาใช้งาน

port      กำหนด port การเชื่อมต่อ ระหว่าง container และเครื่อง server

search  ตรวจสอบหา image ที่ต้องการใช้งานจาก docker hub

start     สั่งให้ container เริ่มทำงาน

stop     สั่งให้ container หยุดทำงาน

run      ใช้ในการสร้าง container ใหม่ กรณีที่ยัง ไม่มี docker image นั้นๆ บนเครื่อง server คำสั่งนี้จะ pull                           image ลงมายังเครื่องโดยอัตโนมัติ

rm        ลบ container ที่ไม่ต้องการใช้งาน

rmi       ลบ image ที่ไม่ต้องการใช้งาน

เมื่อติดตั้งเรียบร้อยแล้ว สามารถตรวจสอบเพิ่มเติมว่า สามารถติดตั้ง docker ได้อย่างถูกต้อง ด้วยการทดสอบ เรียกใช้งาน hello-world image.

# docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
…

จาก output พบว่า สามารถติดตั้งได้เรียบร้อยดีแล้ว

การติดตั้ง container เพื่อใช้งาน

สำหรับในส่วนต่อไป จะเป็นการติดตั้ง container เพื่อนำมาใช้งานสำหรับ service นั้นๆ

ตัวอย่างที 1 การติดตั้ง Nginx

สร้าง directory และ ไฟล์ สำหรับเก็บข้อมูล web และสร้างไฟล์ index.html

# mkdir -p /var/www/html
# vi  /var/www/html/index.html

<html><title> Docker </title>
<body> Test docker by nginx-image</body>
</html>

# ทำการสั่ง docker ให้ทำงาน
# docker run --name nginx-webserver1 -v /var/www/html:/usr/share/nginx/html:ro -p 80:80 
-d nginx
  • docker run คือ การสั่งให้ทำการสร้าง container ใหม่
  • –name nginx-webserver1 คือการกำหนดชื่อ container ที่ต้องการสร้าง
  • -v /var/www/html:/usr/share/nginx/html:ro คือการกำหนด ช่องทางการเชื่อมต่อ ระหว่าง container และ content ที่มีบนเครื่องคือ /var/www/html
  • -p 80:80 เป็นการกำหนดการเชื่อมต่อ port ของ container และ เครื่อง server จากตัวอย่าง เป็นกำหนดให้ nginx ใช้ port 80 (ค่าหน้าเครื่องหมาย colon)
  • -d คือ กำหนดการทำงานเป็น background mode
  • nginx คือ ชื่อ image ที่เรียกใช้งาน

เมื่อสั่งคำสั่งเรียบร้อย ให้ลองทดสอบเรียก web ด้วยชื่อ IP ก็จะพบว่า สามารถเรียกใช้งาน web site ได้แล้ว

ตรวจสอบ image ที่มีอยู่บน server ขณะนี้

# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              cc1b61406712        2 weeks ago         182 MB
hello-world         latest              48b5124b2768        3 weeks ago         1.84 kB

ตรวจสอบ container ที่มีการ start อยู่ ซึ่งคือ nginx-webserver1
# docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED   STATUS  PORTS   NAMES
e439dec92237   nginx   "nginx -g 'daemon ..."   About a minute ago   Up About a minute 
0.0.0.0:80->80/tcp, 443/tcp   nginx-webserver1

ตัวอย่างที 2 การติดตั้ง WordPress

ตามปรกติแล้ว เมื่อต้องการใช้งาน CMS ผู้ใช้งานจะต้องติดตั้ง database service, web service (Apache, Nginx หรืออื่นๆ) รวมทั้ง PHP และดำเนินการปรับ config ในส่วนต่างๆ ของแต่ละ service จึงจะสามารถติดตั้ง wordpress ได้ ตัวอย่างนี้ จะนำเสนอการติดตั้ง wordpress ด้วย docker ว่าสามารถดำเนินการได้อย่างไร

เริ่มด้วยการติดตั้ง database ผ่าน docker

# docker run --name mymariadb -e MYSQL_ROOT_PASSWORD=PASSword -d mariadb:latest

mariadb:latest หมายถึง docker image mariadb ซึ่งเป็น version ล่าสุด

และติดตั้ง WordPress

# docker run --name mywordpress --link mymariadb:mysql -p 8080:80 -d wordpress

เมื่อคำสั่งทำงานเรียบร้อย ให้เปิดหน้า web browser: http://IP:8080 เพื่อกำหนดค่าสำหรับ admin ของ WordPress อีกเล็กน้อย

ก็จะสามารถใช้งาน WordPress ได้เรียบร้อย

ทั้งเมื่อตรวจสอบ docker container ที่มีการทำงาน จะพบว่ามี อยู่ 3 container ด้วยกัน

# docker ps

CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS   PORTS   NAMES
1562fb040b94   wordpress   "docker-entrypoint..."   9 seconds ago  Up 9 seconds   
0.0.0.0:8080->80/tcp   mywordpress  c36891d8466c  mariadb:latest      "docker-entrypoint..."  
3 minutes ago  Up 3 minutes  3306/tcp  mymariadb  e439dec92237        nginx   "nginx -g 
'daemon ..."   17 hours ago   Up 17 hours  0.0.0.0:80->80/tcp, 443/tcp   nginx-webserver1

กรณีที่ต้องการยกเลิกการใช้งาน

เมื่อต้องการหยุดใช้งานสามารถสั่งได้ โดย

# docker stop nginx-webserver1

หรือหากไม่ต้องการใช้งาน container ดังกล่าวแล้ว สามารถลบออกได้

# docker rm nginx-webserver1

เมื่อตรวจสอบอีกครั้งจะพบว่า เหลือ container ที่ทำงานอยู่เพียง 2 container เท่านั้น

# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED  STATUS  PORTS   NAMES
1562fb040b94  wordpress   "docker-entrypoint..."   9 seconds ago  Up 9 seconds  
0.0.0.0:8080->80/tcp  mywordpress   c36891d8466c   mariadb:latest "docker-entrypoint..."
3 minutes ago Up 3 minutes  3306/tcp   mymariadb

สำหรับในบทความนี้ ได้นำเสนอรายละเอียดรวมทั้งการนำไปใช้งานเบื้องต้น สำหรับ docker ซึ่งช่วยให้การติดตั้งโปรแกรมต่างทำได้สะดวกยิ่งขึ้น ทั้งนี้ docker ยังสามารถนำมาประยุกต์ใช้งานเพิ่มเติมได้อย่างหลากหลาย ซึ่งอาจขอกล่าวถึงในบทความต่อไป

ข้อมูลเพิ่มเติ

  • Docker documentation: https://docs.docker.com/engine/userguide/
  • Docker registry: https://hub.docker.com