เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡

TL; DR: เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจšเฉฑเจฒเจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ€ เจคเฉเจฒเจจเจพ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจ—เจพเจˆเจกเฅค เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจธเจฎเจพเจจ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡

เจ‡เจน เจธเจญ เจ•เจฟเฉฑเจฅเฉ‹เจ‚ เจ†เจ‡เจ† เจ‡เจธ เจฆเจพ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจœเจฟเจนเจพ เจ‡เจคเจฟเจนเจพเจธ

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

เจ•เจฟเจธเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ…เจฒเฉฑเจ— เจ•เจฐเจจ เจฆเจพ เจชเจนเจฟเจฒเจพ เจœเจพเจฃเจฟเจ†-เจชเจ›เจพเจฃเจฟเจ† เจคเจฐเฉ€เจ•เจพ chroot เจนเฉˆเฅค เจ‰เจธเฉ‡ เจจเจพเจฎ เจฆเฉ€ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ เจ•เจฟ เจฐเฉ‚เจŸ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฆเจฒเฉ€ เจ—เจˆ เจนเฉˆ - เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจน เจธเฉเจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจธ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจธเจฟเจฐเจซเจผ เจ‰เจธ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจซเจพเจˆเจฒเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจนเฉˆเฅค เจชเจฐ เจœเฉ‡เจ•เจฐ เจ•เจฟเจธเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจฐเฉ‚เจŸ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจฆเจฟเฉฑเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจคเจพเจ‚ เจ‡เจน เจธเฉฐเจญเจพเจตเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉเจฐเฉ‹เจŸ เจคเฉ‹เจ‚ "เจฌเจš" เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจจเจพเจฒ เจนเฉ€, เจฐเฉ‚เจŸ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจนเฉ‹เจฐ เจธเจฐเฉ‹เจค (RAM, เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ), เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจชเจนเฉเฉฐเจš, เจธเฉ€เจฎเจฟเจค เจจเจนเฉ€เจ‚ เจนเจจเฅค

เจ…เจ—เจฒเจพ เจคเจฐเฉ€เจ•เจพ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจ•เจฐเจจเจฒ เจฆเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ‡เฉฑเจ• เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ‡เฉฑเจ• เจชเฉ‚เจฐเจพ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ เจนเฉˆเฅค เจ‡เจธ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐ เจธเจพเจฐ เจ‡เฉฑเจ• เจนเฉ€ เจนเฉˆ - เจ•เจˆ เจธเฉเจคเฉฐเจคเจฐ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ, เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจ‰เจนเฉ€ เจ•เจฐเจจเจฒ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจฎเฉเฉฑเจ– เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจšเฉฑเจฒเจฆเจพ เจนเฉˆเฅค เจ‡เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจฒเจˆ FreeBSD เจœเฉ‡เจฒเฉเจนเจพเจ‚, เจธเฉ‹เจฒเจพเจฐเจฟเจธ เจœเจผเฉ‹เจจ, OpenVZ เจ…เจคเฉ‡ LXC เจธเจผเจพเจฎเจฒ เจนเจจเฅค เจ…เจฒเฉฑเจ—-เจฅเจฒเฉฑเจ— เจจเจพ เจธเจฟเจฐเจซเจผ เจกเจฟเจธเจ• เจธเจชเฉ‡เจธ เจฆเฉเจ†เจฐเจพ, เจธเจ—เฉ‹เจ‚ เจนเฉ‹เจฐ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเฉ€ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ; เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจนเจฐเฉ‡เจ• เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, RAM เจ…เจคเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจฌเฉˆเจ‚เจกเจตเจฟเจกเจฅ เจฆเฉ€เจ†เจ‚ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ•เฉเจฐเฉ‹เจŸ เจฆเฉ‡ เจฎเฉเจ•เจพเจฌเจฒเฉ‡, เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ เจ›เฉฑเจกเจฃเจพ เจตเจงเฉ‡เจฐเฉ‡ เจฎเฉเจธเจผเจ•เจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš เจธเฉเจชเจฐเจฏเฉ‚เจœเจผเจฐ เจ•เฉ‹เจฒ เจธเจฟเจฐเจซ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจ…เจช เจŸเฉ‚ เจกเฉ‡เจŸ เจฐเฉฑเจ–เจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ•เจฐเจจเจฒ เจฆเฉ‡ (เจฒเฉ€เจจเจ•เจธ เจฒเจˆ เจขเฉเจ•เจตเฉ‡เจ‚, เจ•เฉเจ เจนเฉฑเจฆ เจคเฉฑเจ• FreeBSD), เจ•เจฐเจจเจฒ เจ†เจˆเจธเฉ‹เจฒเฉ‡เจธเจผเจจ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ "เจคเฉ‹เฉœเจจ" เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจนเฉˆเฅค

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

เจกเฉŒเจ•เจฐ

เจกเฉŒเจ•เจฐ เจธเจญ เจคเฉ‹เจ‚ เจฎเจธเจผเจนเฉ‚เจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจนเฉˆเฅค เจ—เฉ‹ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ†, เจ‡เจน เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ€เจ†เจ‚ เจฎเจฟเจ†เจฐเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ - cgroups, เจจเฉ‡เจฎเจธเจชเฉ‡เจธ, เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚, เจ†เจฆเจฟ, เจจเจพเจฒ เจนเฉ€ Aufs เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€ เจกเจฟเจธเจ• เจธเจชเฉ‡เจธ เจฌเจšเจพเจ‰เจฃ เจฒเจˆเฅค

เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡
เจธเจฐเฉ‹เจค: เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ†

เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ

เจธเฉฐเจธเจ•เจฐเจฃ 1.11 เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจกเฉŒเจ•เจฐ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจธเฉ‡เจตเจพ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจธเฉ€ เจœเฉ‹ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจธเจพเจฐเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจ•เจฐเจฆเจพ เจธเฉ€: เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฒเจˆ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจเจพ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ, API เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจเจพเฅค เจธเฉฐเจธเจ•เจฐเจฃ 1.11 เจฆเฉ‡ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจกเฉŒเจ•เจฐ เจจเฉ‚เฉฐ เจ•เจˆ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ† เจธเฉ€ เจœเฉ‹ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจฆเฉ‡ เจนเจจ: เจ•เฉฐเจŸเฉ‡เจจเจฐ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฒเจˆ (เจกเจฟเจธเจ• เจธเจชเฉ‡เจธ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจเจพ, เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เจฐเจจเจพ, เจจเฉˆเจŸเจตเจฐเจ• เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ, เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ, เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€) เจ…เจคเฉ‡ runC, เจ•เฉฐเจŸเฉ‡เจจเจฐ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจเจจเจตเจพเจ‡เจฐเจฎเฉˆเจ‚เจŸ, cgroups เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ€เจ†เจ‚ เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจนเฉˆเฅค เจกเฉŒเจ•เจฐ เจธเฉ‡เจตเจพ เจ†เจชเจฃเฉ‡ เจ†เจช เจฐเจนเจฟเฉฐเจฆเฉ€ เจนเฉˆ, เจชเจฐ เจนเฉเจฃ เจ‡เจน เจธเจฟเจฐเจซ เจ•เฉฐเจŸเฉ‡เจจเจฐเจก เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเฉ‡ API เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค

เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡

เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจจเจพ

เจกเฉŒเจ•เจฐ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฆเจพ เจฎเฉ‡เจฐเจพ เจฎเจจเจชเจธเฉฐเจฆ เจคเจฐเฉ€เจ•เจพ เจกเฉŒเจ•เจฐ-เจฎเจธเจผเฉ€เจจ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจฐเจฟเจฎเฉ‹เจŸ เจธเจฐเจตเจฐเจพเจ‚ (เจตเฉฑเจ–-เจตเฉฑเจ– เจ•เจฒเจพเจ‰เจกเจธ เจธเจฎเฉ‡เจค) 'เจคเฉ‡ เจกเฉŒเจ•เจฐ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเจพ เจธเจฅเจพเจชเจฟเจค เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฐเจฟเจฎเฉ‹เจŸ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ‡ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจˆ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ€ เจšเจฒเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, 2018 เจคเฉ‹เจ‚, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฎเฉเจธเจผเจ•เจฟเจฒ เจจเจพเจฒ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฒเฉ€เจจเจ•เจธ เจกเจฟเจธเจŸเจฐเฉ€เจฌเจฟเจŠเจธเจผเจจเจพเจ‚ เจฒเจˆ เจฎเจฟเจ†เจฐเฉ€ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡ - เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจœเฉ‹เฉœเจจเจพ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพเฅค

เจ‡เจน เจตเจฟเจงเฉ€ เจธเจตเฉˆเจšเจฒเจฟเจค เจธเจฅเจพเจชเจจเจพ เจฒเจˆ เจตเฉ€ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ Ansible เจœเจพเจ‚ เจนเฉ‹เจฐ เจธเจฎเจพเจจ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ, เจชเจฐ เจฎเฉˆเจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ‡เจธ เจฌเจพเจฐเฉ‡ เจตเจฟเจšเจพเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจธเจฅเจพเจชเจจเจพ 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 เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจšเฉ€เจœเจผเจพเจ‚ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจจเฉˆเฉฑเจŸเจตเจฐเจ•, เจธเจŸเฉ‹เจฐเฉ‡เจœเจผ เจกเฉ‡เจŸเจพ เจฒเจˆ เจจเจฟเจฐเฉฐเจคเจฐ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ)เฅค

เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ CICD เจฒเจˆ เจ•เจจเจตเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจ เจฒเจˆ เจตเฉ€ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฆเจฟเจฒเจšเจธเจช เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจ•เจฒเฉฑเจธเจŸเจฐ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ€ เจนเฉˆ, เจ…เจ–เฉŒเจคเฉ€ เจธเจตเฉˆเจฐเจฎ เจฎเฉ‹เจก (เจตเจฐเจœเจจ 1.12 เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจธเจตเฉˆเจฐเจฎ เจตเจœเฉ‹เจ‚ เจœเจพเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจธเฉ€), เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ•เจˆ เจธเจฐเจตเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจธเจพเจฐเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจจเฉˆเจŸเจตเจฐเจ• เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจนเฉˆ, เจ‡เฉฑเจ• เจฌเจฟเจฒเจŸ-เจ‡เจจ เจฒเฉ‹เจก เจฌเฉˆเจฒเฉˆเจ‚เจธเจฐ เจนเฉˆ, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฒเจˆ เจฐเจพเจœเจผ เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจนเฉˆ.

เจกเฉŒเจ•เจฐ เจ•เฉฐเจชเฉ‹เจœเจผ เจคเฉ‹เจ‚ YAML เจซเจพเจˆเจฒเจพเจ‚, เจฎเจพเจฎเฉ‚เจฒเฉ€ เจธเฉ‹เจงเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ…เจœเจฟเจนเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐเจพเจ‚ เจฒเจˆ เจตเจฐเจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ, เจตเฉฑเจ–-เจตเฉฑเจ– เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจ›เฉ‹เจŸเฉ‡ เจ…เจคเฉ‡ เจฎเฉฑเจงเจฎ เจ†เจ•เจพเจฐ เจฆเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐเจพเจ‚ เจฆเฉ‡ เจฐเฉฑเจ–-เจฐเจ–เจพเจ… เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจตเฉฑเจกเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐเจพเจ‚ เจฒเจˆ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเจฐเจœเฉ€เจนเฉ€ เจนเจจ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจเฉเฉฐเจก เจฎเฉ‹เจก เจฆเฉ‡ เจฐเฉฑเจ–-เจฐเจ–เจพเจ… เจฆเฉ‡ เจ–เจฐเจšเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเฉ‹เจ‚ เจตเฉฑเจง เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค RunC เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เฉฐเจŸเฉ‡เจจเจฐ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจตเจพเจคเจพเจตเจฐเจจ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจ•เจพเจŸเจพ เจ•เฉฐเจŸเฉ‡เจจเจฐ

เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ

เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจ…เจคเฉ‡ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจตเจฟเจ•เจพเจธ เจŸเฉ€เจฎ เจฒเจˆ เจ—เจฟเฉฑเจŸเจฒเฉˆเจฌ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจฎเฉˆเจ‚ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจฟเฉฐเจจ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ, เจœเจฟเจธ 'เจคเฉ‡ เจฎเฉˆเจ‚ เจตเจฟเจคเจฐเจฟเจค FS GlusterFS เจจเฉ‚เฉฐ เจตเฉ€ เจคเฉˆเจจเจพเจค เจ•เจฐเจพเจ‚เจ—เจพ; เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจตเจพเจฒเฉ€เจ…เจฎ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจคเจพเจ‚เจ—เจพ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจฆเฉ‡ เจ‡เฉฑเจ• เจจเฉเจ•เจธ-เจธเจนเจฟเจฃเจธเจผเฉ€เจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆเฅค เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฎเฉเฉฑเจ– เจญเจพเจ—: เจกเฉŒเจ•เจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€, Postgresql, Redis, GitLab Swarm เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ 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

เจธเจตเฉˆเจฐเจฎ เจฎเฉ‹เจก เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฐเจตเจฐ 'เจคเฉ‡ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจฒเฉ€เจกเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจฌเจพเจ•เฉ€ เจจเฉ‚เฉฐ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉ‹เจฃเจพ เจชเจเจ—เจพ, เจ‡เจธ เจฒเจˆ เจชเจนเจฟเจฒเฉ‡ เจธเจฐเจตเจฐ 'เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจจเฉ‚เฉฐ เจจเจ•เจฒ เจ•เจฐเจจ เจ…เจคเฉ‡ เจฆเฉ‚เจœเจฟเจ†เจ‚ 'เจคเฉ‡ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉ‹เจเจ—เฉ€เฅค

เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจ•เจฒเฉฑเจธเจŸเจฐ เจธเฉˆเฉฑเจŸเจ…เฉฑเจช, เจฎเฉˆเจ‚ 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

เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ 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

เจ…เจธเฉ€เจ‚ เจฌเจพเจนเจฐเฉ‹เจ‚ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ–เฉ‹เจฒเฉเจนเจฃ เจฒเจˆ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

03traefik.yml

version: '3.7'

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

networks:
  traefik:
    external: true

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

เจ…เจธเฉ€เจ‚ Redis เจ•เจฒเฉฑเจธเจŸเจฐ เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ‡ เจจเฉ‹เจกเจพเจ‚ 'เจคเฉ‡ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚:

# 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 เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค เจชเจฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ€เจ“เจธเฉ€ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฆเจฟเฉฑเจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ†เจ“ เจนเฉเจฃ เจกเฉŒเจ•เจฐ เจฆเฉ‡ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ.

เจชเฉ‹เจกเจฎเฉˆเจจ

เจชเฉŒเจกเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจธเจฎเฉ‚เจน เจ•เฉ€เจคเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจพเจซเจผเฉ€ เจœเจพเจฃเจฟเจ†-เจชเจ›เจพเจฃเจฟเจ† เจ‡เฉฐเจœเจฃ (เจชเฉ‹เจก, เจ‡เฉฑเจ•เจ เฉ‡ เจคเฉˆเจจเจพเจค เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ‡ เจธเจฎเฉ‚เจน)เฅค เจกเฉŒเจ•เจฐ เจฆเฉ‡ เจ‰เจฒเจŸ, เจ‡เจธ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจธเฉ‡เจตเจพ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ; เจธเจพเจฐเจพ เจ•เฉฐเจฎ เจฒเจฟเจฌเจชเฉ‹เจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ—เฉ‹ เจตเจฟเฉฑเจš เจตเฉ€ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• OCI-เจ…เจจเฉเจ•เฉ‚เจฒ เจฐเจจเจŸเจพเจˆเจฎ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ runCเฅค

เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡, เจธเจพเจฐเฉ‡

เจชเฉ‹เจกเจฎเฉˆเจจ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจกเฉŒเจ•เจฐ เจฒเจˆ เจ‰เจธ เจฆเฉ€ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ‡เจธ เจฌเจฟเฉฐเจฆเฉ‚ เจคเฉฑเจ• เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เจฟเจนเจพ เจ—เจฟเจ† เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‡ เจ‡เจธ เจฒเฉ‡เจ– เจฆเฉ‡ เจฒเฉ‡เจ–เจ• เจธเจฎเฉ‡เจค เจ‡เจธเจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เฉ€เจคเฉ€ เจนเฉˆ):

$ alias docker=podman

เจ…เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจชเฉ‹เจกเจฎเฉˆเจจ เจฆเฉ‡ เจจเจพเจฒ เจธเจฅเจฟเจคเฉ€ เจฌเจนเฉเจค เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจœเฉ‡เจ•เจฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจจเฉ‡ เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจธเฉ€, เจคเจพเจ‚ 2015 เจฆเฉ‡ เจ†เจธเจชเจพเจธ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ€ เจฆเฉเจจเฉ€เจ† (เจ“เจธเฉ€เจ†เจˆ - เจ“เจชเจจ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ‡เจจเฉ€เจธเจผเฉ€เจเจŸเจฟเจต) เจฆเฉ‡ เจฎเจพเจจเจ•เฉ€เจ•เจฐเจจ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ…เจคเฉ‡ เจฐเจจเจธเฉ€ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจšเฉฑเจฒเจฃ เจฒเจˆ เจกเฉŒเจ•เจฐ เจฆเจพ เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ: CRI-O. เจ‡เจธ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš เจชเฉ‹เจกเจฎเฉˆเจจ เจกเฉŒเจ•เจฐ เจฆเจพ เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจนเฉˆ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ 'เจคเฉ‡ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ—เจฐเฉเฉฑเจช เจ•เจฐเจจเจพ เจธเจผเจพเจฎเจฒ เจนเฉˆ, เจชเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจฎเฉเฉฑเจ– เจ‰เจฆเฉ‡เจธเจผ เจตเจพเจงเฉ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจกเฉŒเจ•เจฐ-เจธเจผเฉˆเจฒเฉ€ เจฆเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ เจนเฉˆเฅค เจธเจชเฉฑเจธเจผเจŸ เจ•เจพเจฐเจจเจพเจ‚ เจ•เจฐเจ•เฉ‡, เจ•เฉ‹เจˆ เจเฉเฉฐเจก เจฎเฉ‹เจก เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจจ เจ•เจฟ เจœเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ, เจคเจพเจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจ“.

เจธเฉˆเจŸเจฟเฉฐเจ—

Centos 7 'เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฒเจˆ, เจธเจฟเจฐเจซเจผ เจเจ•เจธเจŸเจฐเจพ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจธเจฐเจ—เจฐเจฎ เจ•เจฐเฉ‹, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ เจธเจญ เจ•เฉเจ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹:

# yum -y install podman

เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚

เจชเฉŒเจกเจฎเฉˆเจจ เจธเจฟเจธเจŸเจฎเจก เจฒเจˆ เจ‡เจ•เจพเจˆเจ†เจ‚ เจคเจฟเจ†เจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจฐเจตเจฐ เจฐเฉ€เจฌเฉ‚เจŸ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจฟเจธเจŸเจฎเจก เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš 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

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ‡เจน เจธเจฟเจธเจŸเจฎเจก เจ…เจคเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจ•เฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจชเฉŒเจก เจฆเจพ เจจเจพเจฎ เจœเจพเจ‚ เจ†เจˆเจกเฉ€ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

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

เจธเจฟเจธเจŸเจฎเจก:

# 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

เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจฟเจธเจŸเจฎเจก เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจ‡เจ•เจพเจˆ เจนเฉ‹เจฐ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเจฆเฉ‹เจ‚ เจ…เจœเจฟเจนเฉ€ เจธเฉ‡เจตเจพ เจฎเฉเฉœ เจšเจพเจฒเฉ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจคเจพเจ‚ เจชเฉเจฐเจพเจฃเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจพเจซเจผ เจ•เจฐเจจเจพ), เจ‡เจธ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจ–เฉเจฆ เจฒเจฟเจ–เจฃเฉ€เจ†เจ‚ เจชเฉˆเจฃเจ—เฉ€เจ†เจ‚เฅค

เจธเจฟเจงเจพเจ‚เจคเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจชเฉ‹เจกเจฎเฉˆเจจ เจ‡เจน เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจนเฉˆ เจ•เจฟ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ•เฉ€ เจนเจจ, เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ เจฒเจˆ เจชเฉเจฐเจพเจฃเฉ€เจ†เจ‚ เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐเฉ‹, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเฉฑเจฒ เจตเจงเฉ‹, เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจœเจพเจ‚ เจกเฉŒเจ•เจฐ เจฒเจˆ เจตเจฐเจคเฉ‹เจ‚ เจตเจฟเฉฑเจš เจ†เจธเจพเจจ เจตเจฟเจ•เจฒเจช เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹เฅค

เจ†เจฐ เจ•เฉ‡ เจŸเฉ€

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจชเฉเจฐเจพเจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจšเจฒเจพ เจ—เจฟเจ† เจฒเจ—เจญเจ— เจ›เฉ‡ เจฎเจนเฉ€เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ•เจฟ RedHat เจจเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ–เจฐเฉ€เจฆเจฟเจ† เจธเฉ€, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ‡เจธ 'เจคเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจจเจพเจฒ เจจเจนเฉ€เจ‚ เจตเจฟเจšเจพเจฐเจพเจ‚เจ—เจพเฅค เจ•เฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡, เจ‡เจธเจจเฉ‡ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจชเฉเจฐเจญเจพเจต เจ›เฉฑเจกเจฟเจ†, เจชเจฐ เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเฉ‹เจกเจฎเฉˆเจจ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจš, เจ‡เจน เจ‡เฉฑเจ• เจ•เฉฐเจฌเจพเจˆเจจ เจตเจพเจ‚เจ— เจœเจพเจชเจฆเจพ เจนเฉˆ. Rkt เจฆเฉ‡ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• CoreOS เจกเจฟเจธเจŸเฉเจฐเฉ€เจฌเจฟเจŠเจธเจผเจจ เจตเฉ€ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€ (เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจ•เฉ‹เจฒ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจกเฉŒเจ•เจฐ เจธเฉ€), เจชเจฐ เจ‡เจน เจตเฉ€ RedHat เจ–เจฐเฉ€เจฆ เจฆเฉ‡ เจฌเจพเจ…เจฆ เจธเจฎเจฐเจฅเจจ เจตเจฟเฉฑเจš เจ–เจคเจฎ เจนเฉ‹ เจ—เจฟเจ†เฅค

เจชเจฒเจพเจธ

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

เจธเจฟเฉฑเจŸเจพ

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจฌเจนเฉเจค เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ: เจ‡เฉฑเจ• เจชเจพเจธเฉ‡, เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจธเจตเจพเจฐเจฎ เจฎเฉ‹เจก เจตเจฟเฉฑเจš), เจœเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจ—เจพเจนเจ•เจพเจ‚ เจฒเจˆ เจ‰เจคเจชเจพเจฆ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ€ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เจน เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจŸเฉ€เจฎเจพเจ‚ (3-5 เจฒเฉ‹เจ•) เจฒเจˆ เจธเฉฑเจš เจนเฉˆเฅค , เจœเจพเจ‚ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ‡ เจธเจฎเฉเฉฑเจšเฉ‡ เจฒเฉ‹เจก เจฆเฉ‡ เจจเจพเจฒ, เจœเจพเจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจชเฉ‡เจšเฉ€เจฆเจ—เฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฆเฉ€ เจ‡เฉฑเจ›เจพ เจฆเฉ€ เจ˜เจพเจŸ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‰เฉฑเจš เจฒเฉ‹เจก เจธเจผเจพเจฎเจฒ เจนเจจเฅค

เจชเฉ‹เจกเจฎเฉˆเจจ เจชเฉ‚เจฐเฉ€ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ, เจชเจฐ เจ‡เจธเจฆเจพ เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจซเจพเจ‡เจฆเจพ เจนเฉˆ - เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเจพเจฒ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจตเจพเจงเฉ‚ เจŸเฉ‚เจฒ (เจฌเจฟเจฒเจกเจพเจน เจ…เจคเฉ‡ เจนเฉ‹เจฐ) เจธเจผเจพเจฎเจฒ เจนเจจเฅค เจ‡เจธ เจฒเจˆ, เจฎเฉˆเจ‚ เจ•เฉฐเจฎ เจฒเจˆ เจ‡เฉฑเจ• เจธเจพเจงเจจ เจฆเฉ€ เจšเฉ‹เจฃ เจฒเจˆ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจชเจนเฉเฉฐเจš เจ•เจฐเจพเจ‚เจ—เจพ: เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจŸเฉ€เจฎเจพเจ‚ เจฒเจˆ, เจœเจพเจ‚ เจ‡เฉฑเจ• เจธเฉ€เจฎเจค เจฌเจœเจŸ เจฆเฉ‡ เจจเจพเจฒ - เจกเฉŒเจ•เจฐ (เจธเฉฐเจญเจพเจตเฉ€ เจเฉเฉฐเจก เจฎเฉ‹เจก เจฆเฉ‡ เจจเจพเจฒ), เจ‡เฉฑเจ• เจจเจฟเฉฑเจœเฉ€ เจฒเฉ‹เจ•เจฒเจนเฉ‹เจธเจŸ 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจฒเจˆ เจตเจฟเจ•เจพเจธ เจ•เจฐเจจ เจฒเจˆ - เจชเฉ‹เจกเจฎเฉˆเจจ เจ•เจพเจฎเจฐเฉ‡เจกเจธ, เจ…เจคเฉ‡ เจนเจฐ เจ•เจฟเจธเฉ‡ เจฒเจˆ - เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธเฅค

เจฎเฉˆเจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจกเฉŒเจ•เจฐ เจจเจพเจฒ เจธเจฅเจฟเจคเฉ€ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเฉ‡เจ—เฉ€, เจ†เจ–เจผเจฐเจ•เจพเจฐ, เจ‰เจน เจชเจพเจ‡เจจเฉ€เจ…เจฐ เจนเจจ, เจ…เจคเฉ‡ เจนเฉŒเจฒเฉ€-เจนเฉŒเจฒเฉ€ เจ•เจฆเจฎ เจฆเจฐ เจ•เจฆเจฎ เจฎเจฟเจ†เจฐเฉ€ เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ, เจชเจฐ เจชเฉ‹เจกเจฎเฉˆเจจ, เจ†เจชเจฃเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚ เจฒเจˆ (เจธเจฟเจฐเจซเจผ เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ•เฉ‹เจˆ เจ•เจฒเฉฑเจธเจŸเจฐเจฟเฉฐเจ— เจจเจนเฉ€เจ‚, เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ‡ เจนเฉฑเจฒ เจนเจจ) เจญเจตเจฟเฉฑเจ– เจธเจชเจธเจผเจŸ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ‡เจนเจจเจพเจ‚ เจ–เฉ‹เจœเจพเจ‚ เจฌเจพเจฐเฉ‡ เจšเจฐเจšเจพ เจ•เจฐเจจ เจฒเจˆ เจธเจพเจฐเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉฑเจฆเจพ เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚เฅค

PS 3 เจ…เจ—เจธเจค เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ "เจกเฉŒเจ•เจฐ เจตเฉ€เจกเฉ€เจ“ เจ•เฉ‹เจฐเจธ", เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‰เจธเจฆเฉ‡ เจ•เฉฐเจฎ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ‡ เจธเจพเจฐเฉ‡ เจธเจพเจงเจจเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจพเจ‚เจ—เฉ‡: เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจเจฌเจธเจŸเจฐเฉˆเจ•เจธเจผเจจเจพเจ‚ เจคเฉ‹เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจคเฉฑเจ•, เจตเฉฑเจ–-เจตเฉฑเจ– เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจธเฉ‚เจ–เจฎเจคเจพเจตเจพเจ‚เฅค เจคเฉเจธเฉ€เจ‚ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹เจตเฉ‹เจ—เฉ‡ เจ…เจคเฉ‡ เจธเจฎเจเฉ‹เจ—เฉ‡ เจ•เจฟ เจกเฉŒเจ•เจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเฉฑเจฅเฉ‡ เจ…เจคเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เฅค เจ…เจธเฉ€เจ‚ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธ เจฆเฉ‡ เจ•เฉ‡เจธ เจตเฉ€ เจธเจพเจ‚เจเฉ‡ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจฐเจฟเจฒเฉ€เจœเจผ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจชเฉ‚เจฐเจต-เจ†เจฐเจกเจฐ เจฆเฉ€ เจ•เฉ€เจฎเจค: 5000 เจฐเฉ‚เจฌเจฒเฅค เจคเฉเจธเฉ€เจ‚ เจกเฉŒเจ•เจฐ เจตเฉ€เจกเฉ€เจ“ เจ•เฉ‹เจฐเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เฉ‹เจฐเจธ เจชเฉฐเจจเฉ‡ 'เจคเฉ‡.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