ศูนย์คอมพิวเตอร์และเครือข่ายโรงเรียนวารินชำราบ

ทิป เทคนิค สำหรับผู้ดูแลระบบ => DOCKER เบื้องต้น => ข้อความที่เริ่มโดย: ผู้ดูแลระบบ ที่ วันที่ 20 เมษายน 2019, เวลา 08:59:42 am

หัวข้อ: Docker คืออะไร ใช้งานอย่างไร
เริ่มหัวข้อโดย: ผู้ดูแลระบบ ที่ วันที่ 20 เมษายน 2019, เวลา 08:59:42 am
(https://cdn-images-1.medium.com/max/800/0*eoDm40haKKgOBod1.png)
Docker คืออะไร
Docker คือ engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง server เพื่อใช้ในการ run service ที่ต้องการ มีการทำงานคล้ายคลึงกับ Virtual Machine เช่น VMWare, VirtualBox, XEN, KVM แต่ข้อแตกต่างที่ชัดเจนคือ Virtual Machine ที่รู้จักกันก่อนหน้านี้นั้น เป็นการจำลองทั้ง OS เพื่อใช้งานและหากต้องการใช้งาน service ใดๆ จึงทำการติดตั้งเพิ่มเติมบน OS นั้นๆ แต่สำหรับ docker แล้วจะใช้ container ในการจำลองสภาพแวดล้อมขึ้นมา เพื่อใช้งานสำหรับ 1 service ที่ต้องการใช้งานเท่านั้น โดยไม่ต้องมีส่วนของ OS เข้าไปเกี่ยวข้องเหมือน Virtual Machines อื่นๆ ตัวอย่างดังรูป(https://cdn-images-1.medium.com/max/800/0*yVeFXrQ098IERiLG.png)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 เมื่อเทียบกับ VMs
การติดตั้ง DockerDocker สามารถติดตั้งได้ทั้ง Linux (https://docs.docker.com/engine/installation/), Mac  (https://docs.docker.com/docker-for-mac/)(OS X 10.11 or newer macOS)และ Windows (https://docs.docker.com/docker-for-windows/) (Windows 10 Pro 64bit) ซึ่งสำหรับ Mac และ Windows รุ่นต่ำกว่านั้นต้องติดตั้งโดยใช้ Docker Toolbox (https://docs.docker.com/toolbox/overview/) แทน โดยเราจะใช้ Docker Toolbox เนื่องจากผมใช้ window 8(https://cdn-images-1.medium.com/max/800/1*0EFVANGNe1AovBbBvmD2Og.png)ติดตั้ง Docker ToolboxDocker Toolbox จะประกอบด้วยDocker ConceptsImagesContainersRegistries and Repositories(https://cdn-images-1.medium.com/max/800/1*v1IXRTAzUxaLFKJ9bPJhSA.png)หน้าตาของ Docker Hub
ลองสร้าง Hello World Docker Container(https://cdn-images-1.medium.com/max/800/1*S0LtLiN5s0ncQDRYKGWCRw.png)(https://cdn-images-1.medium.com/max/800/1*3Q66mlRZVjMLQVyXRGwbgw.png)หน้าตาของ Docker Terminal(https://cdn-images-1.medium.com/max/800/1*yX3aQOkrGs8CB7K2izi4pQ.png)docker images
docker run busybox:1.26.2 echo “hello world”
ที่ระบุ tag เป็น 1.26.2 (แต่ถ้าไม่ระบุ tag จะใส่ tag เป็น latest เสมอ) ซึ่งถ้าเรายังไม่มี image ตัวนี้ Docker จะทำการ pull มาจาก registry ให้ ตามด้วยคำสั่งที่จะใช้งานคือให้พิมพ์คำว่า hello world ออกมา รูปแบบคำสั่ง docker run repository:tag command [arguments] รายละเอียดเพิ่ม ที่นี่ (https://docs.docker.com/engine/reference/commandline/run/)(https://cdn-images-1.medium.com/max/800/1*cCsCj64eu50aANvjPbbaSA.png)(https://cdn-images-1.medium.com/max/800/1*j-ahlX6w9cFUW-s3liMfZQ.png)(https://cdn-images-1.medium.com/max/800/1*BCmQoSuaARVyHTA0oi-bJw.png)

ใช้งาน Docker ContainerDetached Modeความแตกต่างระหว่างการรัน container แบบ foreground (default mode) กับแบบ background หรือ detached mode (-doption) คือ เมื่อรันแบบ foreground หน้าจอ console จะแสดง process ของ container ตัวนั้นๆ อยู่ ไว้รับ input แสดง output รวมถึง standard error ดังนั้นจะใช้ console พิมพ์คำสั่งอื่นๆ ต่อไม่ได้ ซึ่งจะต่างจากแบบ background ซึ่งเมื่อรัน container แล้วจะแสดง container id ออกมาทางหน้าจอ console และสามารถพิมพ์คำสั่งอื่นได้ ส่วน process จะรันอยู่ใน background จนกว่าจะสั่งให้ container นั้นหยุดทำงาน(https://cdn-images-1.medium.com/max/800/1*80qbk99Qh8s8cM8ERqWcUw.png)ถ้าใช้ -d option หน้า console จะสามารถรับคำสั่งอื่นได้ ต่างจาก default ที่ต้องรอจนกว่า container จะหยุดทำงานการใช้งานคำสั่ง docker psคำสั่ง docker ps เอาไว้แสดงรายการ container ที่กำลังทำงานอยู่ทั้งหมด(https://cdn-images-1.medium.com/max/800/1*fNJS0WkGzWKasXwzTS3MHQ.png)ซึ่งถ้าต้องการให้แสดง container ทั้งหมด รวม container ที่หยุดการทำงานไปแล้วด้วยต้องใช้ -a option docker ps -a
กรณีที่ต้องการสร้าง container และต้องการให้ลบทิ้งเมื่อทำงานเสร็จให้ใช้ --rmoption ตัวอย่าง docker run --rm busybox sleep 1(https://cdn-images-1.medium.com/max/800/1*T6L__n76-CinYChSZXClRw.png)จะเห็นลอง docker ps -a แล้วไม่มี container id ที่รันคำสั่ง sleep 1 เลยการกำหนดชื่อให้กับ Containerเนื่องจากการสร้าง container แบบปกติ Docker จะทำการระบุชื่อของ container ให้เองแบบไม่ซ้ำกัน แต่เราสามารถระบุชื่อเองได้โดยใช้ — name optionตัวอย่างdocker run --name hello_world busybox echo "hello worlf"(https://cdn-images-1.medium.com/max/800/1*W1rHs-uCYp6mwzHRyEmTgw.png)การดูรายละเอียดภายใน Containerทำได้โดยใช้คำสั่ง docker inspect id(container/image) เพื่อแสดงข้อมูล low level ของ container หรือ image(https://cdn-images-1.medium.com/max/800/1*roidvbkGO1HYs9Pw24q7Og.png)การทำ Docker Port Mappingโดยปกติ ports ที่ถูกเปิดไว้ภายใน container นั้นจะไม่สามารถเข้าใช้งานได้จาก Docker Host ได้ ซึ่งการที่จะเข้าใช้งานได้นั้นต้องทำ publish port ที่ต้องการก่อน ตั้งแต่ขั้นตอนการสร้าง container ขึ้นมา (docker run) ซึ่งสามารถทำได้ 2 วิธี
1. ใช้ -p host_port:container_port เพื่อผูก port ของ container เข้ากับ host
2. ใช้ -P ถ้าต้องการผูกทุก ports ของ container ที่ expose* ไว้ให้กับ host โดยฝั่ง host จะเป็นการ random port
*expose คือ การเปิด port ใน container ใช้ option --expose โดยสามารถระบุเป็น port หรือ เป็นช่วงของ port ก็ได้
ทดลองสร้าง container ของ Tomcat 8.0 (https://hub.docker.com/_/tomcat/) ซึ่งมี port เป็น 8080 และต้องการผูกกับ host port ที่ 8888 โดยใช้คำสั่งนี้ docker run -it --rm -p 8888:8080 tomcat:8.0ทดสอบเข้า http://host-ip:8888 (http://192.168.99.100:8888/) จากเบราว์เซอร์(https://cdn-images-1.medium.com/max/800/1*9VIBBz26lIcP3Lk0jyj6bg.png)(https://cdn-images-1.medium.com/max/800/1*KMkXtx-ZxbPOMVAWn2MtBw.png)Docker logsในกรณีที่รัน container ใน detached mode เราสามารถดู log ของ container ตัวนั้นๆ ได้จาก docker logs (https://docs.docker.com/engine/reference/commandline/logs/) ซึ่งมีรูปแบบคำสั่ง คือdocker logs [options] container_id(https://cdn-images-1.medium.com/max/800/1*QMgArqMxIACEbUGcYahP-g.png)

Docker ImagesDocker Image LayersDocker Image แต่ละตัวจริงๆ แล้วมันจะเป็นการอ้างอิงถึงรายการของ read-only layers ซึ่ง layers (https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/) ที่ว่านี่ก็คือ stack image layer ที่ซ้อนต่อกันจาก base image(https://cdn-images-1.medium.com/max/800/1*81E190ZzI7cfLdH-yDj3lQ.png)จากรูป image ตัวนี้ประกอบด้วย 3 stacked image layersวิธีการดูว่า Docker Image ที่เราใช้นั้นประกอบด้วย image อะไรบ้าง ดูได้จากคำสั่ง docker history ตัวอย่าง docker history busybox(https://cdn-images-1.medium.com/max/800/1*iLkAGmp7giykMa11sg412Q.png)busyboxจะมี 2 layers คือ base image ที่ add file และ image ที่ 2 สั่งรัน bashdocker history ตัวอย่าง docker history busybox:1.26.2(https://cdn-images-1.medium.com/max/800/1*x6-aDmGJ4Q3tmK8RwiVrQw.png)busybox:1.26.2 จะมี 2 layers คือ base image ที่ add file และ image ที่ 2 สั่งรัน bashโดยเมื่อสั่งสร้าง container แล้ว มันจะสร้าง Thin R/W layer หรือเรียกว่า container layer ขึ้นมาไว้ข้างบน โดยสามารถมีได้หลายตัวต่อ 1 image ซึ่งการเปลี่ยนทั้งหมดเช่น เขียนไฟล์ใหม่ แก้ไขไฟล์เดิม หรือลบไฟล์ทิ้ง จะเกิดขึ้นที่ container layer ของแต่ละตัว ซึ่งถ้าลบ container ทิ้งไป container layer ก็จะถูกลบไปด้วย โดยไม่ไปแก้ไขอะไรที่ image เลย(https://cdn-images-1.medium.com/max/800/1*S8McRWDBaB679hLSmEaCxg.png)การสร้าง Docker Imageมี 2 วิธีในการสร้าง Docker Image
1. commit (https://docs.docker.com/engine/reference/commandline/commit/) สิ่งที่เราแก้ไขทั้งหมดใน Docker Container
2. สร้าง Dockerfileสร้าง Docker Images จากคำสั่ง docker commitตัวอย่างถ้าต้องสร้าง image ของ debian ที่มี git client ติดตั้งมาให้พร้อมใช้งาน ทำได้โดย(https://cdn-images-1.medium.com/max/800/1*aJYlNo5n-tHO4owze-nQkg.png)(https://cdn-images-1.medium.com/max/800/1*Tt-lvKaFi1vaptanDVsOOA.png)(https://cdn-images-1.medium.com/max/800/1*YO33M-hhwoM_9tPlMuuwgQ.png)จะได้ image ตัวใหม่ ที่มีขนาดใหญ่กว่าเดิม เพราะติดตั้ง git เพิ่มเข้าไป(https://cdn-images-1.medium.com/max/800/1*iA5b2pT2PAxF_QrGCN7q0A.png)จะเห็นว่าใช้คำสั่ง git ได้แล้ว

วิธีการเอา Docker Image ขึ้น Docker Hub(https://cdn-images-1.medium.com/max/800/1*7rd10si2urHxkNd89DNvcQ.png)ostlab คือ docker_hub_id โดย Repository จะเป็น docker_hub_id/repository name(https://cdn-images-1.medium.com/max/800/1*VRH-1WcWRdLvcSfMx1Z1iA.png)(https://cdn-images-1.medium.com/max/800/1*bqxo2gdLwVvPeO-wkE3yXQ.png)(https://cdn-images-1.medium.com/max/800/1*LQTi6mDMTbTQFqGOE8DLAA.png)(https://cdn-images-1.medium.com/max/800/1*ROSDiIajyWLWYrcjWw4FQw.png)
จะเห็นว่ามี Paretk/debian อยู่cr: https://medium.com/@rachatatongpagdee/