Docker เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡

TL;DR: เบ„เบนเปˆเบกเบทเบžเบฒเบšเบฅเบงเบกเปƒเบ™เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบ™เบ–เบฑเบ‡. เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ Docker เปเบฅเบฐเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบญเบทเปˆเบ™เป†เบˆเบฐเบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ.

Docker เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡

เบ›เบฐเบซเบงเบฑเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบฒเบˆเบฒเบ

เป€เบฅเบทเปˆเบญเบ‡

เบงเบดเบ—เบตเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบเบฑเบ™เบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบกเปˆเบ™ chroot. เบเบฒเบ™เป€เบญเบตเป‰เบ™เบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบฎเบฒเบเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ - เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบžเบฝเบ‡เปเบ•เปˆเป„เบŸเบฅเปŒเบžเบฒเบเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ™เบฑเป‰เบ™. เปเบ•เปˆเบ–เป‰เบฒเป‚เบ„เบ‡เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเบดเบ”เบ—เบดเบฎเบฒเบเบžเบฒเบเปƒเบ™, เบกเบฑเบ™เบชเบฒเบกเบฒเบ” "เบซเบ™เบต" chroot เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบฎเบฒเบ, เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบทเปˆเบ™เป† (RAM, เป‚เบ›เป€เบŠเบ”เป€เบŠเบต), เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเบเบฑเบ”.

เบงเบดเบ—เบตเบเบฒเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เปเบฅเปˆเบ™เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบขเปˆเบฒเบ‡เบ„เบปเบšเบ–เป‰เบงเบ™เบžเบฒเบเปƒเบ™เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เป‚เบ”เบเปƒเบŠเป‰เบเบปเบ™เป„เบเป€เบ„เบตเป€เบ™เบฅเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™. เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบกเบตเบŠเบทเปˆเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบ•เปˆเบชเบฒเบฅเบฐเบชเบณเบ„เบฑเบ™เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™: เบเบฒเบ™เปเบฅเปˆเบ™เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบซเบผเบฒเบเบฅเบฐเบšเบปเบš, เปเบ•เปˆเบฅเบฐเบฅเบฐเบšเบปเบšเปƒเบŠเป‰เป€เบ„เบตเป€เบ™เบฅเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบซเบผเบฑเบ. เบ™เบตเป‰เบฅเบงเบกเบกเบต FreeBSD Jails, Solaris Zones, OpenVZ, เปเบฅเบฐ LXC เบชเบณเบฅเบฑเบš Linuxเบเบฒเบ™เปเบเบเบญเบญเบเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบ–เบทเบเบชเบฐเปœเบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบ”เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบ•เปˆเบเบฑเบ‡เบชเบฐเปœเบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบทเปˆเบ™เป†; เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เปเบ•เปˆเบฅเบฐ container เบชเบฒเบกเบฒเบ”เบกเบตเบ‚เปเป‰เบˆเบณเบเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบงเบฅเบฒ CPU, RAM, เปเบฅเบฐเปเบšเบ™เบงเบดเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบš chroot, เบเบฒเบ™เบญเบญเบเบˆเบฒเบ container เปเบกเปˆเบ™เบเบฒเบเบเบงเปˆเบฒ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ superuser เปƒเบ™ container เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบžเบฒเบเปƒเบ™เบ‚เบญเบ‡ container เป„เบ”เป‰เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบžเบฒเบเปƒเบ™ container เปƒเบซเป‰เบ—เบฑเบ™เบชเบฐเป„เป เปเบฅเบฐ เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ kernel เบฅเบธเป‰เบ™เป€เบเบปเปˆเบฒ (เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš Linux, เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเปœเป‰เบญเบเบเบงเปˆเบฒ FreeBSD) เบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™เบ—เบตเปˆเบˆเบฐ "เบ—เบฐเบฅเบธ" เบฅเบฐเบšเบปเบšเปเบเบ kernel เปเบฅเบฐ เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบซเบผเบฑเบเป„เบ”เป‰.

เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบšเปƒเบ™เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต (เบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบŠเบธเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป†), เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป„เบ”เป‰เบ—เบฑเบ™เบ—เบต, เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปเบกเปˆเบ™เปƒเบซเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเป‚เบญเบเบฒเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (เบกเบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™. เปเบฅเบฐเป„เบŸเบฅเปŒเบญเบทเปˆเบ™เป†). เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ virtualization เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบšเบฑเบ™เบˆเบธเบšเบฑเบ™เบˆเบธ, เบ•เบปเบงเปเบ—เบ™เบ—เบตเปˆเป‚เบ”เบ”เป€เบ”เบฑเปˆเบ™เปเบฅเบฐเป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡ Docker. เป€เบกเบทเปˆเบญเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบเบปเบ™เป„เบเบเบฒเบ™เป‚เบ”เบ”เบ”เปˆเบฝเบงเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบซเบผเบฒเบ, เบšเบงเบเปƒเบชเปˆเบเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปƒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ virtual เบฅเบฐเบซเบงเปˆเบฒเบ‡ containers เปเบฅเบฐเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบชเบฐเบ–เบฒเบ™เบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบžเบฒเบเปƒเบ™ container, เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบ™เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™ container - เป‚เบ”เบเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ„เบนเปˆเบกเบท.

Docker

Docker เป€เบ›เบฑเบ™เบŠเบญเบšเปเบงเบšเบฑเบ™เบˆเบธเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบ—เบตเปˆเบชเบธเบ”. เบกเบฑเบ™เบ–เบทเบเบ‚เบฝเบ™เบ”เป‰เบงเบเบžเบฒเบชเบฒ Go เปเบฅเบฐเบ™เบณเปƒเบŠเป‰เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ kernel เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡. Linux โ€” เบเบธเปˆเบก c, เป€เบ™เบกเบชเบฐเป€เบ›เบช, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป†, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒ Aufs เปเบฅเบฐเบฅเบฐเบšเบปเบšเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบซเบเบฑเบ”เบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบ”.

Docker เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡
เบ—เบตเปˆเบกเบฒ: wikimedia

เบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ

เบเปˆเบญเบ™เป€เบงเบตเบŠเบฑเบ™ 1.11, Docker เบ”เบณเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบšเปเบฅเบดเบเบฒเบ™เบ”เบฝเบงเบ—เบตเปˆเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ”เบณเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡ container เบ—เบฑเบ‡เปเบปเบ”เบ„เบท: เบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ”เบฎเบนเบšเบžเบฒเบš container, เบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰ container, เปเบฅเบฐ เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบณเบฎเป‰เบญเบ‡เบ‚เป API. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเป€เบงเบตเบŠเบฑเบ™ 1.11, Docker เป„เบ”เป‰เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบซเบผเบฒเบเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบ™เบ„เบท: containerd, เป€เบŠเบดเปˆเบ‡เบˆเบฑเบ”เบเบฒเบ™เบงเบปเบ‡เบˆเบญเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡ container เบ—เบฑเบ‡เปเบปเบ” (เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เปเบœเปˆเบ™เบ”เบดเบ”, เบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ”เบฎเบนเบšเบžเบฒเบš, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰, เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เปเบฅเบฐ เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบชเบฐเบ–เบฒเบ™เบฐ container), เปเบฅเบฐ runC, เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก runtime container เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆ cgroups เปเบฅเบฐ เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” kernel เบญเบทเปˆเบ™เป†. Linuxเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ Docker เป€เบญเบ‡เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ, เปเบ•เปˆเบ”เบฝเบงเบ™เบตเป‰เบกเบฑเบ™เป€เบฎเบฑเบ”เปœเป‰เบฒเบ—เบตเปˆเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เบณเบฎเป‰เบญเบ‡เบ‚เป API เบ—เบตเปˆเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ containerd เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™.

Docker เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

เบงเบดเบ—เบตเบ—เบตเปˆเบ‚เป‰เบญเบเบกเบฑเบเปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ docker เปเบกเปˆเบ™ docker-machine, เป€เบŠเบดเปˆเบ‡เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒ docker เป‚เบ”เบเบเบปเบ‡เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ (เบฅเบงเบกเบ—เบฑเบ‡ clouds เบ•เปˆเบฒเบ‡เป†), เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเปเบฅเบฐเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปˆเบฒเบ‡เป†.

เป€เบ–เบดเบ‡เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ›เบต 2018 เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ—เบทเปˆเบญ, เบชเบฐเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบชเบณเบฅเบฑเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบเบชเปˆเบงเบ™เปƒเบซเบเปˆ. Linux เบงเบดเบ—เบตเบเบฒเบ™ - เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐ เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบžเบฑเบเป€เบเบ”เบ—เบตเปˆเบˆเบณเป€เบ›เบฑเบ™.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบšเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”, เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰ Ansible เบซเบผเบทเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบญเบทเปˆเบ™เป†, เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบงเบฑเบ™เบ—เบต Centos 7, เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡ virtual เป€เบ›เบฑเบ™เป€เบŠเบตเบšเป€เบงเบต, เบชเบณเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ„เบณเบชเบฑเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce docker-ce-cli containerd.io

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

# systemctl enable docker
# systemctl start docker
# firewall-cmd --zone=public --add-port=2377/tcp --permanent

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบเบธเปˆเบก docker, เป€เบŠเบดเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš docker เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ sudo, เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบ, เป€เบ›เบตเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ API เบˆเบฒเบเบžเบฒเบเบ™เบญเบ, เปเบฅเบฐเบขเปˆเบฒเบฅเบทเบก configure firewall เบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ (เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”. เบ–เบทเบเบซเป‰เบฒเบกเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบฅเบฐเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰ - เบ‚เป‰เบญเบเป„เบ”เป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ™เบตเป‰เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™), เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบตเปˆเบ™เบตเป‰.

เบฅเบฑเบเบชเบฐเบ™เบฐเบญเบทเปˆเบ™เป†

เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡ docker เบ—เบตเปˆเบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบเบฑเบ‡เบกเบต docker registry, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฎเบนเบšเบžเบฒเบšเบชเปเบฒเบฅเบฑเบš containers, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš docker compose, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ containers, เป„เบŸเบฅเปŒ YAML เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เปเบฅเบฐ configure containers. เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบญเบทเปˆเบ™เป† (เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเบ„เบปเบ‡เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™).

เบกเบฑเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบฅเปเบฒเบฅเบฝเบ‡เบชเปเบฒเบฅเบฑเบš CICD. เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ”เบเบธเปˆเบก, เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเป‚เบซเบกเบ” swarm (เบเปˆเบญเบ™เบฎเบธเปˆเบ™ 1.12 เบกเบฑเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ docker swarm), เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบเบญเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ”เบฝเบงเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™เบšเบฑเบ™เบˆเบธ. เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ virtual เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”, เบกเบตเบ•เบปเบงเบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ•เบปเบง, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบงเบฒเบกเบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบˆเบธ.

เป„เบŸเบฅเปŒ YAML เบˆเบฒเบ docker compose, เบกเบตเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เปเบšเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบเบฒเบ™เบšเปเบฒเบฅเบธเบ‡เบฎเบฑเบเบชเบฒเบเบธเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เปˆเบฒเบ‡เป†. เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, Kubernetes เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเป€เบžเบฒเบฐเบงเปˆเบฒเบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปƒเบ™เบเบฒเบ™เบšเปเบฒเบฅเบธเบ‡เบฎเบฑเบเบชเบฒเบ‚เบญเบ‡เบฎเบนเบšเปเบšเบš swarm เบชเบฒเบกเบฒเบ”เป€เบเบตเบ™ Kubernetes. เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบ runC, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ›เบฑเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฒเบŠเบฐเบ™เบฐ เบ•เบนเป‰เบšเบฑเบ™เบˆเบธ Kata

เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Docker

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบเบญเบšเบเบธเปˆเบกเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ GitLab เปเบฅเบฐ Docker Registry เบชเปเบฒเบฅเบฑเบšเบ—เบตเบกเบ‡เบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰เบชเบฒเบกเป€เบ„เบทเปˆเบญเบ‡ virtual เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เป€เบŠเบดเปˆเบ‡เบ‚เป‰เบญเบเบเบฑเบ‡เบˆเบฐเปƒเบŠเป‰ FS GlusterFS เบ—เบตเปˆเบ–เบทเบเปเบˆเบเบขเบฒเบ, เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบŠเบต docker เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบญเบปเบ‡เบ›เบฐเบเบญเบšเบซเบผเบฑเบเบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™: Docker Registry, Postgresql, Redis, GitLab เบ”เป‰เบงเบเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบš GitLab Runner เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ Swarm. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบง Postgresql เบเบฑเบšเบเบธเปˆเบก เบชเบฐเป‚เบ•เบฅเบญเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ GlusterFS เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™ Postgresql. เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ GlusterFS.

เป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰ GlusterFS เปƒเบ™เบ—เบธเบเป€เบŠเบตเบšเป€เบงเบต (เบžเบงเบเบกเบฑเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒ node1, node2, node3), เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบžเบฑเบเป€เบเบฑเบ”, เป€เบ›เบตเบ”เป„เบŸเบงเป, เปเบฅเบฐเบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™:

# yum -y install centos-release-gluster7
# yum -y install glusterfs-server
# systemctl enable glusterd
# systemctl start glusterd
# firewall-cmd --add-service=glusterfs --permanent
# firewall-cmd --reload
# mkdir -p /srv/gluster
# mkdir -p /srv/docker
# echo "$(hostname):/docker /srv/docker glusterfs defaults,_netdev 0 0" >> /etc/fstab

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹, เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ GlusterFS เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบทเบšโ€‹เบ•เปเปˆโ€‹เบˆเบฒเบ node เบซเบ™เบถเปˆเบ‡โ€‹, เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเบปเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡ node1โ€‹:

# gluster peer probe node2
# gluster peer probe node3
# gluster volume create docker replica 3 node1:/srv/gluster node2:/srv/gluster node3:/srv/gluster force
# gluster volume start docker

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบฅเบดเบกเบฒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš (เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”):

# mount /srv/docker

เป‚เบซเบกเบ” swarm เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเบ™เบถเปˆเบ‡, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบ›เบฑเบ™เบœเบนเป‰เบ™เปเบฒ, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบˆเบฐเบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบเบธเปˆเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เปเบฒเบญเบดเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™.

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบเบธเปˆเบกโ€‹เป€เบšเบทเป‰เบญเบ‡โ€‹เบ•เบปเป‰เบ™โ€‹, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เปƒเบ™ node1โ€‹:

# docker swarm init
Swarm initialized: current node (a5jpfrh5uvo7svzz1ajduokyq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0c5mf7mvzc7o7vjk0wngno2dy70xs95tovfxbv4tqt9280toku-863hyosdlzvd76trfptd4xnzd xx.xx.xx.xx:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker swarm join-token manager

เบžเบงเบเป€เบฎเบปเบฒเบ„เบฑเบ”เบฅเบญเบเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเบชเบญเบ‡เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ node2 เปเบฅเบฐ node3:

# docker swarm join --token SWMTKN-x-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx xx.xx.xx.xx:2377
This node joined a swarm as a manager.

เปƒเบ™เบˆเบธเบ”เบ™เบตเป‰, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบกเปˆเบ™เบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™;

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ เบชเบณ เบฅเบฑเบšเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต:

# docker network create --driver=overlay etcd
# docker network create --driver=overlay pgsql
# docker network create --driver=overlay redis
# docker network create --driver=overlay traefik
# docker network create --driver=overlay gitlab

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบซเบกเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบœเบนเบเบกเบฑเบ”เบšเบฒเบ‡เบšเปเบฅเบดเบเบฒเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ:

# docker node update --label-add nodename=node1 node1
# docker node update --label-add nodename=node2 node2
# docker node update --label-add nodename=node3 node3

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™ etcd, เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ KV, เป€เบŠเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบš Traefik เปเบฅเบฐ Stolon. เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš Postgresql, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบšเบฑเบ™เบˆเบธเบ—เบตเปˆเบ•เบดเบ”เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”:

# mkdir -p /srv/etcd

เบ•เปเปˆเป„เบ›, เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเป€เบžเบทเปˆเบญ configure etcd เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™:

00etcd.yml

version: '3.7'

services:
  etcd1:
    image: quay.io/coreos/etcd:latest
    hostname: etcd1
    command:
      - etcd
      - --name=etcd1
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd1:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd1:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd1vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  etcd2:
    image: quay.io/coreos/etcd:latest
    hostname: etcd2
    command:
      - etcd
      - --name=etcd2
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd2:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd2:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd2vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  etcd3:
    image: quay.io/coreos/etcd:latest
    hostname: etcd3
    command:
      - etcd
      - --name=etcd3
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd3:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd3:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd3vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]

volumes:
  etcd1vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd2vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd3vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"

networks:
  etcd:
    external: true

# docker stack deploy --compose-file 00etcd.yml etcd

เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบธเปˆเบก etcd เปเบกเปˆเบ™เบ‚เบถเป‰เบ™:

# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl member list
ade526d28b1f92f7: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
bd388e7810915853: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=false
d282ac2ce600c1ce: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=true
# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl cluster-health
member ade526d28b1f92f7 is healthy: got healthy result from http://etcd1:2379
member bd388e7810915853 is healthy: got healthy result from http://etcd3:2379
member d282ac2ce600c1ce is healthy: got healthy result from http://etcd2:2379
cluster is healthy

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบชเปเบฒเบฅเบฑเบš Postgresql, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”:

# mkdir -p /srv/pgsql

เบ•เปเปˆเป„เบ›, เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ” Postgresql:

01pgsql.yml

version: '3.7'

services:
  pgsentinel:
    image: sorintlab/stolon:master-pg10
    command:
      - gosu
      - stolon
      - stolon-sentinel
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
      - --log-level=debug
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: pause
  pgkeeper1:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper1
    command:
      - gosu
      - stolon
      - stolon-keeper
      - --pg-listen-address=pgkeeper1
      - --pg-repl-username=replica
      - --uid=pgkeeper1
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper1:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  pgkeeper2:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper2
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper2
      - --pg-repl-username=replica
      - --uid=pgkeeper2
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper2:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  pgkeeper3:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper3
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper3
      - --pg-repl-username=replica
      - --uid=pgkeeper3
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper3:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]
  postgresql:
    image: sorintlab/stolon:master-pg10
    command: gosu stolon stolon-proxy --listen-address 0.0.0.0 --cluster-name stolon-cluster --store-backend=etcdv3 --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: rollback

volumes:
  pgkeeper1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper3:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"

secrets:
  pgsql:
    file: "/srv/docker/postgres"
  pgsql_repl:
    file: "/srv/docker/replica"

networks:
  etcd:
    external: true
  pgsql:
    external: true

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบฅเบฑเบšเปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เป„เบŸเบฅเปŒ:

# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/replica
# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/postgres
# docker stack deploy --compose-file 01pgsql.yml pgsql

เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡ (เป€เบšเบดเปˆเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ เบšเปเบฅเบดเบเบฒเบ™ docker lsเบงเปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™) เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบธเปˆเบก Postgresql:

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 init

เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เบเบธเปˆเบก Postgresql:

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 status
=== Active sentinels ===

ID      LEADER
26baa11d    false
74e98768    false
a8cb002b    true

=== Active proxies ===

ID
4d233826
9f562f3b
b0c79ff1

=== Keepers ===

UID     HEALTHY PG LISTENADDRESS    PG HEALTHY  PG WANTEDGENERATION PG CURRENTGENERATION
pgkeeper1   true    pgkeeper1:5432         true     2           2
pgkeeper2   true    pgkeeper2:5432          true            2                   2
pgkeeper3   true    pgkeeper3:5432          true            3                   3

=== Cluster Info ===

Master Keeper: pgkeeper3

===== Keepers/DB tree =====

pgkeeper3 (master)
โ”œโ”€pgkeeper2
โ””โ”€pgkeeper1

เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ traefik เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบตเบˆเบฒเบเบžเบฒเบเบ™เบญเบ:

03traefik.yml

version: '3.7'

services:
  traefik:
    image: traefik:latest
    command: >
      --log.level=INFO
      --providers.docker=true
      --entryPoints.web.address=:80
      --providers.providersThrottleDuration=2
      --providers.docker.watch=true
      --providers.docker.swarmMode=true
      --providers.docker.swarmModeRefreshSeconds=15s
      --providers.docker.exposedbydefault=false
      --accessLog.bufferingSize=0
      --api=true
      --api.dashboard=true
      --api.insecure=true
    networks:
      - traefik
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 3
      placement:
        constraints:
          - node.role == manager
        preferences:
          - spread: node.id
      labels:
        - traefik.enable=true
        - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
        - traefik.http.services.traefik.loadbalancer.server.port=8080
        - traefik.docker.network=traefik

networks:
  traefik:
    external: true

# docker stack deploy --compose-file 03traefik.yml traefik

เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบง Redis Cluster, เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบขเบนเปˆเปƒเบ™เบ—เบธเบ nodes:

# mkdir -p /srv/redis

05redis.yml

version: '3.7'

services:
  redis-master:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379:6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: global
      restart_policy:
        condition: any
    volumes:
      - 'redis:/opt/bitnami/redis/etc/'

  redis-replica:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_PASSWORD=xxxxxxxxxxx
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: replicated
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: any

  redis-sentinel:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '16379'
    depends_on:
      - redis-master
      - redis-replica
    entrypoint: |
      bash -c 'bash -s <<EOF
      "/bin/bash" -c "cat <<EOF > /opt/bitnami/redis/etc/sentinel.conf
      port 16379
      dir /tmp
      sentinel monitor master-node redis-master 6379 2
      sentinel down-after-milliseconds master-node 5000
      sentinel parallel-syncs master-node 1
      sentinel failover-timeout master-node 5000
      sentinel auth-pass master-node xxxxxxxxxxx
      sentinel announce-ip redis-sentinel
      sentinel announce-port 16379
      EOF"
      "/bin/bash" -c "redis-sentinel /opt/bitnami/redis/etc/sentinel.conf"
      EOF'
    deploy:
      mode: global
      restart_policy:
        condition: any

volumes:
  redis:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "/srv/redis"

networks:
  redis:
    external: true

# docker stack deploy --compose-file 05redis.yml redis

เป€เบžเบตเปˆเบก Docker Registry:

06registry.yml

version: '3.7'

services:
  registry:
    image: registry:2.6
    networks:
      - traefik
    volumes:
      - registry_data:/var/lib/registry
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure
      labels:
        - traefik.enable=true
        - traefik.http.routers.registry.rule=Host(`registry.example.com`)
        - traefik.http.services.registry.loadbalancer.server.port=5000
        - traefik.docker.network=traefik

volumes:
  registry_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/registry"

networks:
  traefik:
    external: true

# mkdir /srv/docker/registry
# docker stack deploy --compose-file 06registry.yml registry

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ - GitLab:

08gitlab-runner.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    networks:
      - pgsql
      - redis
      - traefik
      - gitlab
    ports:
      - 22222:22
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        postgresql['enable'] = false
        redis['enable'] = false
        gitlab_rails['registry_enabled'] = false
        gitlab_rails['db_username'] = "gitlab"
        gitlab_rails['db_password'] = "XXXXXXXXXXX"
        gitlab_rails['db_host'] = "postgresql"
        gitlab_rails['db_port'] = "5432"
        gitlab_rails['db_database'] = "gitlab"
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_encoding'] = 'utf8'
        gitlab_rails['redis_host'] = 'redis-master'
        gitlab_rails['redis_port'] = '6379'
        gitlab_rails['redis_password'] = 'xxxxxxxxxxx'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.yandex.ru"
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = "noreply@example.com"
        gitlab_rails['smtp_password'] = "xxxxxxxxx"
        gitlab_rails['smtp_domain'] = "example.com"
        gitlab_rails['gitlab_email_from'] = 'noreply@example.com'
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_tls'] = true
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        external_url 'http://gitlab.example.com/'
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    volumes:
      - gitlab_conf:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager
      labels:
        - traefik.enable=true
        - traefik.http.routers.gitlab.rule=Host(`gitlab.example.com`)
        - traefik.http.services.gitlab.loadbalancer.server.port=80
        - traefik.docker.network=traefik
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    networks:
      - gitlab
    volumes:
      - gitlab_runner_conf:/etc/gitlab
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager

volumes:
  gitlab_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/conf"
  gitlab_logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/logs"
  gitlab_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/data"
  gitlab_runner_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/runner"

networks:
  pgsql:
    external: true
  redis:
    external: true
  traefik:
    external: true
  gitlab:
    external: true

# mkdir -p /srv/docker/gitlab/conf
# mkdir -p /srv/docker/gitlab/logs
# mkdir -p /srv/docker/gitlab/data
# mkdir -p /srv/docker/gitlab/runner
# docker stack deploy --compose-file 08gitlab-runner.yml gitlab

เบชเบฐเบ–เบฒเบ™เบฐเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบธเปˆเบก เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™:

