ลองใช้ Docker Context

Teerayut Hiruntaraporn
2 min readMay 7, 2021

--

Disclaimer: เนื้อหาต่อไปนี้ เป็น Tech ล้วนๆ อาจจะมีคำที่เป็น technical term เยอะพอสมควร แล้วบางครั้งไม่สามารถลดรูปได้ง่ายๆ ถ้าอ่านแล้วไม่เข้าใจต้องขออภัยไว้ ณ ที่นี้ด้วย

CR: borntodev

พอดีว่ามี blog ที่เปิดทิ้งไว้ เกี่ยวกับการใช้ งาน docker context เลยลองเปิดมาทดสอบอะไรสักหน่อย

ก่อนอื่นต้องพูดถึงปัญหาก่อนว่า เนื่องจากตอนนี้ก็มีการใช้งาน docker อยู่ภายในเครื่อง แต่ก็มีเครื่องที่จะต้องไป deploy ให้ลองโปรแกรมกัน เลยทำการหาวิธีในการสร้าง image จากเครื่องตัวเองแล้วส่งไป deploy ที่ปลายทาง

แน่นอนว่า วิธีการหากินท่าหนึ่งคือ การใช้ Private Repository ซึ่งก็ให้ผลที่ค่อนข้างดี

คือเราก็ tag ตัว image แล้วก็ส่งขึ้น repository ไป แล้วก็ให้อีกข้างถึงกลับมาโดยมีลักษณะประมาณนี้ครับ

docker image tag <image_name> <repo_host>:<repo_port>/<image_name>
docker push <repo_host>:<repo_port>/<image_name>

จากนั้นก็ให้ ปลายทางดึงของลงมาที่เครื่องแล้วสั่งทำงานก็สามารถทำงานได้ทันที

docker pull <repo_host>:<repo_port>/<image_name>
docker tag <repo_host>:<repo_port>/<image_name> <image_name>

ทีนี้ถ้าเป็น docker context เราก็จะต้อง เริ่มที่การตั้ง context ก่อน ว่าจะไปใช้ server ปลายทางอะไร

docker context create remote --description "Remote docker at 192.168.1.10" --docker "host=ssh://user@192.168.1.10"

ในคำสั่งนี้ก็จะบอกว่า

  • ให้ตั้ง context ชื่อ “remote”
  • โดยมีรายละเอียดว่า “Remote docker at 192.168.1.10”
  • และไปเรียกใช้ docker ที่ การเชื่อมต่อ ssh://user@192.168.1.10 ซึ่งเป็นการเชื่อมต่อผ่าน secure shell

เราก็จะได้ context ใหม่ซึ่งเราสามารถแสดงรายละเอียดได้ผ่านทาง

docker context ls 

แล้วถ้าเราต้องการใช้ context นั้นๆ ก็จะมีอยู่ 2 วิธีดังนี้

วิธีแรก คือการใช้ พารามิเตอร์ --context ในการเรียกใช้ โดยวิธีนี้จะทำให้ docker ไปเรียกใช้ context แบบชั่วคราว ถ้าต้องการใช้ 5 ครั้ง ก็ต้องมีพารามิเตอร์นี้ 5 ครั้ง โดยมีตัวอย่างดังนี้

docker --context remote ps

วิธีที่สอง คือการตั้ง context ผ่านคำสั่ง โดยวิธีนี้จะเปลี่ยน context ของการใช้งานให้เป็นไปตามที่เราต้องการ แต่ถ้าต้องการจะให้กลับเป็นเหมือนเดิม ก็จะต้องตั้งค่ากลับ

เช่น

docker context use remote
docker ps ## ใช้ที่ remote docker
docker context use default
docker ps ## ใช้ที่ local docker

ทีนี้เราก็เลยมาทดลองการจัดการผ่านการใช้ context ครับ

1. เปลี่ยน context แล้วก็ สั่งbuild มันไปเลย

ขั้นตอนก็ง่ายมาก เราก็เปลี่ยน context แล้วสั่ง docker build มันก็จะ build แล้วไปวาง image ที่ฝั่ง remote แล้ว ก็จะมีการทำงานแบบนี้ครับ

docker context use remote
docker build -f Dockerfile -t image_name .
docker context use default

แค่นี้ก็ได้ image ที่ remote แล้วครับ

แต่ๆๆ

ปัญหาคือ มันก็จะเอา ข้อมูลใน folder ของเรา โยนไปที่ docker อีกฝั่ง แล้วทำการ build ที่ฝั่งโน้น

และการนำเอาข้อมูลของเรา ข้ามไป ก็ใช้เพียง connection เดียว

ทำให้การ build แอบช้าอยู่พอสมควร

2. ใช้ build -> save -> load

จากสมมติฐานว่าการ build ที่ต่างเครื่องช้า เราก็เลยเปลี่ยนแผนเป็น build ในเครื่องตัวเองนี่แหละ แล้วค่อยส่งไป

ขั้นตอนคือ เราสั่ง build image ให้เรียบร้อย จากนั้นก็ save image มาเป็น archive ไว้ จากนั้นก็เปลี่ยน context แล้วก็ load image กลับมา มันก็จะไปที่ docker อีกฝั่งแล้ว

docker build -f Dockerfile -t image_name .
docker save image_name -o image.save
docker context use remote
docker load -i image.save
docker context use default

จากตรงนี้ผลที่ได้ ก็รู้สึกว่า มันก็ build เร็วขึ้นหน่อย

แต่ปัญหาก็ยังมีอยู่ตอน load image กลับ ซึ่งมันค่อนข้างที่จะช้าเหมือนเดิม

ข้อได้เปรียบของการใช้ repo คือ ในระหว่างที่มันจะ push/pull ขึ้น repository นั้น มันสามารถที่จะเพิ่มการเชื่อมต่อแล้วแบ่งไฟล์ออกเป็นส่วนๆ เพื่อทำการ upload / download คู่ขนาดกัน ทำให้ความเร็วในการส่งข้อมูล มากกว่าปกติ ​ซึ่งตรงนี้ยังไม่มีใน ท่าที่ใช้ context

ดังนั้นเลยคิดว่า ถ้า source มีขนาดค่อนข้างใหญ่ การย้ายไป remote ใช้ repository ก็น่าจะเร็วกว่า ส่วนกระบวนการ setup ที่ฝั่ง remote ก็ยังคงใช้ Automate CI/CD ทดแทนได้

แต่ถ้า source มีขนาดเล็ก ท่าของ context ก็มีความน่าสนใจทีเดียว

นอกจากนี้ context ยังสามารถใช้ในการควบคุม docker container ได้ ซึ่งก็น่าจะมีประโยชน์อะไรมากมายจากตรงนั้นมากกว่า การส่ง image ไปมา

--

--

Teerayut Hiruntaraporn
Teerayut Hiruntaraporn

No responses yet