เชกเซ‹เช•เชฐ เช…เชจเซ‡ เชฌเชงเชพ, เชฌเชงเชพ, เชฌเชงเชพ

TL;DR: เชเช• เชตเชฟเชนเช‚เช—เชพเชตเชฒเซ‹เช•เชจ เชฒเซ‡เช– - เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ. เชกเซ‹เช•เชฐ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเชฎเชพเชจ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเซ€ เชถเช•เซเชฏเชคเชพเช“เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชกเซ‹เช•เชฐ เช…เชจเซ‡ เชฌเชงเชพ, เชฌเชงเชพ, เชฌเชงเชพ

เชคเซ‡ เชฌเชงเซเช‚ เช•เซเชฏเชพเช‚เชฅเซ€ เช†เชตเซเชฏเซเช‚ เชคเซ‡เชจเซ‹ เชฅเซ‹เชกเซ‹ เช‡เชคเชฟเชนเชพเชธ

ะ˜ัั‚ะพั€ะธั

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช…เชฒเช— เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเชฅเชฎ เชœเชพเชฃเซ€เชคเซ€ เชฐเซ€เชค chroot เช›เซ‡. เชธเชฎเชพเชจ เชจเชพเชฎเชจเซ‹ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชฐเซ‚เชŸ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เชชเซ‚เชฐเซ‹ เชชเชพเชกเซ‡ เช›เซ‡ - เช†เชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชเช•เซเชธเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฃเซ‡ เชคเซ‡เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹, เชซเช•เซเชค เช† เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชจเซ€ เช…เช‚เชฆเชฐเชจเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ‹. เชชเชฐเช‚เชคเซ เชœเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช…เช‚เชฆเชฐ เชธเซเชชเชฐเชฏเซเชเชฐ เช…เชงเชฟเช•เชพเชฐเซ‹ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‹ เชคเซ‡ เชธเช‚เชญเชตเชฟเชคเชชเชฃเซ‡ chrootเชฎเชพเช‚เชฅเซ€ "เช›เชŸเช•เซ€" เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‡ เช›เซ‡. เช‰เชชเชฐเชพเช‚เชค, เชฐเซ‚เชŸ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชฆเชฒเชตเชพ เช‰เชชเชฐเชพเช‚เชค, เช…เชจเซเชฏ เชธเช‚เชธเชพเชงเชจเซ‹ (RAM, เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ), เชคเซ‡เชฎเชœ เชจเซ‡เชŸเชตเชฐเซเช•เชจเซ€ เชเช•เซเชธเซ‡เชธ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชจเชฅเซ€.

เช†เช—เชณเชจเซ‹ เชฐเชธเซเชคเซ‹ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เช•เชฐเซเชจเชฒเชจเซ€ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชตเชฟเชงเชพเชฏเซเช•เซเชค เช‘เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡. เช† เชชเชฆเซเชงเชคเชฟเชจเซ‡ เชตเชฟเชตเชฟเชง เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธเชฎเชพเช‚ เช…เชฒเช— เชฐเซ€เชคเซ‡ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชธเชพเชฐ เช เชœ เช›เซ‡ - เช˜เชฃเซ€ เชธเซเชตเชคเช‚เชคเซเชฐ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธ เชšเชฒเชพเชตเชตเซ€, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เชเช• เชœ เช•เชฐเซเชจเชฒ เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ เชœเซ‡ เชฎเซเช–เซเชฏ เช‘เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชšเชฒเชพเชตเซ‡ เช›เซ‡. เช†เชฎเชพเช‚ Linux เชฎเชพเชŸเซ‡ FreeBSD เชœเซ‡เชฒ, เชธเซ‹เชฒเชพเชฐเชฟเชธ เชเซ‹เชจ, OpenVZ เช…เชจเซ‡ LXCเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เช…เชฒเช—เชคเชพ เชซเช•เซเชค เชกเชฟเชธเซเช• เชœเช—เซเชฏเชพ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เช…เชจเซเชฏ เชธเช‚เชธเชพเชงเชจเซ‹ เชฎเชพเชŸเซ‡ เชชเชฃ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฆเชฐเซ‡เช• เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เชธเชฎเชฏ, RAM, เชจเซ‡เชŸเชตเชฐเซเช• เชฌเซ‡เชจเซเชกเชตเชฟเชกเซเชฅ เชชเชฐ เชจเชฟเชฏเช‚เชคเซเชฐเชฃเซ‹ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. chroot เชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚, เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เช›เซ‹เชกเชตเซเช‚ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชธเซเชชเชฐเชฏเซเชเชฐเชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เชญเชพเช—เชฎเชพเช‚ เชœ เชเช•เซเชธเซ‡เชธ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‹ เช•เซ‡, เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเซ€ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เช…เชฆเซเชฏเชคเชจ เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค เช…เชจเซ‡ เชœเซ‚เชจเชพ เช•เชฐเซเชจเชฒเชจเชพ เช‰เชชเชฏเซ‹เช—เชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช†เชตเซƒเชคเซเชคเชฟเช“ (เชฒเชฟเชจเช•เซเชธ เชฎเชพเชŸเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค, เชฅเซ‹เชกเซ€ เช…เช‚เชถเซ‡ เชซเซเชฐเซ€เชฌเซ€เชเชธเชกเซ€), เช•เชฐเซเชจเชฒ เช†เช‡เชธเซ‹เชฒเซ‡เชถเชจ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ "เชคเซ‹เชกเชตเชพเชจเซ€" เช…เชจเซ‡ เชฎเซเช–เซเชฏ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชธเช‚เชญเชพเชตเชจเชพ เชฌเชฟเชจ-เชถเซ‚เชจเซเชฏ เช›เซ‡.