# docker service ls
ID                  NAME                   MODE                REPLICAS            IMAGE                          PORTS
lef9n3m92buq        etcd_etcd1             replicated          1/1                 quay.io/coreos/etcd:latest
ij6uyyo792x5        etcd_etcd2             replicated          1/1                 quay.io/coreos/etcd:latest
fqttqpjgp6pp        etcd_etcd3             replicated          1/1                 quay.io/coreos/etcd:latest
hq5iyga28w33        gitlab_gitlab          replicated          1/1                 gitlab/gitlab-ce:latest        *:22222->22/tcp
dt7s6vs0q4qc        gitlab_gitlab-runner   replicated          1/1                 gitlab/gitlab-runner:latest
k7uoezno0h9n        pgsql_pgkeeper1        replicated          1/1                 sorintlab/stolon:master-pg10
cnrwul4r4nse        pgsql_pgkeeper2        replicated          1/1                 sorintlab/stolon:master-pg10
frflfnpty7tr        pgsql_pgkeeper3        replicated          1/1                 sorintlab/stolon:master-pg10
x7pqqchi52kq        pgsql_pgsentinel       replicated          3/3                 sorintlab/stolon:master-pg10
mwu2wl8fti4r        pgsql_postgresql       replicated          3/3                 sorintlab/stolon:master-pg10
9hkbe2vksbzb        redis_redis-master     global              3/3                 bitnami/redis:latest           *:6379->6379/tcp
l88zn8cla7dc        redis_redis-replica    replicated          3/3                 bitnami/redis:latest           *:30003->6379/tcp
1utp309xfmsy        redis_redis-sentinel   global              3/3                 bitnami/redis:latest           *:30002->16379/tcp
oteb824ylhyp        registry_registry      replicated          1/1                 registry:2.6
qovrah8nzzu8        traefik_traefik        replicated          3/3                 traefik:latest                 *:80->80/tcp, *:443->443/tcp

เปเบกเปˆเบ™เบซเบเบฑเบ‡เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เป„เบ”เป‰? เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒ Traefik เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบˆเบธเบœเปˆเบฒเบ™ https, เป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” tls เบชเปเบฒเบฅเบฑเบš Postgresql เปเบฅเบฐ Redis. เปเบ•เปˆเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบกเบญเบšเปƒเบซเป‰เบเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ›เบฑเบ™ PoC. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เบ‚เบญเบ‡ Docker.

podman

เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบเบฑเบ™เบ”เบตเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เบชเบณเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™เบžเบฒเบŠเบฐเบ™เบฐเบ—เบตเปˆเบˆเบฑเบ”เป€เบ›เบฑเบ™เบเบธเปˆเบกเป‚เบ”เบเบเบฑเบ (เบเบฑเบ, เบเบธเปˆเบกเบšเบฑเบ™เบˆเบธเบšเบฑเบ™เบˆเบธเบ—เบตเปˆเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™). เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš Docker, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบˆเบธ; เบเบฑเบ‡เบ‚เบฝเบ™เปƒเบ™ Go, เบ•เป‰เบญเบ‡เบเบฒเบ™ runtime เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰ OCI เป€เบžเบทเปˆเบญเปเบฅเปˆเบ™ containers, เป€เบŠเบฑเปˆเบ™ runC.

Docker เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡

เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Podman เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเปเบกเปˆเบ™ reminiscent เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบš Docker, เป€เบ–เบดเบ‡เบˆเบธเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰ (เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเป‚เบ”เบเบซเบผเบฒเบเบ„เบปเบ™เบ—เบตเปˆเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบกเบฑเบ™, เบฅเบงเบกเบ—เบฑเบ‡เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰):

$ alias docker=podman

เปเบฅเบฐเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเบšเบ•เปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบเบฑเบš Podman เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบ–เป‰เบฒ Kubernetes เบฎเบธเปˆเบ™เบ•เบปเป‰เบ™เป†เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Docker, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เบฐเบกเบฒเบ™ 2015, เบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡เป‚เบฅเบเบ‚เบญเบ‡ containers (OCI - Open Container Initiative) เปเบฅเบฐเบเบฒเบ™เปเบšเปˆเบ‡ Docker เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ containerd เปเบฅเบฐ runC, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบš Docker เบชเปเบฒเบฅเบฑเบšเปเบฅเปˆเบ™เปƒเบ™ Kubernetes เป„เบ”เป‰เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ: CRI-O. Podman เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ‚เบญเบ‡ Docker, เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡ Kubernetes, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบˆเบฑเบ”เบเบธเปˆเบก containers, เปเบ•เปˆเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เบ•เบปเบง Docker เปเบšเบš containers เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, เบšเปเปˆเบกเบตเบฎเบนเบšเปเบšเบš swarm, เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบงเบปเป‰เบฒเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบธเปˆเบก, เป€เบญเบปเบฒ Kubernetes.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

เบชเบณเบฅเบฑเบšเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ™ Centos 7, เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™ Extras repository เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰เบ„เบณเบชเบฑเปˆเบ‡:

# yum -y install podman

เบฅเบฑเบเบชเบฐเบ™เบฐเบญเบทเปˆเบ™เป†

Podman เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบš systemd, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ containers เบซเบผเบฑเบ‡เบˆเบฒเบ server reboot. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, systemd เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบเบฒเบ”เบงเปˆเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™ pid 1 เปƒเบ™เบ–เบฑเบ‡. เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบท buildah เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เบเบฑเบ‡เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบก - analogues เบ‚เบญเบ‡ docker-compose, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบš Kubernetes, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบˆเบฒเบ Podman เป„เบ› Kubernetes เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Podman

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบšเปเปˆเบกเบตเบฎเบนเบšเปเบšเบš swarm (เบžเบงเบเป€เบฎเบปเบฒเบ„เบงเบ™เบˆเบฐเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ Kubernetes เบ–เป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบธเปˆเบก), เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบเบฑเบšเบกเบฑเบ™เป„เบงเป‰เปƒเบ™เบ–เบฑเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ.

เบ•เบดเบ”เบ•เบฑเป‰เบ‡ podman-compose:

# yum -y install python3-pip
# pip3 install podman-compose

เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเปเบฒเบฅเบฑเบš podman เปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเป‰เบฒเบเบžเบฒเบเบชเปˆเบงเบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™.

gitlab-podman.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab.example.com
    restart: unless-stopped
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    ports:
      - "80:80"
      - "22222:22"
    volumes:
      - /srv/podman/gitlab/conf:/etc/gitlab
      - /srv/podman/gitlab/data:/var/opt/gitlab
      - /srv/podman/gitlab/logs:/var/log/gitlab
    networks:
      - gitlab

  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    restart: unless-stopped
    depends_on:
      - gitlab
    volumes:
      - /srv/podman/gitlab/runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - gitlab

networks:
  gitlab:

# podman-compose -f gitlab-runner.yml -d up

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

# podman ps
CONTAINER ID  IMAGE                                  COMMAND               CREATED             STATUS                 PORTS                                      NAMES
da53da946c01  docker.io/gitlab/gitlab-runner:alpine  run --user=gitlab...  About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab-runner_1
781c0103c94a  docker.io/gitlab/gitlab-ce:latest      /assets/wrapper       About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab_1

เบกเบฒเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบชเป‰เบฒเบ‡เบชเปเบฒเบฅเบฑเบš systemd เปเบฅเบฐ kubernetes, เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบŠเบทเปˆเบซเบผเบท id เบ‚เบญเบ‡ pod เป„เบ”เป‰:

# podman pod ls
POD ID         NAME   STATUS    CREATED          # OF CONTAINERS   INFRA ID
71fc2b2a5c63   root   Running   11 minutes ago   3                 db40ab8bf84b

Kubernetes:

# podman generate kube 71fc2b2a5c63
# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.6.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-07-29T19:22:40Z"
  labels:
    app: root
  name: root
spec:
  containers:
  - command:
    - /assets/wrapper
    env:
    - name: PATH
      value: /opt/gitlab/embedded/bin:/opt/gitlab/bin:/assets:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
      value: gitlab.example.com
    - name: container
      value: podman
    - name: GITLAB_OMNIBUS_CONFIG
      value: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    - name: LANG
      value: C.UTF-8
    image: docker.io/gitlab/gitlab-ce:latest
    name: rootgitlab1
    ports:
    - containerPort: 22
      hostPort: 22222
      protocol: TCP
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /var/opt/gitlab
      name: srv-podman-gitlab-data
    - mountPath: /var/log/gitlab
      name: srv-podman-gitlab-logs
    - mountPath: /etc/gitlab
      name: srv-podman-gitlab-conf
    workingDir: /
  - command:
    - run
    - --user=gitlab-runner
    - --working-directory=/home/gitlab-runner
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: podman
    image: docker.io/gitlab/gitlab-runner:alpine
    name: rootgitlab-runner1
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /etc/gitlab-runner
      name: srv-podman-gitlab-runner
    - mountPath: /var/run/docker.sock
      name: var-run-docker.sock
    workingDir: /
  volumes:
  - hostPath:
      path: /srv/podman/gitlab/runner
      type: Directory
    name: srv-podman-gitlab-runner
  - hostPath:
      path: /var/run/docker.sock
      type: File
    name: var-run-docker.sock
  - hostPath:
      path: /srv/podman/gitlab/data
      type: Directory
    name: srv-podman-gitlab-data
  - hostPath:
      path: /srv/podman/gitlab/logs
      type: Directory
    name: srv-podman-gitlab-logs
  - hostPath:
      path: /srv/podman/gitlab/conf
      type: Directory
    name: srv-podman-gitlab-conf
status: {}

เบฅเบฐเบšเบปเบš:

# podman generate systemd 71fc2b2a5c63
# pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
Documentation=man:podman-generate-systemd(1)
Requires=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Before=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
ExecStop=/usr/bin/podman stop -t 10 db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
ExecStop=/usr/bin/podman stop -t 10 da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
ExecStop=/usr/bin/podman stop -t 10 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3/userdata/conmon.pid

