āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āϏāĻŦ, āϏāĻŦ, āϏāĻŦ

TL;DR: āĻāĻ•āϟāĻŋ āĻ“āĻ­āĻžāϰāĻ­āĻŋāω āύāĻŋāĻŦāĻ¨ā§āϧ - āĻĒāĻžāĻ¤ā§āϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇āϰ āϤ⧁āϞāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāĻ•āĻžāĨ¤ āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧂āĻĒ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āϏāĻŦ, āϏāĻŦ, āϏāĻŦ

āĻāϟāĻŋ āϕ⧋āĻĨāĻž āĻĨ⧇āϕ⧇ āĻāϏ⧇āϛ⧇ āϤāĻžāϰ āĻāĻ•āϟāĻŋ āϛ⧋āϟ āχāϤāĻŋāĻšāĻžāϏ

Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ

āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āϏ⧁āĻĒāϰāĻŋāϚāĻŋāϤ āωāĻĒāĻžāϝāĻŧ āĻšāϞ chrootāĨ¤ āĻāĻ•āχ āύāĻžāĻŽā§‡āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āϰ⧁āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ - āĻāχāĻ­āĻžāĻŦ⧇ āĻāϟāĻŋāϕ⧇ āϝ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻŦāϞāĻž āĻšāϝāĻŧ āϏ⧇āĻ–āĻžāύ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāχ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻĨāĻžāĻ•āĻž āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϤ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻĻāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āĻ­āĻŋāϤāϰ⧇ āϏ⧁āĻĒāĻžāϰ āχāωāϜāĻžāϰ āĻ…āϧāĻŋāĻ•āĻžāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝāĻ­āĻžāĻŦ⧇ chroot āĻĨ⧇āϕ⧇ "āĻĒāĻžāϞāĻžāϤ⧇" āĻāĻŦāĻ‚ āĻĒā§āϰāϧāĻžāύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āϰ⧁āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏāĻ‚āĻ¸ā§āĻĨāĻžāύ (RAM, āĻĒā§āϰāϏ⧇āϏāϰ), āϏ⧇āχāϏāĻžāĻĨ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ āύāϝāĻŧāĨ¤

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āĻšāϞ⧋ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āĻāĻ•āϟāĻŋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϚāĻžāϞāĻžāύ⧋āĨ¤ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āύāĻžāĻŽ āϰāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāϰ āĻŽā§‚āϞ āĻŦāĻŋāώāϝāĻŧ āĻāĻ•āχ: āĻāĻ•āĻžāϧāĻŋāĻ• āĻ¸ā§āĻŦāĻžāϧ⧀āύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϚāĻžāϞāĻžāύ⧋, āϝ⧇āĻ–āĻžāύ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŽā§‚āϞ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻāĻ•āχ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ FreeBSD Jails, Solaris Zones, OpenVZ, āĻāĻŦāĻ‚ LXCāĨ¤ LinuxāĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĄāĻŋāĻ¸ā§āĻ• āĻ¸ā§āĻĒ⧇āϏ āĻĻā§āĻŦāĻžāϰāĻžāχ āύāϝāĻŧ, āĻŦāϰāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϰāĻŋāϏ⧋āĻ°ā§āϏ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡āĻ“ āφāχāϏ⧋āϞ⧇āĻļāύ āĻŦāĻž āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύāϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ; āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϏāĻŋāĻĒāĻŋāχāω āϟāĻžāχāĻŽ, āĻ°â€ā§āϝāĻžāĻŽ āĻāĻŦāĻ‚ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻžāĻ¨ā§āĻĄāωāχāĻĨ⧇āϰ āωāĻĒāϰ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ chroot-āĻāϰ āϤ⧁āϞāύāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĨ⧇āϕ⧇ āĻŦ⧇āϰ āĻšāĻ“āϝāĻŧāĻž āφāϰāĻ“ āĻ•āĻ āĻŋāύ, āĻ•āĻžāϰāĻŖ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϏ⧁āĻĒāĻžāϰāχāωāϜāĻžāϰ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻŦāĻŋāώāϝāĻŧāϗ⧁āϞ⧋āϤ⧇āχ āĻĒā§āϰāĻŦ⧇āĻļāĻžāϧāĻŋāĻ•āĻžāϰ āĻĒāĻžāϝāĻŧāĨ¤ āϤāĻŦ⧇, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϭ⧇āϤāϰ⧇āϰ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϕ⧇ āφāĻĒ-āϟ⧁-āĻĄā§‡āϟ āϰāĻžāĻ–āĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻāĻŦāĻ‚ āĻĒ⧁āϰ⧋āύ⧋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•āĻžāϰāϪ⧇ (āϝāĻž āĻĒā§āϰāĻžāϏāĻ™ā§āĻ—āĻŋāĻ•) Linux(āĻ•āĻŋāϛ⧁āϟāĻž āĻ•āĻŽ āĻŽāĻžāĻ¤ā§āϰāĻžāϝāĻŧ FreeBSD-āĻāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇) āĻ•āĻžāĻ°ā§āύ⧇āϞ āφāχāϏ⧋āϞ⧇āĻļāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϭ⧇āĻĻ āĻ•āϰ⧇ āĻŽā§‚āϞ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĒā§āϰāĻŦ⧇āĻļāĻžāϧāĻŋāĻ•āĻžāϰ āĻĒāĻžāĻ“āϝāĻŧāĻžāϰ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻļā§‚āĻ¨ā§āϝ āύāϝāĻŧāĨ¤

āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ¤ā§āϰ⧇ āĻāĻ•āϟāĻŋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϚāĻžāϞ⧁ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ (āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻžāϰāĻŽā§āĻ­āĻŋāĻ• āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ, āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϕ⧇āϜ āĻŽā§āϝāĻžāύ⧇āϜāĻžāϰ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āϏāĻš), āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āϚāĻžāϞ⧁ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āĻĒā§āϰāϧāĻžāύ āϜāĻŋāύāĻŋāϏāϟāĻŋ āĻāχ āϏ⧁āϝ⧋āϗ⧇āϰ āϏāĻžāĻĨ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž (āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϰ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĢāĻžāχāϞ). āĻāχ āϧāĻžāϰāĻŖāĻžāϟāĻŋ āĻ•āύāĻŸā§‡āχāύāĻžāϰāĻžāχāϜāĻĄ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞāĻžāχāĻœā§‡āĻļāύ⧇āϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĻ›āĻŋāϞ, āϝāĻžāϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦāĻŋāĻļāĻŋāĻˇā§āϟ āĻāĻŦāĻ‚ āϏ⧁āĻĒāϰāĻŋāϚāĻŋāϤ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋ āĻšāϞ⧇āύ āĻĄāĻ•āĻžāϰāĨ¤ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϤ⧁āϞāύāĻžāϝāĻŧ, āφāϰāĻ“ āύāĻŽāύ⧀āϝāĻŧ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύāϤāĻž āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž, āĻāĻ•āĻ¤ā§āϰ⧇ āĻ•āύāĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āϏāĻŽāĻ°ā§āĻĨāύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻ¸ā§āĻŸā§‡āϟāĻĢ⧁āϞāύ⧇āϏ⧇āϰ āĻĢāϞ⧇, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϚ⧁āϰ āϏāĻ‚āĻ–ā§āϝāĻ• āϭ⧌āϤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ• āĻĒāϰāĻŋāĻŦ⧇āĻļ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž - āĻ›āĻžāĻĄāĻŧāĻžāχ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻžāĨ¤

āĻĄāĻ•āĻļā§āϰāĻŽāĻŋāĻ•

āĻĄāĻ•āĻžāϰ āĻšāϞ⧋ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏ⧁āĻĒāϰāĻŋāϚāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻžāχāĻœā§‡āĻļāύ āϏāĻĢāϟāĻ“āϝāĻŧā§āϝāĻžāϰāĨ¤ āĻāϟāĻŋ āĻ—ā§‹ (Go) āĻ­āĻžāώāĻžāϝāĻŧ āϞ⧇āĻ–āĻž āĻāĻŦāĻ‚ āύ⧇āϟāĻŋāĻ­ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇āϰ āϏāĻ•ā§āώāĻŽāϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ Linux āĻĄāĻŋāĻ¸ā§āϕ⧇āϰ āϜāĻžāϝāĻŧāĻ—āĻž āĻŦāĻžāρāϚāĻžāϤ⧇ āϏāĻŋāĻ—ā§āϰ⧁āĻĒāϏ (cgroups), āύ⧇āĻŽāĻ¸ā§āĻĒ⧇āϏ⧇āϏ (namespaces), āĻ•ā§āϝāĻžāĻĒāĻžāĻŦāĻŋāϞāĻŋāϟāĻŋāϏ (capabilities) āχāĻ¤ā§āϝāĻžāĻĻāĻŋ, āϏ⧇āχāϏāĻžāĻĨ⧇ āφāωāĻĢāϏ (Aufs) āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧂āĻĒ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āϏāĻŦ, āϏāĻŦ, āϏāĻŦ
āϏ⧂āĻ¤ā§āϰ: āωāχāĻ•āĻŋāĻŽāĻŋāĻĄāĻŋāϝāĻŧāĻž

āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ

āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ ā§§.ā§§ā§§-āĻāϰ āφāϗ⧇, āĻĄāĻ•āĻžāϰ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ āϝāĻž āϏāĻŽāĻ¸ā§āϤ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ: āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āχāĻŽā§‡āϜ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϚāĻžāϞ⧁ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻāĻĒāĻŋāφāχ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāĨ¤ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ ā§§.ā§§ā§§ āĻĨ⧇āϕ⧇, āĻĄāĻ•āĻžāϰāϕ⧇ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒāϰāĻ¸ā§āĻĒāϰ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āϝ⧁āĻ•ā§āϤ āĻ…āĻ‚āĻļ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇: āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻĄāĻŋ (containerd), āϝāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻœā§€āĻŦāύāϚāĻ•ā§āϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧇ (āĻĄāĻŋāĻ¸ā§āĻ• āĻŦāϰāĻžāĻĻā§āĻĻ, āχāĻŽā§‡āϜ āĻĄāĻžāωāύāϞ⧋āĻĄ, āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚, āϚāĻžāϞ⧁ āĻ•āϰāĻž, āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ), āĻāĻŦāĻ‚ āϰāĻžāύāϏāĻŋ (runC), āϝāĻž āϏāĻŋāĻ—ā§āϰ⧁āĻĒāϏ (cgroups) āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āϤ⧈āϰāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϰāĻžāύāϟāĻžāχāĻŽ āĻĒāϰāĻŋāĻŦ⧇āĻļāĨ¤ LinuxāĻĄāĻ•āĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϟāĻŋ āĻāĻ–āύāĻ“ āϰāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ–āύ āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻĄāĻŋ-āϤ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻāĻĒāĻŋāφāχ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞ⧋ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰāĻžāϰ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āϏāĻŦ, āϏāĻŦ, āϏāĻŦ

āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ āĻ“ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

āĻĄāĻ•āĻžāϰ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻžāϰ āφāĻŽāĻžāϰ āĻĒā§āϰāĻŋāϝāĻŧ āωāĻĒāĻžāϝāĻŧ āĻš'āϞ āĻĄāĻ•āĻžāϰ-āĻŽā§‡āĻļāĻŋāύ, āϝāĻž āĻĻā§‚āϰāĻŦāĻ°ā§āϤ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ (āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻš) āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻ•āĻžāϰ āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āφāĻĒāύāĻžāϕ⧇ āϰāĻŋāĻŽā§‹āϟ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ“ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϤāĻŦ⧇, ⧍ā§Ļā§§ā§Ž āϏāĻžāϞ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋāϰ āϤ⧇āĻŽāύ āϕ⧋āύ⧋ āωāĻ¨ā§āύāϝāĻŧāύ āĻšāϝāĻŧāύāĻŋ, āϤāĻžāχ āφāĻŽāϰāĻž āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϚāϞāĻŋāϤ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇āχ āĻāϟāĻŋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻŦāĨ¤ Linux āĻĒāĻĻā§āϧāϤāĻŋ - āĻāĻ•āϟāĻŋ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϝ⧋āĻ— āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒā§āϝāĻžāϕ⧇āϜāϗ⧁āϞ⧋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡āĨ¤

āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝāĻ“ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, Ansible āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧂āĻĒ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻŋ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇ āĻāϟāĻŋ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻŦ āύāĻžāĨ¤

āĻ¸ā§āĻĨāĻžāĻĒāύāϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻž āĻšāĻŦ⧇ Centos ā§­, āφāĻŽāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ, āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻšā§‡āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞ⧋ āϚāĻžāϞāĻžāϞ⧇āχ āϝāĻĨ⧇āĻˇā§āϟ:

# 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 āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇, āφāĻĒāύāĻŋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻ•āϟāĻž āĻĒāĻžāĻ¤ā§āϰ⧇

āĻĄāĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž

āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ āĻāĻŦāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻĒāϰ⧇, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ āϝ⧇āĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āωāĻ¨ā§āύāϝāĻŧāύ āĻĻāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āĻāĻŦāĻ‚ āĻĄāĻ•āĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻŦāĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇, āφāĻŽāĻŋ āϤāĻŋāύāϟāĻŋ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ, āϝāĻžāϰ āωāĻĒāϰ āφāĻŽāĻŋ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ GlusterFS āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž FS āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻŦ, āφāĻŽāĻŋ āĻāϟāĻŋāϕ⧇ āĻĄāĻ•āĻžāϰ āĻ­āϞāĻŋāωāĻŽ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĄāĻ•āĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāϰ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨ-āύāĻŋāϰāĻžāĻĒāĻĻ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝāĨ¤ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻŽā§‚āϞ āωāĻĒāĻžāĻĻāĻžāύ: āĻĄāĻ•āĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ, āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏāĻ•āĻŋāωāĻāϞ, āϰ⧇āĻĄāĻŋāϏ, āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϏ⧋āϝāĻŧāĻžāĻ°ā§āĻŽā§‡āϰ āωāĻĒāϰ⧇ āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ āϰāĻžāύāĻžāϰ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇āĨ¤ 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.

āĻāϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰ⧇, āφāϏ⧁āύ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻŋ, āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āύāĻž āĻĨāĻžāĻ•āϞ⧇, āύ⧋āĻĄ 1 āĻĨ⧇āϕ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞāĻŋ āϚāĻžāϞ⧁ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

āĻĒā§āϰāĻĨāĻŽāϤ, āĻ•āύāĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžāĻ•:

# 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 āĻĄā§‡āϟāĻž āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ, āϕ⧇āĻ­āĻŋ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āϝāĻž Traefik āĻāĻŦāĻ‚ Stolon āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ 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

āφāĻŽāϰāĻž āϰ⧇āĻĄāĻŋāϏ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋ, āĻāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āϏāĻŽāĻ¸ā§āϤ āύ⧋āĻĄā§‡ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ:

# 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

āĻāĻŦāĻ‚ āĻ…āĻŦāĻļ⧇āώ⧇ - āĻ—āĻŋāϟāĻ˛ā§āϝāĻžāĻŦ:

08gitlab-runner.yml

version: '3.7'

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

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

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

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

āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϰ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ…āĻŦāĻ¸ā§āĻĨāĻž:

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

āφāϰ āĻ•āĻŋ āωāĻ¨ā§āύāϤāĻŋ āĻ•āϰāĻž āϝāĻžāϝāĻŧ? https āĻĒāĻžāĻ¤ā§āϰ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Traefik āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻž, Postgresql āĻāĻŦāĻ‚ Redis āĻāϰ āϜāĻ¨ā§āϝ tls āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āφāĻĒāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻāϟāĻŋ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻāĻ•āϟāĻŋ PoC āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāϏ⧁āύ āĻāĻ–āύ āĻĄāĻ•āĻžāϰ⧇āϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻŋāĨ¤

āĻĒā§‹āĻĄāĻŽā§āϝāĻžāύ

āĻĒāĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻ—ā§‹āĻˇā§āĻ ā§€āĻŦāĻĻā§āϧ āĻĒāĻžāĻ¤ā§āϰ⧇ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āφāϰ⧇āĻ•āϟāĻŋ āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋ āϏ⧁āĻĒāϰāĻŋāϚāĻŋāϤ āχāĻžā§āϜāĻŋāύ (āĻĒāĻĄ, āĻāĻ•āĻ¤ā§āϰ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻĒāĻžāĻ¤ā§āϰ⧇āϰ āĻĻāϞ)āĨ¤ āĻĄāĻ•āĻžāϰ⧇āϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇, āĻĒāĻžāĻ¤ā§āϰ⧇ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āϕ⧋āύāĻ“ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ āύāĻž, āϏāĻŽāĻ¸ā§āϤ āĻ•āĻžāϜ āϞāĻŋāĻŦāĻĒāĻĄ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ Go-āϤ⧇ āϞ⧇āĻ–āĻž, runC-āĻāϰ āĻŽāϤ⧋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ OCI āĻ•āĻŽāĻĒā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϰāĻžāύāϟāĻžāχāĻŽ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤

āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āϏāĻŦ, āϏāĻŦ, āϏāĻŦ

āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇ āĻĒāĻĄāĻŽā§āϝāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž āĻĄāĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĻ⧃āĻļā§āϝāĻĒā§‚āĻ°ā§āĻŖ, āϝ⧇ āĻĒāϰāĻŋāĻŽāĻžāϪ⧇ āφāĻĒāύāĻŋ āĻāϟāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ (āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āϞ⧇āĻ–āĻ• āϏāĻš āĻ…āύ⧇āϕ⧇āχ āĻāϟāĻŋ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇āϛ⧇āύ āĻŦāϞ⧇ āĻĻāĻžāĻŦāĻŋ āĻ•āϰ⧇āϛ⧇āύ):

$ alias docker=podman

āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āĻ•āĻžāϜ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āĻĒāĻĄāĻŽā§āϝāĻžāύ⧇āϰ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āϖ⧁āĻŦāχ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ, āĻ•āĻžāϰāĻŖ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖāϗ⧁āϞāĻŋ āϝāĻĻāĻŋ āĻĄāĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āĻĒā§āϰāĻžāϝāĻŧ 2015 āϏāĻžāϞ āĻĨ⧇āϕ⧇, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻ“āϝāĻŧāĻžāĻ°ā§āĻ˛ā§āĻĄāϕ⧇ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄāĻžāχāϜ āĻ•āϰāĻžāϰ āĻĒāϰ (āĻ“āϏāĻŋāφāχ - āĻ“āĻĒ⧇āύ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āχāύāĻŋāĻļāĻŋāϝāĻŧ⧇āϟāĻŋāĻ­) āĻāĻŦāĻ‚ āĻĄāĻ•āĻžāϰāϕ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻĄ āĻāĻŦāĻ‚ āϰāĻžāύāϏāĻŋ-āϤ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰāĻžāϰ āĻĒāϰ, āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϕ⧁āĻŦāĻžāϰāύ⧇āĻŸā§‡ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĄāĻ•āĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇: CRI-OāĨ¤ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āĻĒāĻĄāĻŽā§āϝāĻžāύ āĻšāϞ āĻĄāĻ•āĻžāϰ⧇āϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻ—ā§āϰ⧁āĻĒāĻŋāĻ‚ āϏāĻš āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āύ⧀āϤāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻŽāĻŋāϤ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻŽā§‚āϞ āϞāĻ•ā§āĻˇā§āϝ āĻšāϞ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ›āĻžāĻĄāĻŧāĻžāχ āĻĄāĻ•āĻžāϰ-āĻ¸ā§āϟāĻžāχāϞ⧇āϰ āĻĒāĻžāĻ¤ā§āϰ āϚāĻžāϞāĻžāύ⧋āĨ¤ āϏ⧁āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•āĻžāϰāϪ⧇, āϕ⧋āύāĻ“ āĻāĻžāρāĻ• āĻŽā§‹āĻĄ āύ⧇āχ, āϝ⧇āĻšā§‡āϤ⧁ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āϰāĻž āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻŦāϞ⧇ āϝ⧇ āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ āϤāĻŦ⧇ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ āύāĻŋāύāĨ¤

āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ Centos ā§­, āĻļ⧁āϧ⧁ āĻāĻ•ā§āϏāĻŸā§āϰāĻžāϏ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϟāĻŋ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āĻāχ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ:

# yum -y install podman

āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ

āĻĒāĻĄāĻŽā§āϝāĻžāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻĄā§‡āϰ āϜāĻ¨ā§āϝ āχāωāύāĻŋāϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻāχāĻ­āĻžāĻŦ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϰāĻŋāĻŦ⧁āϟ āĻ•āϰāĻžāϰ āĻĒāϰ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āĨ¤ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤāĻ­āĻžāĻŦ⧇, systemd āϕ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ pid 1 āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻŦāĻŋāĻ˛ā§āĻĄāĻžāĻš āϟ⧁āϞ āϰāϝāĻŧ⧇āϛ⧇, āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āϰāϝāĻŧ⧇āϛ⧇ āϤ⧃āϤ⧀āϝāĻŧ-āĻĒāĻ•ā§āώ⧇āϰ āϏāϰāĻžā§āϜāĻžāĻŽ - āĻĄāĻ•āĻžāϰ-āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āϰ āĻ…ā§āϝāĻžāύāĻžāϞāĻ—āϗ⧁āϞāĻŋ, āϝāĻž āϕ⧁āĻŦāĻžāϰāύ⧇āĻŸā§‡āϏ-āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇, āϤāĻžāχ āĻĒāĻĄāĻŽā§āϝāĻžāύ āĻĨ⧇āϕ⧇ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āϝāϤāϟāĻž āϏāĻŽā§āĻ­āĻŦ āϏāĻšāϜāĨ¤

