ມາ Limit resources ໃນ docker ກ່ອນຈະຊ້າເກີນໄປ

xangnam phiasakha
VtCamp
Published in
2 min readOct 17, 2018

ສະບາຍດີຜູ້ໃຊ້ Docker ທຸກຄົນ. ວັນນີ້ຈະມາຂຽນບົດຄວາມໃນການຈັດການ resources ໃນ docker container ເຊິ່ງກ່ອນຈະເຂົ້າເລື່ອງຈະມາເລົ່າປະສົບການທີ່ເຈີມາໂດຍເລື່ອງມັນມີຢູ່ວ່າ
ຜູ້ຂຽນໄດ້ເຊົ່າ cloud ມາ VM ໜຶ່ງ ແລະ ກໍ່ deploy wordpress container ສອງ container ພ້ອມທັງ nginx-proxy ເອົາໄວ້ເຮັດ revert proxy ໃຫ້ກັບ wordpress ແລະ ຈັດເຕົມດ້ວຍ docker-letsencrypt-nginx-proxy-companion ເອົາໄວ້ເຮັດໃຫ້ເວັບເຮົາເຂົ້າຜ່ານ https ເບິ່ງແລ້ວສວຍງາມໜ້າເຊື່ອຖື. ແລະ ກໍ່ແນ່ນອນເມື່ອໃຊ້ wordpess ກໍ່ຕ້ອງມີ mysql database ເຊິ່ງຜູ້ຂຽນໃຊ້ mariadb.

deployment wordpress ຂອງຜູ້ຂຽນ

ຮູບປະກອບທາງເທິງສະແດງໃຫ້ເຫັນວ່າຜູ້ຂຽນ deploy 5 container ຢູ່ໃນ vm ເຄື່ອງດຽວທີ່ມີ spec ລາຄາຕຳ 1 vCPU, 1024 MB memory ເຊິ່ງບັນຫາມັນມີຢູ່ວ່າພໍ run ໃຊ້ງານໄປໄລຍະໜຶ່ງ wordpress ກັບ down ບອກວ່າບໍ່ສາມາດ connect ກັບ mysql ໄດ້!! ເຂົາໄປເບິ່ງ VM container mysql ກໍ່ start ປົກກະຕິບໍ່ໄດ້ down ແຕ່ພໍເບິ່ງ logs ກໍ່ແຈບເລີຍ!! Memory ບໍ່ພໍເຮັດໃຫ້ linux kill process ຂອງ docker deamon ສ້າງຂື້ນເພື່ອໃຊ້ເຊື່ອມລະຫວ່າງ wordpress container ແລະ mysql container ພໍເຈີບັນຫານີ້ກໍ່ຄິດວ່າຈະຕ້ອງ up RAM ຂື້ນແລ້ວແຕ່ຄິດໄປຄິດມາດຽວກ່ອນ!! VM ເຮົາສາມາດ deploy ໄດ້ເຕົມທີ 2 web ເທົ່ານີ້ຫວາ!!!?? ແບບນີ້ໄປເຊົ່າ hosting ຍັງດີກວ່າ!! ຫຼັງຈາກນັ້ນກໍ່ຄິດລະນຶກຊາດແຕ່ກ່ອນເຄີຍອ່ານກ່ຽວກັບການ limit resources ໃນ Contianer ພໍກັບໄປອ່ານຄືນມັນກໍ່ເປະເລີຍ!! .

ເປັນຫຍັງຕ້ອງ limit resources container ?.