เช•เชจเซเชŸเซ‡เชจเชฐ (เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเชฟเชธเซเชŸเชฎ, เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐ, เชตเช—เซ‡เชฐเซ‡ เชธเชพเชฅเซ‡) เชฎเชพเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชตเชฟเชงเชพเชฏเซเช•เซเชค เช‘เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชคเชฐเชค เชœ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชฎเซเช–เซเชฏ เชตเชธเซเชคเซ เช เช›เซ‡ เช•เซ‡ เช† เชคเช• เชธเชพเชฅเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเซ€ (เชœเชฐเซ‚เชฐเซ€ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ€ เชนเชพเชœเชฐเซ€ เช…เชจเซ‡ เช…เชจเซเชฏ เชซเชพเช‡เชฒเซ‹). เช† เชตเชฟเชšเชพเชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซเชก เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชตเชฐเซเชšเซเชฏเซเช…เชฒเชพเชˆเชเซ‡เชถเชจ เชฎเชพเชŸเซ‡เชจเชพ เช†เชงเชพเชฐ เชคเชฐเซ€เช•เซ‡ เชธเซ‡เชตเชพ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡เชจเซ‹ เชธเซŒเชฅเซ€ เช…เช—เซเชฐเชฃเซ€ เช…เชจเซ‡ เชœเชพเชฃเซ€เชคเซ‹ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟ เชกเซ‹เช•เชฐ เช›เซ‡. เช…เช—เชพเช‰เชจเซ€ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚, เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เช…เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเซเชŸเซ‡เชŸเชซเซเชฒเชจเซ‡เชธ เชตเชšเซเชšเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชธเชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡ เชตเชงเซ เชฒเชตเชšเซ€เช• เช…เชฒเช—เชคเชพ เชชเชฆเซเชงเชคเชฟเช“, เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชญเซŒเชคเชฟเช• เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชเช• เชœ เชธเชฐเซเชตเซ‹เชคเซเชคเชฎ เชตเชพเชคเชพเชตเชฐเชฃ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชฎเชพเช‚ เชชเชฐเชฟเชฃเชฎเซ‡ เช›เซ‡. เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชฐเชฟเชธเซ‹เชฐเซเชธ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค.

Docker

เชกเซ‹เช•เชฐ เช เชธเซŒเชฅเซ€ เชœเชพเชฃเซ€เชคเซเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซ‡เชถเชจ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เช›เซ‡. เช—เซ‹ เชญเชพเชทเชพเชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ, เชคเซ‡ Linux เช•เชฐเซเชจเชฒเชจเซ€ เชจเชฟเชฏเชฎเชฟเชค เช•เซเชทเชฎเชคเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ - cgroups, เชจเซ‡เชฎเชธเซเชชเซ‡เชธ, เช•เซเชทเชฎเชคเชพเช“, เชตเช—เซ‡เชฐเซ‡, เชคเซ‡เชฎเชœ Aufs เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเซเชธ เช…เชจเซ‡ เชกเชฟเชธเซเช• เชœเช—เซเชฏเชพ เชฌเชšเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เช…เชจเซเชฏ.

เชกเซ‹เช•เชฐ เช…เชจเซ‡ เชฌเชงเชพ, เชฌเชงเชพ, เชฌเชงเชพ
เชธเซเชคเซเชฐเซ‹เชค: เชตเชฟเช•เชฟเชฎเซ€เชกเชฟเชฏเชพ

เชธเซเชฅเชพเชชเชคเซเชฏ

เชตเชฐเซเชเชจ 1.11 เชชเชนเซ‡เชฒเชพ, เชกเซ‹เช•เชฐเซ‡ เชเช• เชœ เชธเซ‡เชตเชพ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เชนเชคเซเช‚ เชœเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชธเชพเชฅเซ‡เชจเชพ เชคเชฎเชพเชฎ เช“เชชเชฐเซ‡เชถเชจเซเชธ เช•เชฐเซ‡ เช›เซ‡: เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เช‡เชฎเซ‡เชœ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเซ€, เช•เชจเซเชŸเซ‡เชจเชฐ เชฒเซ‹เช‚เชš เช•เชฐเชตเซเช‚, API เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€. เชธเช‚เชธเซเช•เชฐเชฃ 1.11 เชฅเซ€, เชกเซ‹เช•เชฐเชจเซ‡ เช˜เชฃเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡ เชœเซ‡ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡: เช•เชจเซเชŸเซ‡เชจเชฐ, เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพ เชธเชฎเช—เซเชฐ เชœเซ€เชตเชจ เชšเช•เซเชฐเชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ (เชกเชฟเชธเซเช• เชธเซเชชเซ‡เชธเชจเซ€ เชซเชพเชณเชตเชฃเซ€, เช›เชฌเซ€เช“ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเซ€, เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช—, เชฒเซ‹เช‚เชšเชฟเช‚เช—, เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚) เช…เชจเซ‡ เชฐเชจเชธเซ€. , เช•เชจเซเชŸเซ‡เชจเชฐ เชฐเชจเชŸเชพเช‡เชฎ, cgroups เช…เชจเซ‡ Linux เช•เชฐเซเชจเชฒเชจเชพ เช…เชจเซเชฏ เชฒเช•เซเชทเชฃเซ‹เชจเชพ เช‰เชชเชฏเซ‹เช— เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชกเซ‹เช•เชฐ เชธเซ‡เชตเชพ เชชเซ‹เชคเซ‡ เชœ เชฐเชนเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชนเชตเซ‡ เชคเซ‡ เชซเช•เซเชค เช•เชจเซเชŸเซ‡เชจเชฐ เชชเชฐ เชชเซเชฐเชธเชพเชฐเชฟเชค API เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชตเชพ เช†เชชเซ‡ เช›เซ‡.

เชกเซ‹เช•เชฐ เช…เชจเซ‡ เชฌเชงเชพ, เชฌเชงเชพ, เชฌเชงเชพ

เชธเซเชฅเชพเชชเชจ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ

เชกเซ‹เช•เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชฎเชพเชฐเซ€ เชฎเชจเชชเชธเช‚เชฆ เชฐเซ€เชค เช›เซ‡ เชกเซ‹เช•เชฐ-เชฎเชถเซ€เชจ, เชœเซ‡, เชฐเซ€เชฎเซ‹เชŸ เชธเชฐเซเชตเชฐเซเชธ (เชตเชฟเชตเชฟเชง เชตเชพเชฆเชณเซ‹ เชธเชนเชฟเชค) เชชเชฐ เชกเซ‹เช•เชฐเชจเซ‡ เชธเซ€เชงเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพ เช‰เชชเชฐเชพเช‚เชค, เชคเชฎเชจเซ‡ เชฐเซ€เชฎเซ‹เชŸ เชธเชฐเซเชตเชฐเชจเซ€ เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเชฟเชตเชฟเชง เช†เชฆเซ‡เชถเซ‹ เชชเชฃ เชšเชฒเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชœเซ‹ เช•เซ‡, 2018 เชฅเซ€, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชญเชพเช—เซเชฏเซ‡ เชœ เชตเชฟเช•เชธเชฟเชค เชฅเชฏเซ‹ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเชพ Linux เชตเชฟเชคเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚ - เชเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชจเซ‡.

เช† เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชชเชฃ เชฅเชพเชฏ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, Ansible เช…เชฅเชตเชพ เช…เชจเซเชฏ เชธเชฎเชพเชจ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชชเชฐเช‚เชคเซ เชนเซเช‚ เช† เชฒเซ‡เช–เชฎเชพเช‚ เชคเซ‡เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเชถ เชจเชนเซ€เช‚.

เชธเซ‡เช‚เชŸเซ‹เชธ 7 เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชนเซเช‚ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ‹ เชธเชฐเซเชตเชฐ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ, เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชซเช•เซเชค เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒเชพ เช†เชฆเซ‡เชถเซ‹เชจเซ‡ เชšเชฒเชพเชตเซ‹:

# 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

เชตเชงเซเชฎเชพเช‚, เชคเชฎเซ‡ เชกเซ‹เช•เชฐ เชœเซ‚เชฅ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชจเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเซเชกเซ‹ เชตเชฟเชจเชพ เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เชถเซ‡, เชฒเซ‹เช—เชฟเช‚เช— เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เชถเซ‡, เชฌเชนเชพเชฐเชฅเซ€ API เชจเซ€ เชเช•เซเชธเซ‡เชธ เชธเช•เซเชทเชฎ เช•เชฐเซ€ เชถเช•เชถเซ‡, เชซเชพเชฏเชฐเชตเซ‹เชฒเชจเซ‡ เชซเชพเช‡เชจ-เชŸเซเชฏเซเชจ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚ (เชœเซ‡เชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เชจเชฅเซ€ เชคเซ‡ เชฌเชงเซเช‚ เชœ เช›เซ‡. เช‰เชชเชฐ เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพเช‚ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชฟเชค เช›เซ‡ - เชฎเซ‡เช‚ เช†เชจเซ‡ เชธเชฐเชณเชคเชพ เช…เชจเซ‡ เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช›เซ‹เชกเซ€ เชฆเซ€เชงเซเช‚ เช›เซ‡), เชชเชฐเช‚เชคเซ เชนเซเช‚ เช…เชนเซ€เช‚ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ เชœเชˆเชถ เชจเชนเซ€เช‚.

เชฌเซ€เชœเซ€ เชธเซเชตเชฟเชงเชพเช“

เช‰เชชเชฐเซ‹เช•เซเชค เชกเซ‹เช•เชฐ เชฎเชถเซ€เชจ เช‰เชชเชฐเชพเช‚เชค, เชเช• เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เชชเชฃ เช›เซ‡, เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เช›เชฌเซ€เช“ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชธเชพเชงเชจ, เชคเซ‡เชฎเชœ เชกเซ‹เช•เชฐ เช•เช‚เชชเซ‹เช - เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เชœเชฎเชพเชตเชŸเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชธเชพเชงเชจ, YAML เชซเชพเช‡เชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เช…เชจเซเชฏ เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชธเซเชคเซเช“ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ, เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชคเชค เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเซเชธ).

เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— CICD เชฎเชพเชŸเซ‡ เชชเชพเชˆเชชเชฒเชพเชˆเชจ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. เชฌเซ€เชœเซ€ เชฐเชธเชชเซเชฐเชฆ เชธเซเชตเชฟเชงเชพ เช•เซเชฒเชธเซเชŸเชฐ เชฎเซ‹เชกเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซ€ เช›เซ‡, เช•เชนเซ‡เชตเชพเชคเชพ เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชก (เชธเช‚เชธเซเช•เชฐเชฃ 1.12 เชชเชนเซ‡เชฒเชพ เชคเซ‡ เชกเซ‹เช•เชฐ เชธเซเชตเซ‹เชฐเซเชฎ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเซเช‚ เชนเชคเซเช‚), เชœเซ‡ เชคเชฎเชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชธเชฐเซเชตเชฐเซเชธเชฎเชพเช‚เชฅเซ€ เชเช• เชœ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชฌเชงเชพ เชธเชฐเซเชตเชฐเซเชธเชจเซ€ เชŸเซ‹เชš เชชเชฐ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชฎเชพเชŸเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช›เซ‡, เชคเซเชฏเชพเช‚ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชฒเซ‹เชก เชฌเซ‡เชฒเซ‡เชจเซเชธเชฐ เช›เซ‡, เชคเซ‡เชฎเชœ เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡เชจเชพ เชฐเชนเชธเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช›เซ‡.

เชกเซ‹เช•เชฐ เช•เชฎเซเชชเซ‹เชเชฎเชพเช‚เชฅเซ€ YAML เชซเชพเช‡เชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจเชพเชจเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชธเชพเชฅเซ‡ เช†เชตเชพ เช•เซเชฒเชธเซเชŸเชฐเซ‹ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡ เชตเชฟเชตเชฟเชง เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชจเชพเชจเชพ เช…เชจเซ‡ เชฎเชงเซเชฏเชฎ เช•เซเชฒเชธเซเชŸเชฐเซ‹เชจเซ€ เชœเชพเชณเชตเชฃเซ€เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชฎเซ‹เชŸเชพ เช•เซเชฒเชธเซเชŸเชฐเซ‹ เชฎเชพเชŸเซ‡, เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเซเชฐเชพเชงเชพเชจเซเชฏเช•เซเชทเชฎ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชกเชจเชพ เชœเชพเชณเชตเชฃเซ€ เช–เชฐเซเชš เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เชฐเชคเชพ เชตเชงเชพเชฐเซ‡ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. runC เช‰เชชเชฐเชพเช‚เชค, เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เช•เชพเชŸเชพ เช•เชจเซเชŸเซ‡เชจเชฐ

เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ

เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเช›เซ€, เช…เชฎเซ‡ เชเช• เช•เซเชฒเชธเซเชŸเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถเซเช‚ เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ เชตเชฟเช•เชพเชธ เชŸเซ€เชฎ เชฎเชพเชŸเซ‡ เช—เชฟเชŸเชฒเซ‡เชฌ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚. เชธเชฐเซเชตเชฐ เชคเชฐเซ€เช•เซ‡, เชนเซเช‚ เชคเซเชฐเชฃ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ, เชœเซ‡เชจเชพ เชชเชฐ เชนเซเช‚ เช—เซเชฒเซเชธเซเชŸเชฐเชเชซเชเชธ เชตเชฟเชคเชฐเชฟเชค เชเชซเชเชธเชจเซ‡ เชชเชฃ เชœเชฎเชพเชตเซ€เชถ, เชนเซเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชกเซ‹เช•เชฐ เชตเซ‹เชฒเซเชฏเซเชฎ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชคเชฐเซ€เช•เซ‡ เช•เชฐเซ€เชถ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซเช‚ เชจเชฟเชทเซเชซเชณ-เชธเชฒเชพเชฎเชค เชธเช‚เชธเซเช•เชฐเชฃ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡. เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชฎเซเช–เซเชฏ เช˜เชŸเช•เซ‹: Docker Registry, Postgresql, Redis, GitLab, GitLab เชฐเชจเชฐเชจเซ‡ เชธเซเชตเซ‹เชฐเซเชฎเชจเซ€ เชŸเซ‹เชš เชชเชฐ เชธเชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡. Postgresql เช•เซเชฒเชธเซเชŸเชฐเซ€เช‚เช— เชธเชพเชฅเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชธเซเชŸเซ‹เชฒเซ‹เชจ, เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ Postgresql เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ GlusterFS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชฌเชพเช•เซ€เชจเซ‹ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชกเซ‡เชŸเชพ 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 เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซเช‚ เช•เชพเชฎ เชเช• เชจเซ‹เชกเชฅเซ€ เชšเชพเชฒเซ เชฐเชพเช–เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ 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

เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชก เชเช• เชธเชฐเซเชตเชฐ เชชเชฐ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡, เชœเซ‡ เชฒเซ€เชกเชฐ เชนเชถเซ‡, เชฌเชพเช•เซ€เชจเชพเชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชœเซ‹เชกเชพเชตเซเช‚ เชชเชกเชถเซ‡, เชคเซ‡เชฅเซ€ เชชเซเชฐเชฅเชฎ เชธเชฐเซเชตเชฐ เชชเชฐ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เช•เซ‹เชชเซ€ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡ เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเชพ เชชเชฐ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡.

เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช•เซเชฒเชธเซเชŸเชฐ เชธเซ‡เชŸเช…เชช, เชนเซเช‚ เชจเซ‹เชก 1 เชชเชฐ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซเช‚ เช›เซเช‚:

# 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.

เช† เชธเชฐเซเชตเชฐเซเชธเชจเซเช‚ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡, เชšเชพเชฒเซ‹ เชธเซ‡เชตเชพเช“เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ€เช, เชเช•เซเชเซ‡เช•เซเชฏเซเชŸ เช•เชฐเชตเชพเชจเชพ เช†เชฆเซ‡เชถเซ‹ node1 เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชธเชฟเชตเชพเชฏ เช•เซ‡ เช…เชจเซเชฏเชฅเชพ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชนเซ‹เชฏ.

เชธเซŒ เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชฌเชจเชพเชตเซ€เช:

# 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 เชธเซเชŸเซ‹เชฐเซ‡เชœ เช•เซ‡ เชœเซ‡เชจเซ€ เชŸเซเชฐเซ‡เชซเชฟเช• เช…เชจเซ‡ เชธเซเชŸเซ‹เชฒเซ‹เชจเชจเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡. Postgresql เชจเซ€ เชœเซ‡เชฎ, เช† เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ‡ เชฌเช‚เชงเชพเชฏเซ‡เชฒเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชนเชถเซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช† เช†เชฆเซ‡เชถเชจเซ‡ เชฌเชงเชพ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เชšเชฒเชพเชตเซ€เช เช›เซ€เช:

# mkdir -p /srv/etcd

เช†เช—เชณ, 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

เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€ (เช†เชฆเซ‡เชถเชจเซเช‚ เช†เช‰เชŸเชชเซเชŸ เชœเซเช“ เชกเซ‹เช•เชฐ เชธเซ‡เชตเชพ เชเชฒ.เชเชธเช•เซ‡ เชฌเชงเซ€ เชธเซ‡เชตเชพเช“ เชตเชงเซ€ เช›เซ‡) 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

เช…เชฎเซ‡ เชฌเชนเชพเชฐเชฅเซ€ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เชเช•เซเชธเซ‡เชธ เช–เซ‹เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชŸเซเชฐเซ‡เชซเชฟเช•เชจเซ‡ เช—เซ‹เช เชตเซ€เช เช›เซ€เช:

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

เช…เชฎเซ‡ เชฐเซ‡เชกเชฟเชธ เช•เซเชฒเชธเซเชŸเชฐ เชถเชฐเซ‚ เช•เชฐเซ€เช เช›เซ€เช, เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชฌเชงเชพ เชจเซ‹เชกเซเชธ เชชเชฐ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ€เช เช›เซ€เช:

# 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

เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เช‰เชฎเซ‡เชฐเซ‹:

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'] = "[email protected]"
        gitlab_rails['smtp_password'] = "xxxxxxxxx"
        gitlab_rails['smtp_domain'] = "example.com"
        gitlab_rails['gitlab_email_from'] = '[email protected]'
        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

เชฌเซ€เชœเซเช‚ เชถเซเช‚ เชธเซเชงเชพเชฐเซ€ เชถเช•เชพเชฏ? https เช•เชจเซเชŸเซ‡เชจเชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Traefik เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹, Postgresql เช…เชจเซ‡ Redis เชฎเชพเชŸเซ‡ tls เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ เช‰เชฎเซ‡เชฐเซ‹. เชชเชฐเช‚เชคเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ PoC เชคเชฐเซ€เช•เซ‡ เช†เชชเซ€ เชถเช•เซ‹ เช›เซ‹. เชšเชพเชฒเซ‹ เชนเชตเซ‡ เชกเซ‹เช•เชฐเชจเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เชœเซ‹เชˆเช.

เชชเซ‹เชกเชฎเซ‡เชจ

