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 เชเซเชฒเชธเซเชเชฐเซเชเช เชธเชพเชฅเซ เชฒเซเชจเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ
เชฌเชงเชพ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ 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
เช เชชเซเชฐเซเชเซเชเซเช
เชชเซเชฒเชพเชถ
เชตเชงเซ
เชคเชพเชฐเชฃเซ
เชเซเชฌเชฐเชจเซเชเซเชธ เชธเชพเชฅเซเชจเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชเซเชฌ เช เชฐเชธเชชเซเชฐเชฆ เชเซ: เชเช เชคเชฐเชซ, เชกเซเชเชฐ เชธเชพเชฅเซ, เชคเชฎเซ เชเซเชฒเชธเซเชเชฐ (เชธเซเชตเซเชฐเซเชฎ เชฎเซเชกเชฎเชพเช) เชเชธเซเชฎเซเชฌเชฒ เชเชฐเซ เชถเชเซ เชเซ, เชเซเชจเซ เชธเชพเชฅเซ เชคเชฎเซ เชเซเชฐเชพเชนเชเซ เชฎเชพเชเซ เชเชคเซเชชเชพเชฆเชจ เชตเชพเชคเชพเชตเชฐเชฃ เชชเชฃ เชเชฒเชพเชตเซ เชถเชเซ เชเซ, เช เชเชพเชธ เชเชฐเซเชจเซ เชจเชพเชจเซ เชเซเชฎเซ เชฎเชพเชเซ เชธเชพเชเซเช เชเซ (3-5 เชฒเซเชเซ ), เช เชฅเชตเชพ เชจเชพเชจเชพ เชเชเชเชฆเชฐ เชฒเซเชก เชธเชพเชฅเซ, เช เชฅเชตเชพ เชเซเชฌเชฐเชจเซเชเซเชธ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชเชฟเชฒเชคเชพเชเชจเซ เชธเชฎเชเชตเชพเชจเซ เชเชเซเชเชพเชจเซ เช เชญเชพเชต, เชเซเชฎเชพเช เชเชเซเช เชญเชพเชฐเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ.
เชชเซเชกเชฎเซเชจ เชธเชเชชเซเชฐเซเชฃ เชธเซเชธเชเชเชคเชคเชพ เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชคเซเชจเซ เชเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชซเชพเชฏเชฆเซ เชเซ - เชตเชงเชพเชฐเชพเชจเชพ เชธเชพเชงเชจเซ (เชฌเชฟเชฒเซเชกเชพเชน เช เชจเซ เช เชจเซเชฏ) เชธเชนเชฟเชค เชเซเชฌเชฐเชจเซเชเซเชธ เชธเชพเชฅเซ เชธเซเชธเชเชเชคเชคเชพ. เชคเซเชฅเซ, เชนเซเช เชจเซเชเซ เชชเซเชฐเชฎเชพเชฃเซ เชเชพเชฐเซเชฏ เชฎเชพเชเซเชจเชพ เชธเชพเชงเชจเชจเซ เชชเชธเชเชฆเชเซเชจเซ เชธเชเชชเชฐเซเช เชเชฐเซเชถ: เชจเชพเชจเซ เชเซเชฎเซ เชฎเชพเชเซ, เช เชฅเชตเชพ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฌเชเซเช เชธเชพเชฅเซ - เชกเซเชเชฐ (เชธเชเชญเชตเชฟเชค เชธเซเชตเซเชฐเซเชฎ เชฎเซเชก เชธเชพเชฅเซ), เชตเซเชฏเชเซเชคเชฟเชเชค เชฒเซเชเชฒเชนเซเชธเซเช เชชเชฐ เชฎเชพเชฐเชพ เชฎเชพเชเซ เชตเชฟเชเชพเชธ เชเชฐเชตเชพ เชฎเชพเชเซ - เชชเซเชกเชฎเซเชจ เชธเชพเชฅเซเช เช เชจเซ เชฌเซเชเชพ เชฌเชงเชพ เชฎเชพเชเซ - เชเซเชฌเชฐเชจเซเชเซเชธ.
เชฎเชจเซ เชเชพเชคเชฐเซ เชจเชฅเซ เชเซ เชกเซเชเชฐ เชธเชพเชฅเซเชจเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชฌเชฆเชฒเชพเชถเซ เชจเชนเซเช, เชเซเชตเชเซ, เชคเซเช เช เชเซเชฐเชฃเซ เชเซ, เช เชจเซ เชงเซเชฎเซ เชงเซเชฎเซ เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชชเชฃ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซ, เชชเชฐเชเชคเซ เชชเซเชกเชฎเซเชจ, เชคเซเชจเซ เชคเชฎเชพเชฎ เชเชพเชฎเซเช เชธเชพเชฅเซ (เชซเชเซเชค Linux เชชเชฐ เชเชพเชฎ เชเชฐเซ เชเซ, เชคเซเชฏเชพเช เชเซเช เชเซเชฒเชธเซเชเชฐเชฟเชเช เชจเชฅเซ. , เชเชธเซเชฎเซเชฌเชฒเซ เช เชจเซ เช เชจเซเชฏ เชเซเชฐเชฟเชฏเชพเช เชคเซเชคเซเชฏ-เชชเชเซเชทเชจเชพ เชจเชฟเชฐเซเชฃเชฏเซ เชเซ) เชญเชตเชฟเชทเซเชฏ เชธเซเชชเชทเซเช เชเซ, เชคเซเชฅเซ เชนเซเช เชเชฟเชชเซเชชเชฃเซเชเชฎเชพเช เช เชคเชพเชฐเชฃเซเชจเซ เชเชฐเซเชเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชฆเชฐเซเชเชจเซ เชเชฎเชเชคเซเชฐเชฟเชค เชเชฐเซเช เชเซเช.
PS 3 เชเชเชธเซเชเชจเชพ เชฐเซเช เช
เชฎเซ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช "
เชชเซเชฐเชเชพเชถเชจ เชชเชนเซเชฒเชพเช เชชเซเชฐเซ-เชเชฐเซเชกเชฐ เชเชฟเชเชฎเชค: 5000 เชฐเซเชฌเซเชฒเซเชธ. เชชเซเชฐเซเชเซเชฐเชพเชฎ "เชกเซเชเชฐ เชตเชฟเชกเซเชฏเซ เชเซเชฐเซเชธ" เชฎเชณเซ เชถเชเซ เชเซ
เชธเซเชฐเซเชธ: www.habr.com