ໂດຍທົ່ວໄປເມື່ອເຮົາ run docker container ຂື້ນມາໂດຍບໍ່ມີກຳນົດ resources ຫຍັງຈະເຮັດໃຫ້ container ນັ້ນສາມາດ access ເຂົ້າໄປໃນ memory ໄດ້ເຕົມພື້ນທີ່ເຊິ່ງມັນກໍ່ບໍ່ມີບັນຫາຫຍັງຖ້າ run contianer 1–2 contianer ແຕ່ມັນຈະມີບັນຫາເມື່ອງເຮົາ run ຫຼາຍໆ contianer ແລະ ແຕ່ຫລ່ະ contianer ມີການ Link ຫາກັນເພາະມັນຈະເຮັດໃຫ້ເກີດ OOM (Out Of Memory) ເນື່ອງຈາກການທີ່ contianer ໃດໜຶ່ງໃຊ້ memory ໝົດເຮັດໃຫ້ kernel ຂອງ linux kill process ນັ້ນເພື່ອເຮັດໃຫ້ລະບົບສາມາດເຮັດວຽກຕໍ່ໄປໄດ້ມັນສົ່ງຜົນເຮັດໃຫ້ contianer ເກີດ exception ຂື້ນເມື່ອເປັນດັ່ງນັ້ນກໍ່ສົ່ງຜົນໃຫ້ contianer ທີ່ link ກັນຢູ່ນັ້ນບໍ່ສາມາດໃຊ້ວຽກໄດ້!!!.

ມາ limit resources ໃນ contianer ກັນເຖາະ!!!

ກ່ອນຈະ docker run contianer ໃດຂື້ນມາໃນລະດັບ production ນັ້ນຄວນຕ້ອງກຳນົດ memory ແລະ cpu ທີ່ໃຫ້ contianer ນັ້ນໃຊ້ງານບອກໃຫ້ contianer ນັ້ນຮູ້ໄປເລີຍວ່າຕ້ອງເຮັດວຽກສະເພາະພື້ນທີ່ກຳນົດໃຫ້ບໍ່ໃຫ້ໄປຫຍຸ້ງວຸ້ນວາຍກັບພື້ນທີ່ອື່ນໃນ memory!! ໃນການກຳນົດກໍ່ແສນຈະງ່າຍດາຍ

limit memory ໃຫ້ກັບ contianer

$ docker run --name example --memory=300m nginx-proxy

ຄຳສັ່ງຂ້າງເທິງເປັນການກຳນົດໃຫ້ contianer nginx-proxy ໃຊ້ memory 300 MB ບໍ່ໃຫ້ໃຊ້ເກີນນີ້!! ດວ້ຍ flag — memory

limit cpu ໃຫ້ກັບ contianer

$ docker run --name example --cpus=0.5 nginx-proxy

ສັ່ງໃຫ້ contianer ໃຊ້ງານ cpu ໄດ້ພຽງ 50% ຂອງ CPU ທັງໝົດຂອງເຄື່ອງ

ເບິ່ງສະຖານະການໃຊ້ງານ resources ຂອງ contianer

docker stats -a

[Note] ແຕ່ຖ້າເກີດ warning message: WARNING: Your kernel does not support swap limit capabilities. Limitation discarded. ໃຫ້ໄປແກ້ໄຂ file /etc/default/grub ເພີ່ມ ຫຼື ແກ້ໄຂຄ່າ GRUB_CMDLINE_LINUX

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

Update GRUB.

$ sudo update-grub

ດ້ວຍຄຳສັ່ງງ່າຍໆເທົ່ານີ້ກໍ່ເຮັດໃຫ້ limit resources ໃຫ້ contianer ໄດ້ແລ້ວນອກນີ້ແລ້ວກໍ່ຍັງມີ option ຫຼາຍຢ່າງໃຫ້ເລືອກໃຊ້ຂື້ນກັບຄວາມຕ້ອງການ ສາມາດເບິ່ງລາຍລະອຽດເພີ່ມຕື່ມໄດ້ທີ່
Limit a container’s resources

ຂໍ້ຈົບບົດຄວາມພຽງເທົ່ານີ້ ແລ້ວ ເຈີກັນໃນບົດຄວາມຕໍ່ໄປ!!! Happy Docker!!!

--

--