Coding Gun

Top 20 Docker Commands ที่ต้องรู้จัก

ต้องบอกว่า command ของ docker มีเยอะมากๆ ทำให้เรียนรู้ได้ค่อนข้างยาก ผมเลยรวบรวมเอา docker commands ที่เราต้องใช้แน่ๆ ในชีวิตประจำวันมาเรียบเรียงไว้ให้ จะได้ง่ายสำหรับมือใหม่

คำสั่งพื้นฐานสำหรับผู้เริ่มต้น

กลุ่มนี้เป็นคำสั่งสำหรับผู้เริ่มต้นที่หัดใช้งาน docker

docker pull

คำสั่งนี้ใช้สำหรับ download image ลงมาจาก container registry ซึ่งโดย default จะเป็น https://hub.docker.com

$ docker pull [ชื่อ Image]

ตัวอย่าง เช่น ถ้าเราต้องการ download image ของ nginx ลงมาในเครื่องเราจะใช้คำสั่ง

$ docker pull nginx

docker run

หลังจากเราได้ docker image มาไว้ในเครื่องแล้ว สิ่งที่เราต้องทำต่อคือ นำ docker image นั้นมาสร้างเป็น container ซึ่งเราจะใช้คำสั่ง

$ docker run [options] [ชื่อ Image]

โดยที่ options ที่เราต้องใช้งานบ่อยๆมีดังนี้

ตัวอย่างเช่น

$ docker run --rm -p 8080:80 --name web-server nginx

ในตัวอย่างนี้จะสร้าง nginx container ชึ้นมาแล้ว map เข้าไปที่ port 8080 บนเครื่อง host และหลังจากที่ nginx stop แล้ว docker จะลบ container นี้ออกทันที

Image อาจได้มาจากการ build ด้วยคำสั่ง docker build ก็ได้

ส่ง command เข้าไปใน container

ถ้าใน container นั้นต้องการให้ใส่ command หรือ parameters เข้าไป เราจะสามารถเขียนต่อจากชื่อ Image ได้เลย ยกตัวอย่างเช่น

$ docker run --rm alpine echo "hello"

ในตัวอย่างนี้จะเป็นการส่งคำสั่ง echo “hello” เข้าไปใน alpine container

docker ps

ถ้าเราอยากรูว่าในเครื่องมี container อยู่กี่ตัว เราจะใช้คำสั่ง

$ docker ps -a

หรือ

$ docker ps --all

คำสั่งนี้จะ list container ออกมาทั้งหมดทุกสถานะทั้งที่ืกำลัง run อยู่และ exit ออกไปแล้ว

แต่ถ้าเราสนใจแค่ container ที่กำลัง run อยู่เท่านั้นให้ใช้คำสั่ง

$ docker ps

docker stop

ถ้าเราต้องการให้ container หยุดการทำงานแต่ยังมี container อยู่เหมือนกับ shutdown เราจะใช้คำสั่ง

$ docker stop [Container ID]

ยกตัวอย่าง เช่น

$ docker stop 51b6

เราจะต้องหา Container ID ด้วยคำสั่ง docker ps

ถ้าเราต้องการหยุดทุกๆ container ที่กำลัง run อยู่เราสามารถใช้คำสั่ง

$ docker stop $(docker ps -q)

docker ps -q จะ return Container ID ของทุกๆ container ที่กำลัง run อยู่ออกมา

docker start

ถ้าต้องการให้ container กลับมา start ใหม่ให้ใช้ตำสั่ง

$ docker start [container ID]

การใช้งานจะเหมือนกับ docker stop แค่เปลี่ยนเป็น docker start เท่านั้น

docker rm

ถ้าเราต้องการลบ container นั้นทิ้งไป เราจะใช้คำสั่ง docker rm แบบนี้

$ docker rm [container ID]

เราสามารถเข้าไปดู container ID ได้ด้วยคำสั่ง docker ps

ถ้าเราต้องการลบ ในขณะที่ container กำลัง run อยู่ให้ใช้คำสั่ง

$ docker rm -d [container ID]

และถ้าเราต้องการลบ container ที่กำลัง run อยู่ทั้งหมดให้ใช้คำสั่ง

$ docker rm -f $(docker ps -q)

แต่ถ้าต้องการลบ container ทั้งหมดโดยไม่สนว่าจะ run อยู่หรือไม่ให้ใช้คำสั่ง

$ docker rm -f $(docker ps -aq)

docker images

ในการจัดการ docker image นั้นมีคำสั่งค่อนข้างเยอะหลักๆแล้วเราจะใช้คำสั่งต่างๆดังต่อไปนี้

ดูคำสั่งอื่นๆเกี่ยวกับ docker image ได้ที่นี่

เมื่อ container ไม่ทำงานให้ลองคำสั่งนี้

หลังจากที่เราสร้างและลบ container และ container image ได้แล้ว เมื่อเกิดปัญหาสิ่งที่เราต้องเข้าไปตรวจสอบมีดังนี้

docker exec

เข้าไปใน shell ของ container เพื่อตรวจสอบว่า file หรือ service ต่างๆใน container ยังทำงานอยู่หรือไม่

$ docker exec [options] [Container ID] [command]

โดยมี options ต่างๆที่เราต้องรู้จักไว้ดังนีั้

ยกตัวอย่างเช่น

$ docker exec -it 516b /bin/bash

ในคำสั่งนี้เราจะใช้ docker exec ในการส่ง command /bin/bash เข้าไปใน container id 516b(ต้องใช้ image ที่มี bash shell) หลังจากนั้นเราจะเข้าไปใน shell ของ container ที่เราต้องการได้

ในบางกรณี image ของเราไม่มี bash shell ให้ลองเข้าถึง shell ด้วยคำสั่ง

$ docker exec -it 516b sh

docker logs

ถ้าเราต้องการเข้าไปดู log ของ container เหมือนกับตอนที่เราเข้าไปดู console ของ remote server หรือ VM เราจะใช้คำสั่ง

$ docker logs [option] [Container ID]

โดยที่ options ต่างๆ ที่เราจะใช้บ่อยๆ มีดังนี้

ยกตัวอย่าง เช่น

$ docker logs -f 516b

ในตัวอย่างนี้จะเข้าไปดู log หรือ console ของ container รหัส 516b โดยที่จะรอดูการเปลี่ยนแปลงไปเรื่อยๆจนกว่าจะกด Control + C ออกมา

ดูรายละเอียดการใช้งาน docker logs เพิ่มเติมได้ที่นี่

docker inspect

คำสั่งนีั้ใช้สำหรับตรวจสอบค่าของ object ต่างๆใน docker ทั้ง container, network, volume และ object อื่นๆ คำสั่งที่เราใช้บ่อยๆมีดังนีั้

docker container stats

ถ้าเราต้องการดูว่า container ของเราแต่ละตัวใช้ cpu และ memory ไปเท่าไหร่แล้วเราจะใช้คำสั่ง docker container stats หรือเขียนสั้นๆ เป็น docker stats

$ docker stats

ผลลัพธ์จะออกมาเป็น

CONTAINER ID   NAME  CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
3c3abc063f24   web   0.00%     7.102MiB / 7.661GiB   0.09%     1.18kB / 0B   49.2kB / 12.3kB   9

ทำงานกับ Container Registry

การใช้งาน container จำเป็นต้องมี container registry(server ที่เก็บ container image) ดังนั้นเราต้องทำการเชื่อมต่อกับ container registry ด้วยคำสั่งต่างๆ ต่อไปนี้

docker login

ใช้สำหรับการ login เข้าไปใน container registry ซึ่งขึ้นอยู่กับสิทธิของการเข้าใช้งาน คำสั่งนี้เราสามารถพิมพิ์เข้าไปตรงๆได้เลย

$ docker login

หลังจากนั้นก็ใส่ username หรือ password เข้าไปได้เลย

docker build

ในกรณีที่เราต้องการ build docker image ขึ้นมาใหม่(custom image) ด้วยการเขียน Dockerfile เราจะต้องสั่ง build image ขึ้นมาด้วยคำสั่ง

$ docker build -t [ชื่อ tag] [Path ของ Dockerfile] 

ยกตัวอย่างเช่น

$ docker build -t myapp:1.0 .

ในตัวอย่างนี้จะเป็นการ build comtainer image ชื่อ myapp มี tag เป็น version 1.0 โดยใช้ Dockerfile ที่อยู่ใน path ปัจจุบัน(. ตัวสุดท้าย)

docker tag

ถ้าเราต้องการเปลี่ยนชื่อหรือ version ของ image ที่ได้ build ไปแล้วให้ใช้คำสั่ง

$ docker tag [SOURCE_IMAGE]:[TAG_NAME]

ตัวอย่าง ถ้าเราต้องการเปลี่ยน version จาก 1.0 เป็น 2.0 ให้เราใช้คำสั่ง

$ docker tag myapp:2.0

ตอน build เราอาจใช้ myapp:latest เพื่อ build version ล่าสุดและหลังจากนั้นค่อยเพิ่ม tag ที่มีชื่อ version แบบในตัวอย่างนี้ก็ได้

ก่อนนำ Image ขึ้น Container Registry