[Install]
WantedBy=multi-user.target

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบชเปเบฒเบฅเบฑเบš systemd เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบญเบตเบ (เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เบเบฒเบ™เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบ–เบฑเบ‡เป€เบเบปเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡.

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, Podman เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบชเบดเปˆเบ‡เบ—เบตเปˆเบšเบฑเบ™เบˆเบธ, เป‚เบญเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบเบปเปˆเบฒเบชเปเบฒเบฅเบฑเบš docker-compose, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเป‰เบฒเบเป„เบ› Kubernetes, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ cluster, เบซเบผเบทเป„เบ”เป‰เบฎเบฑเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เปƒเบŠเป‰ Docker.

rkt

เป‚เบ„เบ‡เบเบฒเบ™ เป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ เบ›เบฐเบกเบฒเบ™เบซเบปเบเป€เบ”เบทเบญเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ RedHat เบŠเบทเป‰เบกเบฑเบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบขเบนเปˆเบเบฑเบšเบกเบฑเบ™เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เป‚เบ”เบเบฅเบงเบกเปเบฅเป‰เบง, เบกเบฑเบ™เป„เบ”เป‰เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบ›เบฐเบ—เบฑเบšเปƒเบˆเบ—เบตเปˆเบ”เบต, เปเบ•เปˆเป€เบกเบทเปˆเบญเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบš Docker เปเบฅเบฐเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ Podman, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบงเบกเบเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบเบฒเบ™เปเบˆเบเบขเบฒเบ CoreOS เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ rkt (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบกเบต Docker), เปเบ•เปˆเบ™เบตเป‰เบเบฑเบ‡เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เปƒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบŠเบทเป‰ RedHat.

เบžเบฅเบฒเบช

เบญเปˆเบฒเบ™เบ•เปเปˆ เป‚เบ„เบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡, เบœเบนเป‰เบ‚เบฝเบ™เบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบˆเบธ. เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เป‚เบ”เบเป€เบญเบเบฐเบชเบฒเบ™เปเบฅเบฐเบฅเบฐเบซเบฑเบ”, เบœเบนเป‰เบ‚เบฝเบ™เบšเปเปˆเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบฅเบฒเบงเป€เบฎเบฑเบ”.

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบเบฑเบš Kubernetes เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบ: เปƒเบ™เบ”เป‰เบฒเบ™เบซเบ™เบถเปˆเบ‡, เบ”เป‰เบงเบ Docker เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบเบธเปˆเบก (เปƒเบ™เบฎเบนเบšเปเบšเบš swarm), เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒ, เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบ—เบตเบกเบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ (3-5 เบ„เบปเบ™) , เบซเบผเบทเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เป‚เบ”เบเบฅเบงเบกเป€เบฅเบฑเบเบ™เป‰เบญเบ, เบซเบผเบทเบ‚เบฒเบ”เบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆ intricacies เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Kubernetes, เบฅเบงเบกเบ—เบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบชเบนเบ‡.

Podman เบšเปเปˆเป„เบ”เป‰เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ, เปเบ•เปˆเบกเบฑเบ™เบกเบตเบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบ™เบถเปˆเบ‡ - เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš Kubernetes, เบฅเบงเบกเบ—เบฑเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบžเบตเปˆเบกเป€เบ•เบตเบก (buildah เปเบฅเบฐเบญเบทเปˆเบ™เป†). เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเบซเบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เบชเปเบฒเบฅเบฑเบšเบ—เบตเบกเบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบซเบผเบทเบกเบตเบ‡เบปเบšเบ›เบฐเบกเบฒเบ™เบˆเปเบฒเบเบฑเบ” - Docker (เบกเบตเบฎเบนเบšเปเบšเบš swarm เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰), เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเปเบฒเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡เบเปˆเบฝเบงเบเบฑเบš localhost เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™ - Podman comrades, เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™. - Kubernetes.

เบ‚เป‰เบญเบเบšเปเปˆเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบเบฑเบš Docker เบˆเบฐเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ—เบฑเบ‡เปเบปเบ”, เบžเบงเบเป€เบ‚เบปเบฒเป€เบ›เบฑเบ™เบœเบนเป‰เบšเบธเบเป€เบšเบตเบ, เปเบฅเบฐเป€เบ—เบทเปˆเบญเบฅเบฐเบšเบฒเบ”เบเป‰เบฒเบงเบžเบงเบเป€เบ‚เบปเบฒเบ„เปˆเบญเบเป†เบเบฒเบเป€เบ›เบฑเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เปเบ•เปˆ Podman, เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ—เบฑเบ‡เปเบปเบ”เบ‚เบญเบ‡เบกเบฑเบ™ (เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆ Linux, เบšเปเปˆเบกเบตเบเบฒเบ™เบˆเบฑเบ”เบเบธเปˆเบก, เบเบฒเบ™เบ›เบฐเบเบญเบš เปเบฅเบฐ เบเบฒเบ™เบเบฐเบ—เบณเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบก) เบญเบฐเบ™เบฒเบ„เบปเบ”เบˆเบฐเบŠเบฑเบ”เป€เบˆเบ™เบ‚เบถเป‰เบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเป€เบŠเบตเบ™เบ—เบธเบเบ„เบปเบ™เบกเบฒเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบ™เบ„เบณเป€เบซเบฑเบ™.

PS เปƒเบ™เบงเบฑเบ™เบ—เบต 3 เบชเบดเบ‡เบซเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบง "เบซเบผเบฑเบเบชเบนเบ”เบงเบดเบ”เบตเป‚เบญ Docker", เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบงเบดเป€เบ„เบฒเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ‚เบญเบ‡เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”: เบˆเบฒเบ abstractions เบžเบทเป‰เบ™เบ–เบฒเบ™เบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, nuances เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ•เปˆเบฒเบ‡เป†เปเบฅเบฐเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก. เป€เบˆเบปเป‰เบฒเบˆเบฐเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเป€เบ—เบฑเบเป‚เบ™เป‚เบฅเบเบต เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบšเปˆเบญเบ™ เปเบฅเบฐเบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ Docker. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™เบเปเบฅเบฐเบ™เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”.

เบฅเบฒเบ„เบฒ Pre-order เบเปˆเบญเบ™เบ›เปˆเบญเบ: RUB 5000. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป‚เบ„เบ‡เบเบฒเบ™ Docker Video Course เบขเบนเปˆเปƒเบ™เปœเป‰เบฒเบซเบผเบฑเบเบชเบนเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster