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 ที่เราต้องใช้งานบ่อยๆมีดังนี้
-
–name ตั้งชื่อของ container ถ้าไม่ระบุชื่อของ container จะมาจากการ random
-
-p เป็นการ bind port ใน container ออกมาที่เครื่อง host จะต้องระบุในรูปแบบ
host_port:container_port
เช่น 8080:80 จะหมายความว่า การเข้าถึง port 8080 บนเครื่อง host จะถูกส่งต่อไปยัง port 80 ใน container -
-P หรือ –publish-all เป็นการ bind port ใน container ออกมาที่เครื่อง host จะแตกต่างจากการใช้ -p ตรงที่ -P จะเปิดทุก port ที่มีใน container ออกมาและ bind เข้ากับ port ในเครื่อง host แบบ random
-
-d run container เป็น background service(detach mode)
-
–rm ถ้า container นี้หยุดทำงานเมื่อไหร่ ให้ลบ container นี้ออกทันที
ตัวอย่างเช่น
$ 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 นั้นมีคำสั่งค่อนข้างเยอะหลักๆแล้วเราจะใช้คำสั่งต่างๆดังต่อไปนี้
- list รายชื่อ images ออกมา
$ docker images
- ลบ images ออกด้วยคำสั่ง
$ docker rmi [ชื่อ image]
- ลบ images ทั้งหมดที่ไม่ได้ใช้
image ตัวนี้เป็นเอกพจน์ ไม่เติม s
$ docker image prune
ดูคำสั่งอื่นๆเกี่ยวกับ docker image ได้ที่นี่
เมื่อ container ไม่ทำงานให้ลองคำสั่งนี้
หลังจากที่เราสร้างและลบ container และ container image ได้แล้ว เมื่อเกิดปัญหาสิ่งที่เราต้องเข้าไปตรวจสอบมีดังนี้
docker exec
เข้าไปใน shell ของ container เพื่อตรวจสอบว่า file หรือ service ต่างๆใน container ยังทำงานอยู่หรือไม่
$ docker exec [options] [Container ID] [command]
โดยมี options ต่างๆที่เราต้องรู้จักไว้ดังนีั้
- -i ถ้าเราต้องการพิมพิ์อะไรเข้าไปใน container ให้ใส่ -i เพื่อให้ container อยู่ใน interactive mode
- -t เป็นการนำผลลัพธ์ภายใน container ส่งออกมาที่ stdout ของเครื่อง host
ยกตัวอย่างเช่น
$ 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 ต่างๆ ที่เราจะใช้บ่อยๆ มีดังนี้
- -f ทำการติดตาม log ไปเรื่อยๆจนกว่าจะกด Control + C เพื่อ exit ออกมา
- -n ระบุจำนวนบรรทัดที่ต้องการดู เช่น -n 20
- –tail ดึง logs จากล่างสุด
ยกตัวอย่าง เช่น
$ docker logs -f 516b
ในตัวอย่างนี้จะเข้าไปดู log หรือ console ของ container รหัส 516b โดยที่จะรอดูการเปลี่ยนแปลงไปเรื่อยๆจนกว่าจะกด Control + C ออกมา
ดูรายละเอียดการใช้งาน docker logs เพิ่มเติมได้ที่นี่
docker inspect
คำสั่งนีั้ใช้สำหรับตรวจสอบค่าของ object ต่างๆใน docker ทั้ง container, network, volume และ object อื่นๆ คำสั่งที่เราใช้บ่อยๆมีดังนีั้
- ถ้าเราต้องการดูรายละเอียดของ container เราจะใช้คำสั่ง
หรือถ้าต้องการดึงข้อมูลแบบเฉพาะเจาะจงลงไปเราจะใช้ JSON path ในการดึง เช่น
$ docker inspect [Container Id]
ในตัวอย่างนี้จะทำการดึง path ที่เก็บ log ของ container(รหัส 516b) ออกมา$ docker inspect -f '{{.LogPath}}' 516b
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 ทั้งหมดที่มีเราจะใช้คำสั่ง
$ docker volume ls
- ถ้าเราต้องการลบ volume ที่ไม่ได้ใช้ออก เราจะใช้คำสั่ง
$ docker volume prune
ดูรายละเอียดเกี่ยวกับการใช้งาน docker volume ได้ที่นี่
สร้าง network ด้วยคำสั่ง
การจัดการ network ก็เป็นอีกส่วนที่มีความสำคัญ เพราะ ไม่สามารถมี container เพียงตัวเดียวแล้ว run ทุกอย่างได้ มันจะผิดหลักการใช้งาน container(ต้องมี Single responsibility) ซึ่งคำสั่งของการจัดการ network มีดังนีั้
docker network
การจัดการ network เราจะใช้คำสั่ง docker network
โดยจะแบ่งออกเป็นคำสั่งย่อยๆ ดังนี้
-
ถ้าต้องการ list รายชื่อของ network ที่มีอยู่ในเครื่องเราจะใช้คำสั่ง
$ docker network ls
ถ้าต้องการ filter ตาม driver ให้ใส่ –filter เข้าไปแบบนี้
$ docker network ls --filter driver=bridge
-
ถ้าเราต้องการสร้าง network ขึ้นมาใหม่ ให้ใช้คำสั่ง
$ docker network create [ชื่อ network]
-
ถ้าเราต้องการตรวจสอบการทำงานของ network ให้ใช้คำสั่ง
$ docker network inspect [network ID]
Network ID เราหาได้จากคำสั่ง
docker network ls
หรือถ้าเราต้องการดึงเฉพาะชื่อของ containers ที่อยู่ใน network นี้เราจะใช้คำสั่ง
$ docker network inspect -f '{{ .Containers }}' [network ID]
-
ถ้าต้องการลบ network ที่ไม่ได้ใช้ออกให้ใช้คำสั่ง
$ docker network prune
คำสั่งที่เราไม่ควรใช้
นอกจากคำสั่งที่เราต้องใช้แล้วยังมีคำสั่งที่เราไม่ควรใช้(ถ้าไม่จำเป็น) เพราะคำสั่งเหล่านี้จะทำให้เกิด 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