เชชเซ‹เชกเซเชธ เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅเชฌเชฆเซเชง เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชฌเซ€เชœเซเช‚ เชเช•เชฆเชฎ เชœเชพเชฃเซ€เชคเซเช‚ เชเชจเซเชœเชฟเชจ (เชถเซ€เช‚เช—เซ‹, เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพ เชœเซ‚เชฅเซ‹ เชเช•เชธเชพเชฅเซ‡ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เชกเซ‹เช•เชฐเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เชคเซ‡เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เชธเซ‡เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเชฎเชพเชฎ เช•เชพเชฐเซเชฏ เชฒเชฟเชฌเชชเซ‹เชก เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. Go เชฎเชพเช‚ เชชเชฃ เชฒเช–เซเชฏเซเช‚ เช›เซ‡, runC เชœเซ‡เชตเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ OCI เชธเซเชธเช‚เช—เชค เชฐเชจเชŸเชพเช‡เชฎเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชกเซ‹เช•เชฐ เช…เชจเซ‡ เชฌเชงเชพ, เชฌเชงเชพ, เชฌเชงเชพ

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเซ‹เชกเชฎเซ‡เชจ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชกเซ‹เช•เชฐ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡, เชคเซ‡ เชนเชฆ เชธเซเชงเซ€ เช•เซ‡ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ (เช† เชฒเซ‡เช–เชจเชพ เชฒเซ‡เช–เช• เชธเชนเชฟเชค เช˜เชฃเชพ เชฒเซ‹เช•เซ‹เช เชคเซ‡เชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเซ‹ เชนเซ‹เชตเชพเชจเซ‹ เชฆเชพเชตเซ‹ เช•เชฐเซเชฏเซ‹ เช›เซ‡):

$ alias docker=podman

เช…เชจเซ‡ เชคเชฎเซ‡ เช•เชพเชฎ เชšเชพเชฒเซ เชฐเชพเช–เซ€ เชถเช•เซ‹ เช›เซ‹. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชชเซ‹เชกเชฎเซ‡เชจ เชธเชพเชฅเซ‡เชจเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เช–เซ‚เชฌ เชœ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชœเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเชพ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชฒเช—เชญเช— 2015 เชฅเซ€, เช•เชจเซเชŸเซ‡เชจเชฐ เชตเชฐเซเชฒเซเชก (เช“เชธเซ€เช†เชˆ - เช“เชชเชจ เช•เชจเซเชŸเซ‡เชจเชฐ เช‡เชจเชฟเชถเชฟเชฏเซ‡เชŸเชฟเชต) เชจเซ‡ เชชเซเชฐเชฎเชพเชฃเชฟเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เชกเซ‹เช•เชฐเชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เช…เชจเซ‡ เชฐเชจเชธเซ€เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเซ‡เชจเซ‹ เชตเชฟเช•เชฒเซเชช. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡: CRI-O. เช† เชธเช‚เชฆเชฐเซเชญเซ‡ เชชเซ‹เชกเชฎเซ‡เชจ เช เชกเซ‹เช•เชฐเชจเซ‹ เชตเชฟเช•เชฒเซเชช เช›เซ‡, เชœเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เช—เซเชฐเซ‚เชชเชฟเช‚เช— เชธเชนเชฟเชค เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเชพ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹ เชชเชฐ เชฌเชจเซ‡เชฒเซ‹ เช›เซ‡, เชชเชฐเช‚เชคเซ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‹ เชฎเซเช–เซเชฏ เชงเซเชฏเซ‡เชฏ เชตเชงเชพเชฐเชพเชจเซ€ เชธเซ‡เชตเชพเช“ เชตเชฟเชจเชพ เชกเซ‹เช•เชฐ-เชถเซˆเชฒเซ€เชจเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เช›เซ‡. เชธเซเชชเชทเซเชŸ เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชก เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‹ เชคเชฎเชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฒเซ‹.

เชธเซเชฅเชพเชชเชจ

Centos 7 เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชซเช•เซเชค เชเช•เซเชธเซเชŸเซเชฐเชพเช เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชธเช•เซเชฐเชฟเชฏ เช•เชฐเซ‹, เช…เชจเซ‡ เชชเช›เซ€ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชฌเชงเซเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

# yum -y install podman

เชฌเซ€เชœเซ€ เชธเซเชตเชฟเชงเชพเช“

เชชเซ‹เชกเชฎเซ‡เชจ เชธเชฟเชธเซเชŸเชฎเชก เชฎเชพเชŸเซ‡ เชเช•เชฎเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช†เชฎ เชธเชฐเซเชตเชฐ เชฐเซ€เชฌเซ‚เชŸ เชชเช›เซ€ เช•เชจเซเชŸเซ‡เชจเชฐ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชฒ เช•เชฐเซ‡ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, systemd เช เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ pid 1 เชคเชฐเซ€เช•เซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชพเชนเซ‡เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡. เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชเช• เช…เชฒเช— เชฌเชฟเชฒเซเชกเชน เชŸเซ‚เชฒ เช›เซ‡, เชคเซเชฏเชพเช‚ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชธเชพเชงเชจเซ‹ เชชเชฃ เช›เซ‡ - เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เชเชจเชพ เชเชจเชพเชฒเซ‹เช—, เชœเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ-เชธเซเชธเช‚เช—เชค เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹ เชชเชฃ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชชเซ‹เชกเชฎเซ‡เชจเชฅเซ€ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซเช‚ เชธเชฐเชณ เช›เซ‡.

เชชเซ‹เชกเชฎเซ‡เชจ เชธเชพเชฅเซ‡ เช•เชพเชฎ

เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชก เชจ เชนเซ‹เชตเชพเชฅเซ€ (เชœเซ‹ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชธเซเชตเชฟเชš เช•เชฐเชตเชพเชจเซเช‚ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡), เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เช…เชฒเช— เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€เชถเซเช‚.

เชชเซ‹เชกเชฎเซ‡เชจ-เช•เช‚เชชเซ‹เช เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

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

เชชเซ‹เชกเชฎเซ‡เชจ เชฎเชพเชŸเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพ เชซเชพเชˆเชฒ เชฅเซ‹เชกเซ€ เช…เชฒเช— เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เช†เชชเชฃเซ‡ เชเช• เช…เชฒเช— เชตเซ‹เชฒเซเชฏเซเชฎ เชตเชฟเชญเชพเช—เชจเซ‡ เชธเซ€เชงเซ‹ เชœ เชธเชฐเซเชตเชฟเชธ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช–เชธเซ‡เชกเชตเซ‹ เชชเชกเซเชฏเซ‹.

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 เชฎเชพเชŸเซ‡ เชถเซเช‚ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชถเซ‡, เช† เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชชเซ‹เชกเชจเซเช‚ เชจเชพเชฎ เช…เชฅเชตเชพ เช†เชˆเชกเซ€ เชถเซ‹เชงเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ:

# 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: {}

systemd:

# 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 เชฎเชพเชŸเซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒ เชเช•เชฎ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เช•เชฐเชคเซเช‚ เชจเชฅเซ€ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช†เชตเซ€ เชธเซ‡เชตเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชœเซ‚เชจเชพ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เชธเชพเชซ เช•เชฐเชตเซเช‚), เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เช†เชตเซ€ เชตเชธเซเชคเซเช“ เชœเชพเชคเซ‡ เช‰เชฎเซ‡เชฐเชตเซ€ เชชเชกเชถเซ‡.

เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เชชเซ‹เชกเชฎเซ‡เชจ เช•เชจเซเชŸเซ‡เชจเชฐ เชถเซเช‚ เช›เซ‡ เชคเซ‡ เช…เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชกเซ‹เช•เชฐ-เช•เช‚เชชเซ‹เช เชฎเชพเชŸเซ‡ เชœเซ‚เชจเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเซ‹เชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเช›เซ€ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ, เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชคเชฐเชซ เชœเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฅเชตเชพ เชกเซ‹เช•เชฐ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชธเชฐเชณ เชตเชฟเช•เชฒเซเชช เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡.

rkt

เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เชฐเซเช•เชพเช‡เชตเชฎเชพเช‚ เช—เชฏเชพ เชฒเช—เชญเช— เช› เชฎเชนเชฟเชจเชพ เชชเชนเซ‡เชฒเชพ เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช•เซ‡ RedHat เช เชคเซ‡เชจเซ‡ เช–เชฐเซ€เชฆเซเชฏเซเช‚ เชนเชคเซเช‚, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชคเซ‡เชจเชพ เชชเชฐ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€เชถ เชจเชนเซ€เช‚. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเซ‡เชฃเซ‡ เช–เซ‚เชฌ เชœ เชธเชพเชฐเซ€ เช›เชพเชช เช›เซ‹เชกเซ€, เชชเชฐเช‚เชคเซ เชกเซ‹เช•เชฐเชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชชเชฃ เชตเชงเซ เชชเซ‹เชกเชฎเซ‡เชจเชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚, เชคเซ‡ เชธเช‚เชฏเซ‹เชœเชจ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡. Rkt เชจเซ€ เชŸเซ‹เชš เชชเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ CoreOS เชตเชฟเชคเชฐเชฃ เชชเชฃ เชนเชคเซเช‚ (เชœเซ‹ เช•เซ‡ เชคเซ‡เชฎเชจเซ€ เชชเชพเชธเซ‡ เชฎเซ‚เชณ เชกเซ‹เช•เชฐ เชนเชคเซเช‚), เชชเชฐเช‚เชคเซ เชคเซ‡ เชชเชฃ RedHat เช–เชฐเซ€เชฆเซ€ เชชเช›เซ€ เชธเชฎเชพเชชเซเชค เชฅเชฏเซเช‚.

เชชเซเชฒเชพเชถ

เชตเชงเซ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ, เชœเซ‡เชจเชพ เชฒเซ‡เช–เช• เชฎเชพเชคเซเชฐ เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช…เชจเซ‡ เช•เซ‹เชก เชฆเซเชตเชพเชฐเชพ เช…เชญเชฟเชชเซเชฐเชพเชฏ เช†เชชเชคเชพ, เชฒเซ‡เช–เช•เซ‡ เชงเซ‹เชฐเชฃเซ‹เชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเซเชฏเซเช‚ เชจ เชนเชคเซเช‚, เชชเชฐเช‚เชคเซ เชซเช•เซเชค เชชเซ‹เชคเชพเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚, เชœเซ‡, เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เชคเซ‡เชฃเซ‡ เช•เชฐเซเชฏเซเช‚.

เชคเชพเชฐเชฃเซ‹

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡เชจเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เช–เซ‚เชฌ เชœ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡: เชเช• เชคเชฐเชซ, เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡, เชคเชฎเซ‡ เช•เซเชฒเชธเซเชŸเชฐ (เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชกเชฎเชพเช‚) เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชคเชฎเซ‡ เช—เซเชฐเชพเชนเช•เซ‹ เชฎเชพเชŸเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชตเชพเชคเชพเชตเชฐเชฃ เชชเชฃ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เช† เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชจเชพเชจเซ€ เชŸเซ€เชฎเซ‹ เชฎเชพเชŸเซ‡ เชธเชพเชšเซเช‚ เช›เซ‡ (3-5 เชฒเซ‹เช•เซ‹ ), เช…เชฅเชตเชพ เชจเชพเชจเชพ เชเช•เช‚เชฆเชฐ เชฒเซ‹เชก เชธเชพเชฅเซ‡, เช…เชฅเชตเชพ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชŸเชฟเชฒเชคเชพเช“เชจเซ‡ เชธเชฎเชœเชตเชพเชจเซ€ เช‡เชšเซเช›เชพเชจเซ‹ เช…เชญเชพเชต, เชœเซ‡เชฎเชพเช‚ เช‰เชšเซเชš เชญเชพเชฐเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.

เชชเซ‹เชกเชฎเซ‡เชจ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชธเช‚เช—เชคเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‹ เชเช• เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชซเชพเชฏเชฆเซ‹ เช›เซ‡ - เชตเชงเชพเชฐเชพเชจเชพ เชธเชพเชงเชจเซ‹ (เชฌเชฟเชฒเซเชกเชพเชน เช…เชจเซ‡ เช…เชจเซเชฏ) เชธเชนเชฟเชค เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชคเชคเชพ. เชคเซ‡เชฅเซ€, เชนเซเช‚ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡เชจเชพ เชธเชพเชงเชจเชจเซ€ เชชเชธเช‚เชฆเช—เซ€เชจเซ‹ เชธเช‚เชชเชฐเซเช• เช•เชฐเซ€เชถ: เชจเชพเชจเซ€ เชŸเซ€เชฎเซ‹ เชฎเชพเชŸเซ‡, เช…เชฅเชตเชพ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฌเชœเซ‡เชŸ เชธเชพเชฅเซ‡ - เชกเซ‹เช•เชฐ (เชธเช‚เชญเชตเชฟเชค เชธเซเชตเซ‹เชฐเซเชฎ เชฎเซ‹เชก เชธเชพเชฅเซ‡), เชตเซเชฏเช•เซเชคเชฟเช—เชค เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸ เชชเชฐ เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชตเชฟเช•เชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ - เชชเซ‹เชกเชฎเซ‡เชจ เชธเชพเชฅเซ€เช“ เช…เชจเซ‡ เชฌเซ€เชœเชพ เชฌเชงเชพ เชฎเชพเชŸเซ‡ - เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ.

เชฎเชจเซ‡ เช–เชพเชคเชฐเซ€ เชจเชฅเซ€ เช•เซ‡ เชกเซ‹เช•เชฐ เชธเชพเชฅเซ‡เชจเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชฌเชฆเชฒเชพเชถเซ‡ เชจเชนเซ€เช‚, เช›เซ‡เชตเชŸเซ‡, เชคเซ‡เช“ เช…เช—เซเชฐเชฃเซ€ เช›เซ‡, เช…เชจเซ‡ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชชเชฃ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡, เชชเชฐเช‚เชคเซ เชชเซ‹เชกเชฎเซ‡เชจ, เชคเซ‡เชจเซ€ เชคเชฎเชพเชฎ เช–เชพเชฎเซ€เช“ เชธเชพเชฅเซ‡ (เชซเช•เซเชค Linux เชชเชฐ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช•เซเชฒเชธเซเชŸเชฐเชฟเช‚เช— เชจเชฅเซ€. , เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เช…เชจเซเชฏ เช•เซเชฐเชฟเชฏเชพเช“ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชทเชจเชพ เชจเชฟเชฐเซเชฃเชฏเซ‹ เช›เซ‡) เชญเชตเชฟเชทเซเชฏ เชธเซเชชเชทเซเชŸ เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เช† เชคเชพเชฐเชฃเซ‹เชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฆเชฐเซ‡เช•เชจเซ‡ เช†เชฎเช‚เชคเซเชฐเชฟเชค เช•เชฐเซเช‚ เช›เซเช‚.

PS 3 เช“เช—เชธเซเชŸเชจเชพ เชฐเซ‹เชœ เช…เชฎเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช "เชกเซ‹เช•เชฐ เชตเชฟเชกเชฟเช“ เช•เซ‹เชฐเซเชธเชœเซเชฏเชพเช‚ เชคเชฎเซ‡ เชคเซ‡เชจเชพ เช•เชพเชฎ เชตเชฟเชถเซ‡ เชตเชงเซ เชœเชพเชฃเซ€ เชถเช•เซ‹ เช›เซ‹. เช…เชฎเซ‡ เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เชธเชพเชงเชจเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชถเซเช‚: เชฎเซ‚เชณเชญเซ‚เชค เชเชฌเซเชธเซเชŸเซเชฐเซ‡เช•เซเชถเชจเซเชธเชฅเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเซเชงเซ€, เชตเชฟเชตเชฟเชง เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธ เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เช˜เซ‹เช‚เช˜เชพเชŸ. เชคเชฎเซ‡ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชถเซ‹ เช…เชจเซ‡ เชธเชฎเชœเซ€ เชถเช•เชถเซ‹ เช•เซ‡ เชกเซ‹เช•เชฐเชจเซ‹ เช•เซเชฏเชพเช‚ เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเซเชฐเซ‡เชทเซเช  เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹. เช…เชฎเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เช•เซ‡เชธเซ‹ เชชเชฃ เชถเซ‡เชฐ เช•เชฐเซ€เชถเซเช‚.

เชชเซเชฐเช•เชพเชถเชจ เชชเชนเซ‡เชฒเชพเช‚ เชชเซเชฐเซ€-เช“เชฐเซเชกเชฐ เช•เชฟเช‚เชฎเชค: 5000 เชฐเซเชฌเซ‡เชฒเซเชธ. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ "เชกเซ‹เช•เชฐ เชตเชฟเชกเซ€เชฏเซ‹ เช•เซ‹เชฐเซเชธ" เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชญเซเชฏเชพเชธเช•เซเชฐเชฎ เชชเซƒเชทเซเช  เชชเชฐ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