āĻĒāĻĄāĻŽā§āϝāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻ›āĻŋ

āϝ⧇āĻšā§‡āϤ⧁ āϕ⧋āύ āĻāĻžāρāĻ• āĻŽā§‹āĻĄ āύ⧇āχ (āϕ⧋āύ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϞ⧇ āĻāϟāĻŋ āϕ⧁āĻŦāĻžāϰāύ⧇āĻŸā§‡ āĻ¸ā§āϝ⧁āχāϚ āĻ•āϰāĻžāϰ āĻ•āĻĨāĻž), āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āφāϞāĻžāĻĻāĻž āĻĒāĻžāĻ¤ā§āϰ⧇ āĻāĻ•āĻ¤ā§āϰ āĻ•āϰāĻŦāĨ¤

āĻĒāĻĄāĻŽā§āϝāĻžāύ-āĻ•āĻŽā§āĻĒā§‹āϜ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ:

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

āĻĒāĻĄāĻŽā§āϝāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻžāĻĒā§āϤ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻĢāĻžāχāϞāϟāĻŋ āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻ­āĻŋāĻ¨ā§āύ, āϝ⧇āĻŽāύ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻ­āϞāĻŋāωāĻŽ āĻŦāĻŋāĻ­āĻžāĻ— āϏāϰāĻžāϏāϰāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻŦāĻŋāĻ­āĻžāϗ⧇ āϏāϰāĻžāϤ⧇ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤

gitlab-podman.yml

version: '3.7'

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

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

networks:
  gitlab:

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

āĻ•āĻžāĻœā§‡āϰ āĻĢāϞāĻžāĻĢāϞ:

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

āϚāϞ⧁āύ āĻĻ⧇āĻ–āĻŋ āĻāϟāĻŋ systemd āĻāĻŦāĻ‚ kubernetes-āĻāϰ āϜāĻ¨ā§āϝ āϕ⧀ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇, āĻāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻĄā§‡āϰ āύāĻžāĻŽ āĻŦāĻž āφāχāĻĄāĻŋ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇:

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

āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ:

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

āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻĄ:

# 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

āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāĻŦāĻļāϤ, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϚāĻžāϞ⧁ āĻ•āϰāĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻĄā§‡āϰ āϜāĻ¨ā§āϝ āωāĻ¤ā§āĻĒāĻ¨ā§āύ āχāωāύāĻŋāϟ āĻ…āĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āĻ•āϰ⧇ āύāĻž (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāχ āϧāϰāύ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻšāϞ⧇ āĻĒ⧁āϰāĻžāύ⧋ āĻĒāĻžāĻ¤ā§āϰ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻž), āϤāĻžāχ āφāĻĒāύāĻžāϕ⧇ āĻāχ āϧāϰāύ⧇āϰ āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋ āύāĻŋāĻœā§‡āϕ⧇ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āύ⧀āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋ āϕ⧀ āϤāĻž āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒāĻĄāĻŽā§āϝāĻžāύ āϝāĻĨ⧇āĻˇā§āϟ, āĻĄāĻ•āĻžāϰ-āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĒ⧁āϰāĻžāύ⧋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āĻĻāĻŋāϕ⧇ āϝāĻžāύ, āϝāĻĻāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ, āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇, āĻŦāĻž āĻĄāĻ•āĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻšāĻœā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝ⧋āĻ—ā§āϝ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĒāĻžāύ⧎

rkt

āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āφāĻ°ā§āĻ•āĻžāχāϭ⧇ āϗ⧇āϛ⧇ āĻĒā§āϰāĻžāϝāĻŧ āĻ›āϝāĻŧ āĻŽāĻžāϏ āφāϗ⧇ āϰ⧇āĻĄāĻšā§āϝāĻžāϟ āĻāϟāĻŋ āϕ⧇āύāĻžāϰ āĻ•āĻžāϰāϪ⧇, āϤāĻžāχ āφāĻŽāĻŋ āĻāϟāĻŋāϤ⧇ āφāϰāĻ“ āĻŦāĻŋāĻļāĻĻ⧇ āĻĨāĻžāĻ•āĻŦ āύāĻžāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϖ⧁āĻŦ āĻ­āĻžāϞ āĻ›āĻžāĻĒ āĻĢ⧇āϞ⧇āϛ⧇, āϤāĻŦ⧇ āĻĄāĻ•āĻžāϰ⧇āϰ āϤ⧁āϞāύāĻžāϝāĻŧ, āĻāĻŦāĻ‚ āφāϰāĻ“ āĻŦ⧇āĻļāĻŋ āĻĒāĻĄāĻŽā§āϝāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻŽā§āĻŦāĻŋāύ⧇āϰ āĻŽāϤ⧋ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤ Rkt āĻāϰ āωāĻĒāϰ⧇ āĻāĻ•āϟāĻŋ CoreOS āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ (āϝāĻĻāĻŋāĻ“ āϤāĻžāĻĻ⧇āϰ āĻŽā§‚āϞāϤ āĻĄāĻ•āĻžāϰ āĻ›āĻŋāϞ), āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāϟāĻŋāĻ“ RedHat āϕ⧇āύāĻžāϰ āĻĒāϰ⧇ āĻļ⧇āώ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤

āĻĒāϞāĻžāĻļ

āĻ…āϧāĻŋāĻ• āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ, āϝāĻžāϰ āϞ⧇āĻ–āĻ• āĻļ⧁āϧ⧁ āĻĒāĻžāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϚāĻžāϞāĻžāϤ⧇ āĻšā§‡āϝāĻŧ⧇āĻ›āĻŋāϞ⧇āύāĨ¤ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻāĻŦāĻ‚ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāϚāĻžāϰ āĻ•āϰ⧇, āϞ⧇āĻ–āĻ• āĻŽāĻžāύāϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύāύāĻŋ, āϤāĻŦ⧇ āϕ⧇āĻŦāϞ āύāĻŋāĻœā§‡āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āϞ⧇āĻ–āĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ⧇āύ, āϝāĻž āύ⧀āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇ āϤāĻŋāύāĻŋ āĻ•āϰ⧇āĻ›āĻŋāϞ⧇āύāĨ¤

āϤāĻĨā§āϝāĻ“

āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āϖ⧁āĻŦ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ: āĻāĻ•āĻĻāĻŋāϕ⧇, āĻĄāĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ (āϏ⧋āϝāĻŧāĻžāĻ°ā§āĻŽ āĻŽā§‹āĻĄā§‡) āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϝāĻžāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āφāĻĒāύāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āωāĻ¤ā§āĻĒāĻžāĻĻāύ āĻĒāϰāĻŋāĻŦ⧇āĻļāĻ“ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāϟāĻŋ āĻŦāĻŋāĻļ⧇āώāϤ āϛ⧋āϟ āĻĻāϞāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϏāĻ¤ā§āϝ (3-5 āϜāύ ), āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟāĻŋ āϛ⧋āϟ āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ• āϞ⧋āĻĄ āϏāĻš, āĻŦāĻž āωāĻšā§āϚ āϞ⧋āĻĄ āϏāĻš Kubernetes āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āϜāϟāĻŋāϞāϤāĻž āĻŦā§‹āĻāĻžāϰ āχāĻšā§āĻ›āĻžāϰ āĻ…āĻ­āĻžāĻŦāĨ¤

āĻĒāĻĄāĻŽā§āϝāĻžāύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āύāĻž, āϤāĻŦ⧇ āĻāϟāĻŋāϰ āĻāĻ•āϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϏ⧁āĻŦāĻŋāϧāĻž āϰāϝāĻŧ⧇āϛ⧇ - āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϏāϰāĻžā§āϜāĻžāĻŽ (āĻŦāĻŋāĻ˛ā§āĻĄāĻžāĻš āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ) āϏāĻš āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻ…āϤāĻāĻŦ, āφāĻŽāĻŋ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāϰāĻžā§āϜāĻžāĻŽā§‡āϰ āĻĒāĻ›āĻ¨ā§āĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰāĻŦ: āϛ⧋āϟ āĻĻāϞāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ, āĻŦāĻž āĻāĻ•āϟāĻŋ āϏ⧀āĻŽāĻŋāϤ āĻŦāĻžāĻœā§‡āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ - āĻĄāĻ•āĻžāϰ (āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻāĻžāρāĻ• āĻŽā§‹āĻĄ āϏāĻš), āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϞ⧋āĻ•āĻžāϞāĻšā§‹āĻ¸ā§āĻŸā§‡ āύāĻŋāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ - āĻĒāĻĄāĻŽā§āϝāĻžāύ āĻ•āĻŽāϰ⧇āĻĄāϏ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝ āϏāĻŦāĻžāϰ āϜāĻ¨ā§āϝ - āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏāĨ¤

āφāĻŽāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āύāχ āϝ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻĄāĻ•āĻžāϰ⧇āϰ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāĻĻāϞāĻžāĻŦ⧇ āύāĻž, āĻ•āĻžāϰāĻŖ āϤāĻžāϰāĻž āĻĒāĻĨāĻŋāĻ•ā§ƒā§Ž āĻāĻŦāĻ‚ āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āϤāĻžāϰāĻž āĻ•ā§āϰāĻŽāĻžāĻ¨ā§āĻŦāϝāĻŧ⧇ āĻŽāĻžāύāϏāĻŽā§āĻŽāϤ āĻšāϝāĻŧ⧇ āωāĻ āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒāĻĄāĻŽā§āϝāĻžāύ, āϤāĻžāϰ āϏāĻŽāĻ¸ā§āϤ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āϏāĻ¤ā§āĻ¤ā§āĻŦ⧇āĻ“ (āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇) Linux(āϝ⧇āĻšā§‡āϤ⧁ āϕ⧋āύ⧋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰāĻŋāĻ‚, āĻ…ā§āϝāĻžāϏ⧇āĻŽā§āĻŦāϞāĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āϝāĻ•ā§āϰāĻŽ āĻĨāĻžāĻ°ā§āĻĄ-āĻĒāĻžāĻ°ā§āϟāĻŋ āϏāϞāĻŋāωāĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ āύāĻž) āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž āφāϰāĻ“ āĻ¸ā§āĻĒāĻˇā§āϟ, āϤāĻžāχ āφāĻŽāĻŋ āϏāĻŦāĻžāχāϕ⧇ āĻ•āĻŽā§‡āĻ¨ā§āĻŸā§‡ āĻāχ āĻĢāϞāĻžāĻĢāϞāϗ⧁āϞ⧋ āύāĻŋāϝāĻŧ⧇ āφāϞ⧋āϚāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ āϜāĻžāύāĻžāĻšā§āĻ›āĻŋāĨ¤

āĻĻā§āϰāĻˇā§āϟāĻŦā§āϝ 3 āφāĻ—āĻ¸ā§āϟ āφāĻŽāϰāĻž āϚāĻžāϞ⧁ āĻ•āϰāĻŋ "āĻĄāĻ•āĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āϕ⧋āĻ°ā§āϏāϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ āϤāĻžāϰ āĻ•āĻžāϜ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϜāĻžāύāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ āφāĻŽāϰāĻž āĻāϰ āϏāĻŽāĻ¸ā§āϤ āϏāϰāĻžā§āϜāĻžāĻŽ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰāĻŦ: āĻŽā§ŒāϞāĻŋāĻ• āĻŦāĻŋāĻŽā§‚āĻ°ā§āϤāϤāĻž āĻĨ⧇āϕ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ, āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāĻŦāĻ‚ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāώāĻžāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϏ⧂āĻ•ā§āĻˇā§āĻŽāϤāĻžāĨ¤ āφāĻĒāύāĻŋ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāϚāĻŋāϤ āĻšāĻŦ⧇āύ āĻāĻŦāĻ‚ āϕ⧋āĻĨāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĄāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ āφāĻŽāϰāĻž āϏ⧇āϰāĻž āĻ…āύ⧁āĻļā§€āϞāύ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āĻ“ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāĻŦāĨ¤

āĻŽā§āĻ•ā§āϤāĻŋāϰ āφāϗ⧇ āĻĒā§āϰāĻŋ-āĻ…āĻ°ā§āĻĄāĻžāϰ āĻ–āϰāϚ: 5000 āϰ⧁āĻŦ⧇āϞāĨ¤ "āĻĄāĻ•āĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āϕ⧋āĻ°ā§āϏ" āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āϕ⧋āĻ°ā§āϏ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ.

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster