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