เดกเต‹เด•เตเด•เดฑเตเด‚ เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚

TL;DR: เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเตเด•เตพ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด…เดตเดฒเต‹เด•เดจ เด—เตˆเดกเต. เดกเต‹เด•เตเด•เดฑเดฟเดจเตเดฑเต†เดฏเตเด‚ เดฎเดฑเตเดฑเต เดธเดฎเดพเดจ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด•เดดเดฟเดตเตเด•เตพ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด‚.

เดกเต‹เด•เตเด•เดฑเตเด‚ เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚

เดŽเดฒเตเดฒเดพเด‚ เดŽเดตเดฟเดŸเต† เดจเดฟเดจเตเดจเต เดตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดšเดฐเดฟเดคเตเดฐเด‚

เด•เดฅ

เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเต‡เตผเดคเดฟเดฐเดฟเดšเตเดšเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด†เดฆเตเดฏเดคเตเดคเต† เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เดฐเต€เดคเดฟ chroot เด†เดฃเต. เด…เดคเต‡ เดชเต‡เดฐเดฟเดฒเตเดณเตเดณ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดฑเต‚เดŸเตเดŸเต เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟ เดฎเดพเดฑเดฟเดฏเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต - เด…เด™เตเด™เดจเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด† เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเดฟเดฒเต† เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เด†เด•เตโ€Œเดธเดธเต เด‰เดณเตเดณเต‚ เดŽเดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด†เดจเตเดคเดฐเดฟเด•เดฎเดพเดฏเดฟ เดฑเต‚เดŸเตเดŸเต เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ เดจเตฝเด•เดฟเดฏเดพเตฝ, เด…เดคเดฟเดจเต chroot "เดฐเด•เตเดทเดชเตเดชเต†เดŸเดพเดจเตเด‚" เดชเตเดฐเดงเดพเดจ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดจเด‚ เดจเต‡เดŸเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด•เต‚เดŸเดพเดคเต†, เดฑเต‚เดŸเตเดŸเต เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเต เดชเตเดฑเดฎเต‡, เดฎเดฑเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเตเด‚ (เดฑเดพเด‚, เดชเตเดฐเต‹เดธเดธเตผ), เด…เดคเตเดชเต‹เดฒเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด†เด•เตโ€Œเดธเดธเตเดธเตเด‚ เดชเดฐเดฟเดฎเดฟเดคเดฎเดฒเตเดฒ.

เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เด’เดฐเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เด…เดŸเตเดคเตเดค เดฐเต€เดคเดฟ. เดตเตเดฏเดคเตเดฏเดธเตเดค เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ เดˆ เดฐเต€เดคเดฟเดฏเต† เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เดธเดพเดฐเดพเด‚เดถเด‚ เด’เดจเตเดจเตเดคเดจเตเดจเต†เดฏเดพเดฃเต - เดจเดฟเดฐเดตเดงเดฟ เดธเตเดตเดคเดจเตเดคเตเดฐ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดตเดฏเดฟเตฝ เด“เดฐเต‹เดจเตเดจเตเด‚ เดชเตเดฐเดงเดพเดจ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด…เดคเต‡ เด•เต‡เตผเดฃเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. FreeBSD เดœเดฏเดฟเดฒเตเด•เตพ, เดธเต‹เดณเดพเดฐเดฟเดธเต เดธเต‹เดฃเตเด•เตพ, OpenVZ, LXC เดŽเดจเตเดจเดฟเดต Linux-เดจเตเดณเตเดณเดคเดพเดฃเต. เดกเดฟเดธเตเด•เต เดธเตเดชเต‡เดธเต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเตเด‚ เดเดธเตŠเดฒเต‡เดทเตป เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต; เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚, เด“เดฐเต‹ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเตผ เดธเดฎเดฏเด‚, เดฑเดพเด‚, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดฌเดพเตปเดกเตโ€Œเดตเดฟเดกเตเดคเตเดคเต เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดฟเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. chroot-เดจเต† เด…เดชเต‡เด•เตเดทเดฟเดšเตเดšเต, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฃเต, เด•เดพเดฐเดฃเด‚ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดฒเต† เดธเต‚เดชเตเดชเตผเด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดฒเต† เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เดชเตเดฐเดตเต‡เดถเดจเดฎเตเดณเตเดณเต‚, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเตเดณเตเดณเดฟเดฒเต† เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเต‡เดฃเตเดŸเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดคเดฏเตเด‚ เดชเดดเดฏ เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เดตเตเด‚ เด•เดพเดฐเดฃเด‚ เด•เต‡เตผเดฃเดฒเตเด•เดณเตเดŸเต† (เดฒเดฟเดจเด•เตเดธเดฟเดจเต เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏ, เด’เดฐเต เดชเดฐเดฟเดงเดฟ เดตเดฐเต† เดซเตเดฐเต€เดฌเดฟเดŽเดธเตเดกเดฟ), เด•เต‡เตผเดฃเตฝ เดเดธเตŠเดฒเต‡เดทเตป เดธเดฟเดธเตเดฑเตเดฑเด‚ "เดฌเตเดฐเต‡เด•เตเด•เต เดคเตเดฐเต‚" เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดชเตเดฐเดงเดพเดจ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดจเด‚ เดจเต‡เดŸเดพเดจเตเดฎเตเดณเตเดณ เดธเดพเดงเตเดฏเดค เดชเต‚เดœเตเดฏเดฎเดฒเตเดฒ.

เด’เดฐเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตฝ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚ (เด’เดฐเต เด‡เดจเต€เดทเตเดฏเดฒเตˆเดธเต‡เดทเตป เดธเดฟเดธเตเดฑเตเดฑเด‚, เดชเดพเด•เตเด•เต‡เดœเต เดฎเดพเดจเต‡เดœเตผ เดฎเตเดคเดฒเดพเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต), เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดŸเตป เดคเดจเตเดจเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเตเดฏเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เต เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดตเดธเดฐเด‚ เดจเตฝเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต (เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฒเตˆเดฌเตเดฐเดฑเดฟเด•เดณเตเดŸเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเด‚. เดฎเดฑเตเดฑเต เดซเดฏเดฒเตเด•เดณเตเด‚). เดˆ เด†เดถเดฏเด‚ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตˆเดธเตเดกเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเต†เตผเดšเตเดตเดฒเตˆเดธเต‡เดทเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดตเตผเดคเตเดคเดฟเดšเตเดšเต, เด‡เดคเดฟเดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดฎเตเด–เดตเตเด‚ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเดคเตเดฎเดพเดฏ เดชเตเดฐเดคเดฟเดจเดฟเดงเดฟ เดกเต‹เด•เตเด•เดฑเดพเดฃเต. เดฎเตเดฎเตเดชเดคเตเดคเต† เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเตเดฎเตเดชเต‹เตพ, เด•เต‚เดŸเตเดคเตฝ เดซเตเดฒเต†เด•เตเดธเดฟเดฌเดฟเตพ เดเดธเตŠเดฒเต‡เดทเตป เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เดตเต†เตผเดšเตเดตเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดชเดฟเดจเตเดคเตเดฃเดฏเตเด‚ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเตเดณเตเดณเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เตเด‚, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดงเดพเดฐเดพเดณเด‚ เดซเดฟเดธเดฟเด•เตเด•เตฝ เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดเด•เต€เด•เตƒเดค เด…เดจเตเดคเดฐเต€เด•เตเดทเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเดฏเดฟ - เดฎเดพเดจเตเดตเตฝ เดฑเดฟเดธเต‹เดดเตเดธเต เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเดพเดคเต†.

เดกเต‹เด•เตเด•เตผ

เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดถเดธเตเดคเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตˆเดธเต‡เดทเตป เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด†เดฃเต เดกเต‹เด•เตเด•เตผ. Go เดญเดพเดทเดฏเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดคเต, เด‡เดคเต เดฒเดฟเดจเด•เตเดธเต เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดซเต€เดšเตเดšเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต - cgroups, namespaces, capabilities, etc., เด…เดคเตเดชเต‹เดฒเต† Aufs เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฏเตเด‚ เดกเดฟเดธเตเด•เต เดธเตเดชเต‡เดธเต เดฒเดพเดญเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เดกเต‹เด•เตเด•เดฑเตเด‚ เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚
เด‰เดฑเดตเดฟเดŸเด‚: เดตเดฟเด•เตเด•เดฟเดฎเต€เดกเดฟเดฏ

เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ

เดชเดคเดฟเดชเตเดชเต 1.11-เดจเต เดฎเตเดฎเตเดชเต, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเดฒเตเดฒเดพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดจเดŸเดคเตเดคเตเดจเตเดจ เด’เดฐเตŠเดฑเตเดฑ เดธเต‡เดตเดจเดฎเดพเดฏเดฟ เดกเต‹เด•เตเด•เตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต: เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด‡เดฎเต‡เดœเตเด•เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•, API เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•. เดชเดคเดฟเดชเตเดชเต 1.11 เดฎเตเดคเตฝ, เดกเต‹เด•เตเด•เตผ เดชเดฐเดธเตเดชเดฐเด‚ เด‡เดŸเดชเดดเด•เตเดจเตเดจ เดจเดฟเดฐเดตเดงเดฟ เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: เด•เดฃเตเดŸเต†เดฏเตเดจเตผ, เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เดณเตเดŸเต† เดฎเตเดดเตเดตเตป เดœเต€เดตเดฟเดค เดšเด•เตเดฐเดตเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต (เดกเดฟเดธเตเด•เต เดธเตเดชเต‡เดธเต เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด•, เด‡เดฎเต‡เดœเตเด•เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเตเดŸเต† เด…เดตเดธเตเดฅ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•, เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•, เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•) เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดทเตป เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเดพเดฏ runC, cgroups-เดจเตเดฑเต† เด‰เดชเดฏเต‹เด—เดคเตเดคเต†เดฏเตเด‚ เดฒเดฟเดจเด•เตโ€Œเดธเต เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดฎเดฑเตเดฑเต เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเต†เดฏเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดพเดฃเต. เดกเต‹เด•เตเด•เตผ เดธเต‡เดตเดจเด‚ เดคเดจเตเดจเต† เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ เด‡เดคเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดค API เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เดฎเดพเดคเตเดฐเดฎเต‡ เดธเดนเดพเดฏเดฟเด•เตเด•เต‚.

เดกเต‹เด•เตเด•เดฑเตเด‚ เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚, เดŽเดฒเตเดฒเดพเด‚

เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเตเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด‚

เดกเต‹เด•เตเด•เตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดŽเดจเตเดฑเต† เดชเตเดฐเดฟเดฏเดชเตเดชเต†เดŸเตเดŸ เดฎเดพเตผเด—เด‚ เดกเต‹เด•เตเด•เตผ-เดฎเต†เดทเต€เตป เด†เดฃเต, เด‡เดคเต เดฑเดฟเดฎเต‹เดŸเตเดŸเต เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ (เดตเดฟเดตเดฟเดง เด•เตเดฒเต—เดกเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเต†) เดกเต‹เด•เตเด•เตผ เดจเต‡เดฐเดฟเดŸเตเดŸเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเตเดฑเดฎเต‡, เดฑเดฟเดฎเต‹เดŸเตเดŸเต เดธเต†เตผเดตเดฑเตเด•เดณเตเดŸเต† เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดพเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดตเดฟเดตเดฟเดง เด•เดฎเดพเตปเดกเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, 2018 เดฎเตเดคเตฝ, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดฎเดฟเด•เตเด• เดฒเดฟเดจเด•เตเดธเต เดตเดฟเดคเดฐเดฃเด™เตเด™เตพเด•เตเด•เตเด‚ เดžเด™เตเด™เตพ เด‡เดคเต เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฐเต€เดคเดฟเดฏเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด‚ - เด’เดฐเต เดถเต‡เด–เดฐเด‚ เดšเต‡เตผเดคเตเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดˆ เดฐเต€เดคเดฟ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเดกเต เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เด…เตปเดธเดฟเดฌเดฟเตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเต เดธเดฎเดพเดจ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเดพเตป เด‡เดคเต เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดฟเดฒเตเดฒ.

เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเตป Centos 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 เดซเดฏเดฒเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดฎเดฑเตเดฑเต เด…เดจเตเดฌเดจเตเดง เด•เดพเดฐเตเดฏเด™เตเด™เดณเตเด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เตพ, เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เตเดณเตเดณ เดชเต†เตผเดธเดฟเดธเตเดฑเตเดฑเดจเตเดฑเต เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เตพ).

เดธเดฟเดเดธเดฟเดกเดฟเด•เตเด•เดพเดฏเดฟ เด•เตบเดตเต†เดฏเดฑเตเด•เตพ เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดฎเดฑเตเดฑเตŠเดฐเต เดฐเดธเด•เดฐเดฎเดพเดฏ เดธเดตเดฟเดถเต‡เดทเดค เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดฎเต‹เดกเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต swarm เดฎเต‹เดกเต (เดชเดคเดฟเดชเตเดชเต 1.12-เดจเต เดฎเตเดฎเตเดชเต เด‡เดคเต เดกเต‹เด•เตเด•เตผ เดธเตเดตเดพเด‚ เดŽเดจเตเดจเดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเตเดจเตเดจเต), เด‡เดคเต เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดจเดฟเดฐเดตเดงเดฟ เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเตŠเดฑเตเดฑ เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดฒเตเดฒเดพ เดธเต†เตผเดตเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดฎเตเด•เดณเดฟเตฝ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเดจเตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃเดฏเตเดฃเตเดŸเต, เด’เดฐเต เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดฒเต‹เดกเต เดฌเดพเดฒเตปเดธเดฑเตเด‚ เด…เดคเตเดชเต‹เดฒเต† เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพเด•เตเด•เตเดณเตเดณ เดฐเดนเดธเตเดฏเด™เตเด™เตพเด•เตเด•เตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด‚ เด‰เดฃเตเดŸเต.

เดšเต†เดฑเดฟเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต‹เดŸเต†เดฏเตเดณเตเดณ เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ YAML เดซเดฏเดฒเตเด•เตพ เด…เดคเตเดคเดฐเด‚ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚, เดตเดฟเดตเดฟเดง เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดšเต†เดฑเตเดคเตเด‚ เด‡เดŸเดคเตเดคเดฐเดตเตเดฎเดพเดฏ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเดŸเต† เดชเดฐเดฟเดชเดพเดฒเดจเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดตเดฒเดฟเดฏ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เตพเด•เตเด•เต, เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดพเดฃเต เด…เดญเดฟเด•เดพเดฎเตเดฏเด‚, เด•เดพเดฐเดฃเด‚ เดธเตเดตเดพเด‚ เดฎเต‹เดกเดฟเดจเตเดฑเต† เดชเดฐเดฟเดชเดพเดฒเดจเดšเตเดšเต†เดฒเดตเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเด•เดณเต‡เด•เตเด•เดพเตพ เด•เต‚เดŸเตเดคเดฒเดพเดฃเต. runC เด•เต‚เดŸเดพเดคเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเตป เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เด•เดพเดฑเตเดฑ เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ

เดกเต‹เด•เตเด•เดฑเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต

เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเดจเตเด‚ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด‚ เดถเต‡เดทเด‚, เดžเด™เตเด™เตพ เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚, เด…เดคเดฟเตฝ เดžเด™เตเด™เตพ เดกเต†เดตเดฒเดชเตโ€Œเดฎเต†เดจเตเดฑเต เดŸเต€เดฎเดฟเดจเดพเดฏเดฟ GitLab, Docker Registry เดŽเดจเตเดจเดฟเดต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด‚. เดžเดพเตป เดฎเต‚เดจเตเดจเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเด•เตพ เดธเต†เตผเดตเดฑเตเด•เดณเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚, เด…เดคเดฟเตฝ เดžเดพเตป เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดค FS GlusterFS เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด‚; เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเตเดŸเต† เด’เดฐเต เดคเด•เดฐเดพเตผ-เดธเดนเดฟเดทเตเดฃเตเดค เดชเดคเดฟเดชเตเดชเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด’เดฐเต เดกเต‹เด•เตเด•เตผ เดตเต‹เดณเตเดฏเด™เตเด™เดณเตเดŸเต† เดธเด‚เดญเดฐเดฃเดฎเดพเดฏเดฟ เดžเดพเตป เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚. เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เด˜เดŸเด•เด™เตเด™เตพ: เดธเตเดตเดพเดฎเดฟเดจเต เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ GitLab เดฑเดฃเตเดฃเดฑเดฟเดจเตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃเดฏเต‹เดŸเต† เดกเต‹เด•เตเด•เตผ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟ, Postgresql, Redis, 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

เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด’เดจเตเดจเดฟเตฝ swarm เดฎเต‹เดกเต เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดฒเต€เดกเตผ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดฌเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดตเตผ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดšเต‡เดฐเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚, เด…เดคเดฟเดจเดพเตฝ เด†เดฆเตเดฏ เดธเต†เตผเดตเดฑเดฟเตฝ เด•เดฎเดพเตปเดกเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดซเดฒเด‚ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเดฟเตฝ เดชเด•เตผเดคเตเดคเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เดชเตเดฐเดพเดฐเด‚เดญ เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเดœเตเดœเต€เด•เดฐเดฃเด‚, เดžเดพเตป node1-เตฝ เด•เดฎเดพเตปเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต:

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

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

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

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

เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด•เดฎเดพเตปเดกเดฟเดจเตเดฑเต† เดซเดฒเด‚ เดžเด™เตเด™เตพ เดชเด•เตผเดคเตเดคเดฟ node2, node3 เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

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

เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เดธเต†เตผเดตเดฑเตเด•เดณเตเดŸเต† เดชเตเดฐเดพเดฅเดฎเดฟเด• เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เดจเดฎเตเด•เตเด•เต เดธเต‡เดตเดจเด™เตเด™เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚; เดฎเดฑเตเดฑเตเดตเดฟเดงเดคเตเดคเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸ เด•เดฎเดพเตปเดกเตเด•เตพ 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

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, Traefik, Stolon เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ 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

เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚ (เด•เดฎเดพเตปเดกเดฟเดจเตเดฑเต† เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด•เดพเดฃเตเด• เดกเต‹เด•เตเด•เตผ เดธเต‡เดตเดจเด‚ lsเดŽเดฒเตเดฒเดพ เดธเต‡เดตเดจเด™เตเด™เดณเตเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ) เดžเด™เตเด™เตพ Postgresql เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต:

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

Postgresql เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เดธเดจเตเดจเดฆเตเดงเดค เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต:

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

ID      LEADER
26baa11d    false
74e98768    false
a8cb002b    true

=== Active proxies ===

ID
4d233826
9f562f3b
b0c79ff1

=== Keepers ===

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

=== Cluster Info ===

Master Keeper: pgkeeper3

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

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

เดชเตเดฑเดคเตเดคเต เดจเดฟเดจเตเดจเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด†เด•เตโ€Œเดธเดธเต เดคเตเดฑเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ traefik เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

03traefik.yml

version: '3.7'

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

networks:
  traefik:
    external: true

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

เดžเด™เตเด™เตพ เดฑเต†เดกเดฟเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เดŽเดฒเตเดฒเดพ เดจเต‹เดกเตเด•เดณเดฟเดฒเตเด‚ เด’เดฐเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต:

# 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-เตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป, Extras repository เดธเดœเต€เดตเดฎเดพเด•เตเด•เตเด•, เดคเตเดŸเตผเดจเตเดจเต เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเดฒเตเดฒเดพเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•:

# yum -y install podman

เดฎเดฑเตเดฑเต เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ

Podman-เดจเต systemd-เดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เดฏเต‚เดฃเดฟเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เด™เตเด™เดจเต† เดธเต†เตผเดตเตผ เดฑเต€เดฌเต‚เดŸเตเดŸเดฟเดจเต เดถเต‡เดทเด‚ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต‚เดŸเดพเดคเต†, 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 เด†เดณเตเด•เตพ) เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚ เดธเดคเตเดฏเดฎเดพเดฃเต. , เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดฎเตŠเดคเตเดคเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฒเต‹เดกเต , เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‰เดฏเตผเดจเตเดจ เดฒเต‹เดกเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเต†, เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดธเด™เตเด•เต€เตผเดฃเดคเด•เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเดจเตเดณเตเดณ เด†เด—เตเดฐเดนเดคเตเดคเดฟเดจเตเดฑเต† เด…เดญเดพเดตเด‚.

เดชเต‹เดกเตเดฎเดพเตป เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด…เดจเตเดฏเต‹เดœเตเดฏเดค เดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เด‡เดคเดฟเดจเต เด’เดฐเต เดชเตเดฐเดงเดพเดจ เดจเต‡เดŸเตเดŸเดฎเตเดฃเตเดŸเต - เด…เดงเดฟเด• เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด‰เตพเดชเตเดชเต†เดŸเต† (เดฌเดฟเตฝเดกเดฏเตเด‚ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฏเตเด‚) เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เด…เดจเตเดฏเต‹เดœเตเดฏเดค. เด…เดคเดฟเดจเดพเตฝ, เดœเต‹เดฒเดฟเด•เตเด•เตเดณเตเดณ เด’เดฐเต เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเดฟเดจเต† เดžเดพเตป เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดธเดฎเต€เดชเดฟเด•เตเด•เตเด‚: เดšเต†เดฑเดฟเดฏ เดŸเต€เดฎเตเด•เตพเด•เตเด•เดพเดฏเดฟ, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฏ เดฌเดœเดฑเตเดฑเดฟเตฝ - เดกเต‹เด•เตเด•เตผ (เดธเดพเดงเตเดฏเดฎเดพเดฏ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฎเต‹เดกเต เด‰เดณเตเดณเดคเต), เด’เดฐเต เดธเตเดตเด•เดพเดฐเตเดฏ เดฒเต‹เด•เตเด•เตฝ เดนเต‹เดธเตเดฑเตเดฑเดฟเตฝ เดŽเดจเดฟเด•เตเด•เดพเดฏเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต - เดชเต‹เดกเตเดฎเดพเตป เดธเด–เดพเด•เตเด•เตพ, เด•เต‚เดŸเดพเดคเต† เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ - เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต.