เราต้องใส่ Container Registry URL เข้าไปในชื่อ image ก่อนจะเอาขึ้น container registry เช่นถ้าเราต้องการนำขึ้น docker hub เราต้องใส่ชื่อ user ของ docker hub เข้าไปนำหน้าแบบนี้

$ docker tag irobust/myapp:2.0

ในตัวอย่างนี้เราจะนำ myapp version 2.0 ขึ้นไปที่ docker hub ใน user ที่ชื่อ irobust

docker push

หลังจากที่ได้ container image ตามที่เราต้องการแล้วเราจะ push image ที่อยู่ในเครื่องเราตอนนี้ขึ้นไปยัง container registry ด้วยคำสั่ง

$ docker push [CONTAINER_REGISTRY_URL]/[IMAGE_NAME]:[TAG_NAME]

ยกตัวอย่างเช่น

$ docker push irobust/myapp:2.0

เราต้องระบุ path ของ container registry ที่เราจะขึ้น แต่ถ้าเราใช้ docker hub เราจะเขียนแค่ username ก็พอ

หรือ ถ้าต้องการ push ทุกๆ tags ขึ้นไปพร้อมๆกันให้เราใช้

$ docker push --all-tags [CONTAINER_REGISTRY_URL]/[IMAGE_NAME]

ยกตัวอย่างเช่น

$ docker push --all-tags irobust/myapp

สังเกตุว่าในแบบที่ 2 นี้เราไม่ต้องใส่่ tag เหมือนแบบแรก

docker logout

เมื่อไหร่ก็ตามที่เราต้องการ logout ออกให้ใช้คำสั่ง

$ docker logout

จัดการกับ volume ด้วยคำสั่ง

Docker volume ถือเป็นอีกหนึ่งองค์ประกอบที่สำคัญมากๆ สำหรับการใช้งาน container ซึ่งคำสั่งที่เราใช้ในการจัดการ volume บ่อยๆคือ

ดูรายละเอียดเกี่ยวกับการใช้งาน docker volume ได้ที่นี่

สร้าง network ด้วยคำสั่ง

การจัดการ network ก็เป็นอีกส่วนที่มีความสำคัญ เพราะ ไม่สามารถมี container เพียงตัวเดียวแล้ว run ทุกอย่างได้ มันจะผิดหลักการใช้งาน container(ต้องมี Single responsibility) ซึ่งคำสั่งของการจัดการ network มีดังนีั้

docker network

การจัดการ network เราจะใช้คำสั่ง docker network โดยจะแบ่งออกเป็นคำสั่งย่อยๆ ดังนี้

คำสั่งที่เราไม่ควรใช้

นอกจากคำสั่งที่เราต้องใช้แล้วยังมีคำสั่งที่เราไม่ควรใช้(ถ้าไม่จำเป็น) เพราะคำสั่งเหล่านี้จะทำให้เกิด Golden Image

Golden Image คือ image ที่ถูกแก้ไขผ่านทาง command line ซึ่งทำให้ image ของเราไม่ตรงกับ Dockerfile(ซึ่งควรจะต้องตรงกันตลอดเวลา)

docker cp

คำสั่งนี้จะใช้ในการ copy file ทั้งนำเข้าและนำออกจาก container

$ docker cp [file ที่ต้องการนำเข้า] [Container Id]:[path ที่ต้องการนำไปวาง]

ยกตัวอย่างเช่น

$ docker cp ./test.txt 516b:/tmp

ตัวอย่างนี้เป็นการนำ test.txt ไปวางไว้ใน /tmp ใน contianer ที่มี ID เป็น 516b

หรือถ้าต้องการ Copy ไฟล์ออกจาก container ให้วางสลับกัน

$ docker cp [Container Id]:[path ที่ต้องการนำไปวาง] [file ที่ต้องการนำเข้า] 

docker commit

หลังจากแก้ไข image ด้วยการ copy file เข้าไปใส่ใน container หรืออาจเข้าไปปรับ configuration ภายใน container ด้วย docker exec เราสามารถ commit การเปลี่ยนแปลงนี้กลับไปเป็น Image ได้ด้วยคำสั่ง docker commit ซึ่งเมื่อเราทำการ commit แล้ว Image ตัวนี้จะกลายเป็น Golden Image ทันที

docker save

คำสั่ง save เป็นการ export image ออกมาเป็นไฟล์ ซึ่งจะต้องใช้คู่กับ docker load ซึ่งเป็นสิ่งที่ยากกว่าการส่ง Dockerfile มากๆ ถ้าคุณต้องใช้ docker save และ docker load แสดงว่าต้องมี Golden Image เกิดขึ้นแน่นอน

คำสั่งต่างๆเหล่านี้เราสามารถใช้ได้ แต่ต่้องระวังไม่ให้เกิด Golden Image

Phanupong Permpimol
Follow me

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