เดญเดพเดตเดฟเดฏเดฟเตฝ เดกเต‹เด•เตเด•เดฑเตเดฎเดพเดฏเตเดณเตเดณ เดธเดพเดนเดšเดฐเตเดฏเด‚ เดฎเดพเดฑเดฟเดฒเตเดฒเต†เดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เด‰เดฑเดชเตเดชเดฟเดฒเตเดฒ, เดŽเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเดฎเตเดชเดฐเดฟ, เด…เดตเตผ เดชเดฏเดจเดฟเดฏเตผเดฎเดพเดฐเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เด•เตเดฐเดฎเต‡เดฃ เดชเดŸเดฟเดชเดŸเดฟเดฏเดพเดฏเดฟ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดชเด•เตเดทเต‡ เดชเต‹เดกเตเดฎเดพเตป, เด…เดคเดฟเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดชเต‹เดฐเดพเดฏเตเดฎเด•เตพเด•เตเด•เตเด‚ (เดฒเดฟเดจเด•เตเดธเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเด‚เด—เต เด‡เดฒเตเดฒ, เด…เดธเด‚เดฌเตเดฒเดฟเดฏเตเด‚ เดฎเดฑเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เดณเดพเดฃเต) เดญเดพเดตเดฟ เด•เต‚เดŸเตเดคเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเตฝ เดˆ เด•เดฃเตเดŸเต†เดคเตเดคเดฒเตเด•เตพ เดšเตผเดšเตเดš เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดŽเดฒเตเดฒเดพเดตเดฐเต‡เดฏเตเด‚ เด•เตเดทเดฃเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเดฟ.เดŽเดธเต เด“เด—เดธเตเดฑเตเดฑเต 3 เดจเต เดžเด™เตเด™เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด‚ "เดกเต‹เด•เตเด•เตผ เดตเต€เดกเดฟเดฏเต‹ เด•เต‹เดดเตเดธเต", เด…เดตเดจเตเดฑเต† เดœเต‹เดฒเดฟเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเดฒเดฑเดฟเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดฟเดŸเดคเตเดคเต. เด…เดคเดฟเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเด‚ เดžเด™เตเด™เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเด‚: เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเด‚เด—เตเดฐเดนเด™เตเด™เตพ เดฎเตเดคเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดตเดฐเต†, เดตเดฟเดตเดฟเดง เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเตเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดธเต‚เด•เตเดทเตเดฎเดคเด•เตพ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเดฏเตเดฎเดพเดฏเดฟ เดชเดฐเดฟเดšเดฏเดฎเตเดฃเตเดŸเดพเด•เตเด•เดฏเตเด‚ เดกเต‹เด•เตเด•เตผ เดŽเดตเดฟเดŸเต†, เดŽเด™เตเด™เดจเต† เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเดฏเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดฎเดฟเด•เดšเตเดš เดชเตเดฐเดพเด•เตเดŸเต€เดธเต เด•เต‡เดธเตเด•เดณเตเด‚ เดžเด™เตเด™เตพ เดชเด™เตเด•เดฟเดŸเตเด‚.

เดฑเดฟเดฒเต€เดธเดฟเดจเต เดฎเตเดฎเตเดชเตเดณเตเดณ เดฎเตเตปเด•เต‚เตผ เด“เตผเดกเตผ เดตเดฟเดฒ: 5000 RUB. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเต‹เด•เตเด•เตผ เดตเต€เดกเดฟเดฏเต‹ เด•เต‹เดดเตโ€Œเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚ เด•เต‹เดดเตเดธเต เดชเต‡เดœเดฟเตฝ.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•