рдбрдХрд░ рд░ рд╕рдмреИ, рд╕рдмреИ, рд╕рдмреИ

TL;DR: рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рддреБрд▓рдирд╛ рдЧрд░реНрди рдПрдХ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди рд▓реЗрдЦ-рдЧрд╛рдЗрдбред рдбрдХрд░ рд░ рдЕрдиреНрдп рд╕рдорд╛рди рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рдХреНрд╖рдорддрд╛рд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░рд┐рдиреЗрдЫред

рдбрдХрд░ рд░ рд╕рдмреИ, рд╕рдмреИ, рд╕рдмреИ

рдпреЛ рд╕рдмреИ рдХрд╣рд╛рдБрдмрд╛рдЯ рдЖрдпреЛ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдПрдХ рд╕рд╛рдиреЛ рдЗрддрд┐рд╣рд╛рд╕

рдХрдерд╛

рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓рд╛рдИ рдЕрд▓рдЧ рдЧрд░реНрдиреЗ рдкрд╣рд┐рд▓реЛ рдкреНрд░рдЦреНрдпрд╛рдд рд╡рд┐рдзрд┐ chroot рд╣реЛред рдЙрд╣реА рдирд╛рдордХреЛ рд╕рд┐рд╕реНрдЯрдо рдХрд▓рд▓реЗ рд░реВрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫ, рдЬрд╕рд▓реЗ рдЧрд░реНрджрд╛ рдпрд╕рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд▓рд╛рдИ рдпреЛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рднрд┐рддреНрд░рдХрд╛ рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рдорд╛рддреНрд░ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рддрд░ рдпрджрд┐ рднрд┐рддреНрд░рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд▓рд╛рдИ рд╕реБрдкрд░рдпреБрдЬрд░ рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдЗрдПрдХреЛ рдЫ рднрдиреЗ, рдпреЛ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ chroot рдмрд╛рдЯ "рднрд╛рдЧреНрди" рд╕рдХреНрдЫ рд░ рдореБрдЦреНрдп рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдЫред рд╕рд╛рдереИ, рд░реВрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрдиреНрдп рд╕реНрд░реЛрддрд╣рд░реВ (RAM, рдкреНрд░реЛрд╕реЗрд╕рд░) рд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд╣реБрдБрдЪ рд╕реАрдорд┐рдд рдЫреИрдиред

рдЕрд░реНрдХреЛ рд╡рд┐рдзрд┐ рднрдиреЗрдХреЛ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдХрд░реНрдиреЗрд▓ рдореЗрдХрд╛рдирд┐рдЬрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдЯреЗрдирд░ рднрд┐рддреНрд░ рдкреВрд░реНрдг рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдЪрд▓рд╛рдЙрдиреБ рд╣реЛред рдпреЛ рд╡рд┐рдзрд┐рдХреЛ рдлрд░рдХ-рдлрд░рдХ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд╣рд░реВрдорд╛ рдлрд░рдХ-рдлрд░рдХ рдирд╛рдорд╣рд░реВ рдЫрдиреН, рддрд░ рд╕рд╛рд░ рдПрдЙрдЯреИ рд╣реЛ: рдзреЗрд░реИ рд╕реНрд╡рддрдиреНрддреНрд░ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБ, рдкреНрд░рддреНрдпреЗрдХрд▓реЗ рдореБрдЦреНрдп рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордХреЛ рд░реВрдкрдорд╛ рдПрдЙрдЯреИ рдХрд░реНрдиреЗрд▓ рдЪрд▓рд╛рдЙрдиреБред рдпрд╕рдорд╛ FreeBSD рдЬреЗрд▓рд╣рд░реВ, рд╕реЛрд▓рд╛рд░рд┐рд╕ рдЬреЛрдирд╣рд░реВ, OpenVZ, рд░ LXC рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред Linuxрдбрд┐рд╕реНрдХ рд╕реНрдкреЗрд╕рджреНрд╡рд╛рд░рд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдЕрдиреНрдп рд╕реНрд░реЛрддрд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдкрдирд┐ рдЖрдЗрд╕реЛрд▓реЗрд╕рди рдкреНрд░рджрд╛рди рдЧрд░рд┐рдиреНрдЫ; рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдкреНрд░рддреНрдпреЗрдХ рдХрдиреНрдЯреЗрдирд░рдорд╛ CPU рд╕рдордп, RAM, рд░ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрдпрд╛рдиреНрдбрд╡рд┐рдердорд╛ рд╕реАрдорд╛ рд╣реБрди рд╕рдХреНрдЫред chroot рдХреЛ рддреБрд▓рдирд╛рдорд╛, рдХрдиреНрдЯреЗрдирд░рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреБ рдмрдвреА рдЧрд╛рд╣реНрд░реЛ рдЫ, рдХрд┐рдирдХрд┐ рдХрдиреНрдЯреЗрдирд░рдорд╛ рд░рд╣реЗрдХреЛ рд╕реБрдкрд░рдпреБрдЬрд░рд╕рдБрдЧ рдХрдиреНрдЯреЗрдирд░рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рднрд╛рдЧрд╣рд░реВрдорд╛ рдорд╛рддреНрд░ рдкрд╣реБрдБрдЪ рд╣реБрдиреНрдЫред рдпрджреНрдпрдкрд┐, рдХрдиреНрдЯреЗрдирд░ рднрд┐рддреНрд░ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд▓рд╛рдИ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд░рд╛рдЦреНрдиреБ рдкрд░реНрдиреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░ рдкреБрд░рд╛рдиреЛ рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ (рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ) Linux, рдереЛрд░реИ рд╣рджрд╕рдореНрдо FreeBSD) рдХрд░реНрдиреЗрд▓ рдЖрдЗрд╕реЛрд▓реЗрд╕рди рдкреНрд░рдгрд╛рд▓реА "рдмреНрд░реЗрдХрдереНрд░реБ" рдЧрд░реНрдиреЗ рд░ рдореБрдЦреНрдп рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛ рд╢реВрдиреНрдп рд╣реБрдиреНрдЫред

рдХрдиреНрдЯреЗрдирд░рдорд╛ рдкреВрд░реНрдг рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдЪрд▓рд╛рдЙрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ (рдЗрдирд┐рд╕рд┐рдпрд▓рд╛рдЗрдЬреЗрд╕рди рд╕рд┐рд╕реНрдЯрдо, рдкреНрдпрд╛рдХреЗрдЬ рдореНрдпрд╛рдиреЗрдЬрд░, рдЖрджрд┐ рд╕рд╣рд┐рдд), рддрдкрд╛рдИрдВрд▓реЗ рд╕рд┐рдзреИ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдореБрдЦреНрдп рдХреБрд░рд╛ рднрдиреЗрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрд▓рд╛рдИ рдпреЛ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБ рд╣реЛ (рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд░ рдЕрдиреНрдп рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐)ред рдпреЛ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдХреЛ рдХрдиреНрдЯреЗрдирд░ рднрд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНтАНрдпреЛ, рдЬрд╕рдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдкреНрд░рдореБрдЦ рд░ рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдбрдХрд░ рд╣реЛред рдЕрдШрд┐рд▓реНрд▓рд╛ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рддреБрд▓рдирд╛рдорд╛, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдмреАрдЪ рднрд░реНрдЪреБрдЕрд▓ рдиреЗрдЯрд╡рд░реНрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд┐рдд рд╕рдорд░реНрдерди рд░ рдХрдиреНрдЯреЗрдирд░ рднрд┐рддреНрд░ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХреЛ рдЕрд╡рд╕реНрдерд╛ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреЗ рд╕рд╣рд┐рдд, рдЕрдзрд┐рдХ рд▓рдЪрд┐рд▓реЛ рдЖрдЗрд╕реЛрд▓реЗрд╕рди рд╕рдВрдпрдиреНрддреНрд░рд╣рд░реВрд▓реЗ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рднреМрддрд┐рдХ рд╕рд░реНрднрд░рд╣рд░реВрдмрд╛рдЯ рдПрдХрд▓, рдПрдХреАрдХреГрдд рд╡рд╛рддрд╛рд╡рд░рдг рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рдХреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк - рдореНрдпрд╛рдиреБрдЕрд▓ рд╕реНрд░реЛрдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд┐рдирд╛ред

рдбрдХрд░

рдбрдХрд░ рд╕рдмреИрднрдиреНрджрд╛ рдкреНрд░рд╕рд┐рджреНрдз рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХрдиреНрдЯреЗрдирд░рд╛рдЗрдЬреЗрд╕рди рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╣реЛред рдпреЛ рдЧреЛ рднрд╛рд╖рд╛рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рд░ рдпрд╕рд▓реЗ рдиреЗрдЯрд┐рдн рдХрд░реНрдиреЗрд▓ рдХреНрд╖рдорддрд╛рд╣рд░реВрдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред Linux тАФ cgroups, namespaces, рдХреНрд╖рдорддрд╛рд╣рд░реВ, рдЖрджрд┐, рд╕рд╛рдереИ Aufs рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВ рд░ рдбрд┐рд╕реНрдХ рдард╛рдЙрдБ рдмрдЪрдд рдЧрд░реНрди рдЕрдиреНрдп рд╕рдорд╛рдирд╣рд░реВред

рдбрдХрд░ рд░ рд╕рдмреИ, рд╕рдмреИ, рд╕рдмреИ
рд╕реНрд░реЛрдд: рд╡рд┐рдХрд┐рдорд┐рдбрд┐рдпрд╛

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рд╕рдВрд╕реНрдХрд░рдг рез.резрез рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдбрдХрд░рд▓реЗ рд╕рдмреИ рдХрдиреНрдЯреЗрдирд░ рд╕рдЮреНрдЪрд╛рд▓рдирд╣рд░реВ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрдиреЗ рдПрдХрд▓ рд╕реЗрд╡рд╛рдХреЛ рд░реВрдкрдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдереНрдпреЛ: рдХрдиреНрдЯреЗрдирд░ рдЫрд╡рд┐рд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреЗ, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреЗ, рд░ API рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрдиреЗред рд╕рдВрд╕реНрдХрд░рдг рез.резрез рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ, рдбрдХрд░рд▓рд╛рдИ рдзреЗрд░реИ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрдиреЗ рднрд╛рдЧрд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ: рдХрдиреНрдЯреЗрдирд░, рдЬрд╕рд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдХрдиреНрдЯреЗрдирд░ рдЬреАрд╡рдирдЪрдХреНрд░ (рдбрд┐рд╕реНрдХ рдЖрд╡рдВрдЯрди, рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреЗ, рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ рдЧрд░реНрдиреЗ, рд╕реБрд░реБрд╡рд╛рдд рдЧрд░реНрдиреЗ, рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ, рд░ рдХрдиреНрдЯреЗрдирд░ рд╕реНрдерд┐рддрд┐рдХреЛ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрдиреЗ), рд░ рд░рдирд╕реА, cgroups рд░ рдЕрдиреНрдп рдХрд░реНрдиреЗрд▓ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдХрдиреНрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрджрдЫред LinuxрдбрдХрд░ рд╕реЗрд╡рд╛ рдЖрдлреИрдВрдорд╛ рд░рд╣рдиреНрдЫ, рддрд░ рдЕрдм рдпрд╕рд▓реЗ рдХрдиреНрдЯреЗрдирд░рдорд╛ рдкрдард╛рдЗрдПрдХрд╛ API рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрдЫред

рдбрдХрд░ рд░ рд╕рдмреИ, рд╕рдмреИ, рд╕рдмреИ

рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рдбрдХрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдореЗрд░реЛ рдордирдкрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдбрдХрд░-рдореЗрд╕рд┐рди рд╣реЛ, рдЬрд╕рд▓реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ (рд╡рд┐рднрд┐рдиреНрди рдХреНрд▓рд╛рдЙрдбрд╣рд░реВ рд╕рд╣рд┐рдд) рдбрдХрд░рд▓рд╛рдИ рд╕рд┐рдзреИ рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рддрдкрд╛рдИрдВрд▓рд╛рдИ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рд░ рд╡рд┐рднрд┐рдиреНрди рдЖрджреЗрд╢рд╣рд░реВ рдкрдирд┐ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдЫред

рдпрджреНрдпрдкрд┐, реирежрезрео рджреЗрдЦрд┐ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓рд▓реЗ рд╡рд┐рдХрд╛рд╕ рднрдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдзреЗрд░реИрдЬрд╕реЛ рд╡рд┐рддрд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирдХ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВред 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

рдердк рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдбрдХрд░ рд╕рдореВрд╣ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬрд╕рдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ sudo рдмрд┐рдирд╛ рдбрдХрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди, рд▓рдЧрд┐рдЩ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди, рдмрд╛рд╣реНрдп API рдкрд╣реБрдБрдЪ рд╕рдХреНрд╖рдо рдЧрд░реНрди, рд░ рдердк рд╕рдЯреАрдХ рдлрд╛рдпрд░рд╡рд╛рд▓ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН (рдорд╛рдерд┐ рд░ рддрд▓рдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдЕрдиреБрдорддрд┐ рдирднрдПрдХрд╛ рд╕рдмреИ рдХреБрд░рд╛ рдирд┐рд╖реЗрдзрд┐рдд рдЫрдиреН - рдореИрд▓реЗ рд╕рд░рд▓рддрд╛ рд░ рд╕реНрдкрд╖реНрдЯрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдЫреЛрдбреЗрдХреЛ рдЫреБ), рддрд░ рдо рдпрд╣рд╛рдБ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдЬрд╛рдиреЗ рдЫреИрдиред

рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ

рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдбрдХрд░ рдореЗрд╕рд┐рдирдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рддреНрдпрд╣рд╛рдБ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрдирд┐ рдЫ, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЫрд╡рд┐рд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдг, рд╕рд╛рдереИ рдбрдХрд░ рдХрдореНрдкреЛрдЬ, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рддреИрдирд╛рддреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдг, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди YAML рдлрд╛рдЗрд▓рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд░ рдЕрдиреНрдп рд╕рдореНрдмрдиреНрдзрд┐рдд рдЪреАрдЬрд╣рд░реВ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдиреЗрдЯрд╡рд░реНрдХрд╣рд░реВ, рдбреЗрдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░рдиреНрддрд░ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВ)ред

рдпрд╕рд▓рд╛рдИ CICD рдХрд╛ рд▓рд╛рдЧрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЕрд░реНрдХреЛ рд░реЛрдЪрдХ рд╕реБрд╡рд┐рдзрд╛ рднрдиреЗрдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБ рд╣реЛ, рддрдерд╛рдХрдерд┐рдд рд╕реНрд╡рд╛рд░реНрдо рдореЛрдб (рд╕рдВрд╕реНрдХрд░рдг рез.резреи рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ рдпрд╕рд▓рд╛рдИ рдбрдХрд░ рд╕реНрд╡рд╛рд░реНрдо рднрдиреЗрд░ рдЪрд┐рдирд┐рдиреНрдереНрдпреЛ), рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдзреЗрд░реИ рд╕рд░реНрднрд░рд╣рд░реВрдмрд╛рдЯ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрд▓ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рднреЗрд▓рд╛ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд╕рдмреИ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рдорд╛рдерд┐ рднрд░реНрдЪреБрдЕрд▓ рдиреЗрдЯрд╡рд░реНрдХрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдЫ, рддреНрдпрд╣рд╛рдБ рдПрдХ рдирд┐рд░реНрдорд┐рдд рд▓реЛрдб рдмреНрдпрд╛рд▓реЗрдиреНрд╕рд░ рдЫ, рд╕рд╛рдереИ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЧреЛрдкреНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдЫред

рдбрдХрд░ рдХрдореНрдкреЛрдЬрдмрд╛рдЯ рд╕рд╛рдирд╛ рдкрд░рд┐рдорд╛рд░реНрдЬрдирд╣рд░реВ рд╕рд╣рд┐рддрдХрд╛ YAML рдлрд╛рдЗрд▓рд╣рд░реВ рддреНрдпрд╕реНрддрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрд╕рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рд╛рдирд╛ рд░ рдордзреНрдпрдо рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдХреЛ рдорд░реНрдорддрд╕рдореНрднрд╛рд░рд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдмрдирд╛рдЙрдБрдЫред рдареВрд▓рд╛ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫ, рдХрд┐рдирдХрд┐ рдЭреБрдгреНрдб рдореЛрдбрдХреЛ рдорд░реНрдордд рд▓рд╛рдЧрдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕рдХреЛ рднрдиреНрджрд╛ рдмрдвреА рд╣реБрди рд╕рдХреНрдЫред runC рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рддрдкрд╛рдИрдВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХрд╛рдЯрд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ

рдбрдХрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИ

рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрдЫрд┐, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдХреНрд▓рд╕реНрдЯрд░ рднреЗрд▓рд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рдорд╛ рд╣рд╛рдореА рд╡рд┐рдХрд╛рд╕ рдЯреЛрд▓реАрдХреЛ рд▓рд╛рдЧрд┐ GitLab рд░ Docker Registry рддреИрдирд╛рде рдЧрд░реНрдиреЗрдЫреМрдВред рдо рд╕рд░реНрднрд░рдХреЛ рд░реВрдкрдорд╛ рддреАрди рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБ, рдЬрд╕рдорд╛ рдо рдердк рд░реВрдкрдорд╛ рд╡рд┐рддрд░рд┐рдд GlusterFS рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА рддреИрдирд╛рде рдЧрд░реНрдиреЗрдЫреБ, рдо рдпрд╕рд▓рд╛рдИ docker рднреЛрд▓реНрдпреБрдо рднрдгреНрдбрд╛рд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, docker registry рдХреЛ рдЧрд▓реНрддреА-рд╕рд╣рдирд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╕реБрд░реБ рдЧрд░реНрдиред рд╕реБрд░реБрд╡рд╛рддрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдореБрдЦ рдШрдЯрдХрд╣рд░реВ: Docker Registry, 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.

рдпрд╕рд▓реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕рд░реНрднрд░ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдЧрд░реНрдЫ, рд╕реЗрд╡рд╛рд╣рд░реВ рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ, рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирдЧрд░рд┐рдПрд╕рдореНрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрджреЗрд╢рд╣рд░реВ рдиреЛрдб рез рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░рд┐рдиреЗрдЫред

рдкрд╣рд┐рд▓реЗ, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдиреЗрдЯрд╡рд░реНрдХрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:

# 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 рднрдгреНрдбрд╛рд░рдг, рдЬреБрди Traefik рд░ Stolon рдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫред Postgresql рдЬрд╕реНрддреИ, рдпреА рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдмрд╛рдБрдзрд┐рдПрдХрд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рд╕рдмреИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдпреЛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдБрдЫреМрдВ:

# mkdir -p /srv/etcd

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА etcd рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрди рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:

режрежetcd.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 рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:

режрезpgsql.yml рд▓реЗ

version: '3.7'

services:
  pgsentinel:
    image: sorintlab/stolon:master-pg10
    command:
      - gosu
      - stolon
      - stolon-sentinel
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
      - --log-level=debug
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: pause
  pgkeeper1:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper1
    command:
      - gosu
      - stolon
      - stolon-keeper
      - --pg-listen-address=pgkeeper1
      - --pg-repl-username=replica
      - --uid=pgkeeper1
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper1:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  pgkeeper2:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper2
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper2
      - --pg-repl-username=replica
      - --uid=pgkeeper2
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper2:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  pgkeeper3:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper3
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper3
      - --pg-repl-username=replica
      - --uid=pgkeeper3
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper3:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]
  postgresql:
    image: sorintlab/stolon:master-pg10
    command: gosu stolon stolon-proxy --listen-address 0.0.0.0 --cluster-name stolon-cluster --store-backend=etcdv3 --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: rollback

volumes:
  pgkeeper1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper3:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"

secrets:
  pgsql:
    file: "/srv/docker/postgres"
  pgsql_repl:
    file: "/srv/docker/replica"

networks:
  etcd:
    external: true
  pgsql:
    external: true

рд╣рд╛рдореА рдЧреЛрдкреНрдп рдХреБрд░рд╛рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫреМрдВ, рдлрд╛рдЗрд▓ рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ:

# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/replica
# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/postgres
# docker stack deploy --compose-file 01pgsql.yml pgsql

рдХреЗрд╣реА рд╕рдордп рдкрдЫрд┐ (рдХрдорд╛рдгреНрдб рдЖрдЙрдЯрдкреБрдЯ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН) рдбрдХрд░ рд╕реЗрд╡рд╛ ls, рд╕рдмреИ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рдХреНрд░рд┐рдп рдЫрдиреН) рд╣рд╛рдореА Postgresql рдХреНрд▓рд╕реНрдЯрд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ:

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

Postgresql рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рддрдпрд╛рд░реА рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ:

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

ID      LEADER
26baa11d    false
74e98768    false
a8cb002b    true

=== Active proxies ===

ID
4d233826
9f562f3b
b0c79ff1

=== Keepers ===

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

=== Cluster Info ===

Master Keeper: pgkeeper3

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

pgkeeper3 (master)
тФЬтФАpgkeeper2
тФФтФАpgkeeper1

рдмрд╛рд╣рд┐рд░рдмрд╛рдЯ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдЦреЛрд▓реНрди рдЯреНрд░рд╛рдлрд┐рдХ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

режрейtraefik.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

режрелredis.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

рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдердкреНрдиреБрд╣реЛрд╕реН:

режремregistry.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:

режреордЧрд┐рдЯрд▓реНрдпрд╛рдм-рд░рдирд░.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 рдХреЛ рд░реВрдкрдорд╛ рджрд┐рди рд╕рдХрд┐рдиреНрдЫред рдЕрдм рдбрдХрд░ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╣реЗрд░реМрдВред

рдкреЛрдбрдореНрдпрд╛рди

рдкреЛрдбрд╣рд░реВ (рдПрдХрд╕рд╛рде рддреИрдирд╛рде рдЧрд░рд┐рдПрдХрд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рд╕рдореВрд╣) рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рдмрджреНрдз рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдЕрд░реНрдХреЛ рдзреЗрд░реИ рдкреНрд░рд╕рд┐рджреНрдз рдЗрдиреНрдЬрд┐рдиред рдбрдХрд░рдХреЛ рд╡рд┐рдкрд░реАрдд, рдпрд╕рд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрди рдХреБрдиреИ рд╕реЗрд╡рд╛рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди; рд╕рдмреИ рдХрд╛рдо libpod рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдиреНрдЫред Go рдорд╛ рдкрдирд┐ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рдпрд╕рд▓рд╛рдИ рд░рдирд╕реА рдЬрд╕реНрддрд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрди OCI-рдЕрдиреБрдХреВрд▓ рд░рдирдЯрд╛рдЗрдо рдЪрд╛рд╣рд┐рдиреНрдЫред

рдбрдХрд░ рд░ рд╕рдмреИ, рд╕рдмреИ, рд╕рдмреИ

рдкреЛрдбрдореНрдпрд╛рдирд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреБ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдбрдХрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреБ рдЬрд╕реНрддреИ рд╣реЛ, рдпрд╣рд╛рдБрд╕рдореНрдо рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рдпрд╕рд░реА рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдпрд╕ рд▓реЗрдЦрдХрд╛ рд▓реЗрдЦрдХ рд╕рд╣рд┐рдд рдзреЗрд░реИрд▓реЗ рднрдиреЗрдХрд╛ рдЫрдиреН):

$ alias docker=podman

рд░ рддрдкрд╛рдИрдВ рдХрд╛рдо рдЬрд╛рд░реА рд░рд╛рдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдкреЛрдбрдореНрдпрд╛рдирдХреЛ рдЕрд╡рд╕реНрдерд╛ рдПрдХрджрдореИ рд░реЛрдЪрдХ рдЫ, рдХрд┐рдирдХрд┐ рдпрджрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдХреЛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрд▓реЗ рдбрдХрд░рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдереЗ рднрдиреЗ, рд▓рдЧрднрдЧ реирежрезрел рджреЗрдЦрд┐, рдХрдиреНрдЯреЗрдирд░ рд╕рдВрд╕рд╛рд░рдХреЛ рдорд╛рдирдХреАрдХрд░рдг (OCI - рдУрдкрди рдХрдиреНрдЯреЗрдирд░ рдЗрдирд┐рд╕рд┐рдПрдЯрд┐рдн) рд░ рдбрдХрд░рд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░ рд░ рд░рдирд╕реАрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реЗрдкрдЫрд┐, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдорд╛ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдбрдХрд░рдХреЛ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд╛рд╕ рднрдЗрд░рд╣реЗрдХреЛ рдЫ: CRI-Oред рдпрд╕ рд╕рдиреНрджрд░реНрднрдорд╛ рдкреЛрдбрдореНрдпрд╛рди рдбрдХрд░рдХреЛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ, рдЬреБрди рдХрдиреНрдЯреЗрдирд░ рд╕рдореВрд╣реАрдХрд░рдг рд╕рд╣рд┐рдд рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдХреЛ рд╕рд┐рджреНрдзрд╛рдиреНрддрд╣рд░реВрдорд╛ рдирд┐рд░реНрдорд┐рдд рдЫ, рддрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛рд╣рд░реВ рдмрд┐рдирд╛ рдбрдХрд░ рд╢реИрд▓реАрдорд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБ рд╣реЛред рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЭреБрдгреНрдб рдореЛрдб рдЫреИрди, рдХрд┐рдирдХрд┐ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рднрдиреНрдЫрдиреН рдХрд┐ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреНрд▓рд╕реНрдЯрд░ рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд▓рд┐рдиреБрд╣реЛрд╕реНред

рд╕реЗрдЯрд┐рдЩ

рдорд╛ рд╕реНрдерд╛рдкрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ Centos рен, рдХреЗрд╡рд▓ рдПрдХреНрд╕реНрдЯреНрд░рд╛ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕рдХреНрд░рд┐рдп рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

# yum -y install podman

рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ

рдкреЛрдбрдореНрдпрд╛рдирд▓реЗ systemd рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрд╛рдЗрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдЫ, рдЬрд╕рд▓реЗ рдЧрд░реНрджрд╛ рд╕рд░реНрднрд░ рд░рд┐рдмреБрдЯ рдЧрд░реЗрдкрдЫрд┐ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рд╣реБрдиреНрдЫред рдердк рд░реВрдкрдорд╛, рдХрдиреНрдЯреЗрдирд░рдорд╛ pid 1 рдХреЛ рд░реВрдкрдорд╛ systemd рдХреЛ рд╕рд╣реА рд╕рдЮреНрдЪрд╛рд▓рди рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЫреБрдЯреНрдЯреИ рдмрд┐рд▓реНрдбрд╛рд╣ рдЙрдкрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рддреНрдпрд╣рд╛рдБ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкрдирд┐ рдЫрдиреН - рдбрдХрд░-рдХрдореНрдкреЛрдЬрдХреЛ рдПрдирд╛рд▓рдЧрд╣рд░реВ, рдЬрд╕рд▓реЗ рдЕрдиреНрдп рдЪреАрдЬрд╣рд░реВрдХрд╛ рд╕рд╛рдереИ, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рдБрдЧ рдЙрдкрдпреБрдХреНрдд рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рдкреЛрдбрдореНрдпрд╛рдирдмрд╛рдЯ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдорд╛ рд╕рдВрдХреНрд░рдордгрд▓рд╛рдИ рд╕рдХреЗрд╕рдореНрдо рд╕рд░рд▓реАрдХреГрдд рдЧрд░рд┐рдПрдХреЛ рдЫред

рдкреЛрдбрдореНрдпрд╛рдирд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИ

рдХреБрдиреИ рдЭреБрдгреНрдб рдореЛрдб рдирднрдПрдХреЛрд▓реЗ (рдпрджрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдХреНрд▓рд╕реНрдЯрд░ рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ рд╣рд╛рдореА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрдиреЗрдЫреМрдВ рднрдиреНрдиреЗ рдЕрдиреБрдорд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫ), рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдорд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗрдЫреМрдВред

рдкреЛрдбрдореНрдпрд╛рди-рдХрдореНрдкреЛрдЬ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

# 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

Kubernetes:

# 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

рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреБ рдмрд╛рд╣реЗрдХ, systemd рдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрдкрдиреНрди рдПрдХрд╛рдЗрд▓реЗ рдЕрд░реВ рдХреЗрд╣реА рдЧрд░реНрджреИрди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕реНрддреЛ рд╕реЗрд╡рд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрджрд╛ рдкреБрд░рд╛рдирд╛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╕рдлрд╛ рдЧрд░реНрдиреЗ), рддреНрдпрд╕реИрд▓реЗ рддреНрдпрд╕реНрддрд╛ рдХреБрд░рд╛рд╣рд░реВ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рд▓реЗрдЦреНрдиреБрдкрд░реНрдиреЗрдЫред

рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдкреЛрдбрдореНрдпрд╛рди рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдХреЗ рд╣реБрдиреН рднрдиреЗрд░ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди, рдбрдХрд░-рдХрдореНрдкреЛрдЬрдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд░рд╛рдиреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреНрд▓рд╕реНрдЯрд░ рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рддрд░реНрдл рдЬрд╛рди, рд╡рд╛ рдбрдХрд░рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫред

рдЖрд░рдХреЗрдЯреА

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрднрд┐рд▓реЗрдЦрдорд╛ рдЧрдПрдБ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ рдХрд┐рдирднрдиреЗ рдпреЛ RedHat рджреНрд╡рд╛рд░рд╛ рдХрд┐рдирд┐рдПрдХреЛ рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдо рдпрд╕рдорд╛ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдмрд╕реНрдиреЗ рдЫреИрдиред рд╕рдордЧреНрд░рдорд╛, рдпрд╕рд▓реЗ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫрд╛рдк рдЫреЛрдбреНрдпреЛ, рддрд░ Docker рд░ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА Podman рдХреЛ рддреБрд▓рдирд╛рдорд╛, рдпреЛ рдХрдореНрдмрд╛рдЗрди рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред рддреНрдпрд╣рд╛рдБ rkt рдорд╛ рдирд┐рд░реНрдорд┐рдд CoreOS рд╡рд┐рддрд░рдг рдкрдирд┐ рдерд┐рдпреЛ (рдпрджреНрдпрдкрд┐ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рд╕реБрд░реБрдорд╛ Docker рдерд┐рдпреЛ), рддрд░ RedHat рдЦрд░рд┐рдж рдЧрд░реЗрдкрдЫрд┐ рдпрд╕рдХреЛ рд╕рдорд░реНрдерди рдкрдирд┐ рд╕рдорд╛рдкреНрдд рднрдпреЛред

рдлреНрд▓реНрдпрд╛рд╕

рдЕрдзрд┐рдХ рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬрд╕рдХреЛ рд▓реЗрдЦрдХ рдХреЗрд╡рд▓ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рд░ рдЪрд▓рд╛рдЙрди рдЪрд╛рд╣рдиреНрдереЗред рдХрд╛рдЧрдЬрд╛рдд рд░ рдХреЛрдбрдХреЛ рдЖрдзрд╛рд░рдорд╛, рд▓реЗрдЦрдХрд▓реЗ рдорд╛рдкрджрдгреНрдбрд╣рд░реВ рдкрд╛рд▓рдирд╛ рдЧрд░реЗрдирдиреН, рддрд░ рдХреЗрд╡рд▓ рдЖрдлреНрдиреИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ, рдЬреБрди рдореВрд▓ рд░реВрдкрдорд╛ рдЙрдирд▓реЗ рдЧрд░реЗред

рдирд┐рд╖реНрдХрд░реНрд╖

рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдХреЛ рдЕрд╡рд╕реНрдерд╛ рдПрдХрджрдореИ рд░реЛрдЪрдХ рдЫ: рдПрдХрд╛рддрд┐рд░, рдбрдХрд░рдХреЛ рд╕рд╛рде, рддрдкрд╛рдИрдВрд▓реЗ рдХреНрд▓рд╕реНрдЯрд░ (рдЭреБрдгреНрдб рдореЛрдбрдорд╛) рднреЗрд▓рд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬрд╕рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрдВрд▓реЗ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдкрдирд┐ рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдпреЛ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рд╕рд╛рдирд╛ рдЯреЛрд▓реАрд╣рд░реВ (рей-рел рдЬрдирд╛) рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫ, рд╡рд╛ рд╕рд╛рдиреЛ рд╕рдордЧреНрд░ рднрд╛рд░рдХреЛ рд╕рд╛рде, рд╡рд╛ рдЙрдЪреНрдЪ рднрд╛рд░рд╣рд░реВ рд╕рд╣рд┐рдд рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдЬрдЯрд┐рд▓рддрд╛рд╣рд░реВ рдмреБрдЭреНрдиреЗ рдЗрдЪреНрдЫрд╛рдХреЛ рдХрдореАрдХреЛ рд╕рд╛рдеред

рдкреЛрдбрдореНрдпрд╛рдирд▓реЗ рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрди, рддрд░ рдпрд╕рдХреЛ рдПрдЙрдЯрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдлрд╛рдЗрджрд╛ рдЫ - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рдБрдЧ рдЕрдиреБрдХреВрд▓рддрд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдХрд░рдгрд╣рд░реВ (рдмрд┐рд▓реНрдбрд╛рд╣ рд░ рдЕрдиреНрдп) рд╕рд╣рд┐рддред рддреНрдпрд╕рдХрд╛рд░рдг, рдо рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдХрд░рдгрдХреЛ рдЫрдиреЛрдЯрд▓рд╛рдИ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдореНрдмреЛрдзрди рдЧрд░реНрдиреЗрдЫреБ: рд╕рд╛рдирд╛ рдЯреЛрд▓реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рд╡рд╛ рд╕реАрдорд┐рдд рдмрдЬреЗрдЯрдХреЛ рд╕рд╛рде - рдбрдХрд░ (рд╕рдореНрднрд╛рд╡рд┐рдд рдЭреБрдгреНрдб рдореЛрдбрдХреЛ рд╕рд╛рде), рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯрдорд╛ рдЖрдлреНрдиреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди - рдкреЛрдбрдореНрдпрд╛рди рд░ рдЕрдиреНрдп, рд░ рдЕрд░реВ рд╕рдмреИрдХреЛ рд▓рд╛рдЧрд┐ - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ред

рдорд▓рд╛рдИ рдкрдХреНрдХрд╛ рдЫреИрди рдХрд┐ рдбрдХрд░рдХреЛ рдЕрд╡рд╕реНрдерд╛ рднрд╡рд┐рд╖реНрдпрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫреИрди, рдЖрдЦрд┐рд░, рддрд┐рдиреАрд╣рд░реВ рдЕрдЧреНрд░рдЧрд╛рдореА рд╣реБрдиреН, рд░ рдЪрд░рдгрдмрджреНрдз рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВ рдмрд┐рд╕реНрддрд╛рд░реИ рдорд╛рдирдХреАрдХреГрдд рд╣реБрдБрджреИрдЫрдиреН, рддрд░ рдкреЛрдбрдореНрдпрд╛рди, рдпрд╕рдХрд╛ рд╕рдмреИ рдХрдордЬреЛрд░реАрд╣рд░реВрдХреЛ рдмрд╛рд╡рдЬреБрдж (рдХреЗрд╡рд▓ рдХрд╛рдо рдЧрд░реНрджреИ) Linux, рдХреБрдиреИ рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩ, рдПрд╕реЗрдореНрдмрд▓реА рд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╣рд░реВ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рд╕рдорд╛рдзрд╛рдирд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдЧрд░рд┐рдиреНрдЫрдиреН) рднрд╡рд┐рд╖реНрдп рд╕реНрдкрд╖реНрдЯ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдо рд╕рдмреИрд▓рд╛рдИ рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рдпреА рдирд┐рд╖реНрдХрд░реНрд╖рд╣рд░реВ рдЫрд▓рдлрд▓ рдЧрд░реНрди рдЖрдордиреНрддреНрд░рд┐рдд рдЧрд░реНрджрдЫреБред

PS рдЕрдЧрд╕реНрдЯ рей рдорд╛ рд╣рд╛рдореА рд╕реБрд░реБрд╡рд╛рдд рдЧрд░реНрдЫреМрдВ "рдбрдХрд░ рднрд┐рдбрд┐рдпреЛ рдХреЛрд░реНрд╕", рдЬрд╣рд╛рдБ рддрдкрд╛рдИрдВ рдпрд╕рдХреЛ рдХрд╛рдордХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдЬрд╛рдиреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╣рд╛рдореА рдпрд╕рдХрд╛ рд╕рдмреИ рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреЗрдЫреМрдВ: рдЖрдзрд╛рд░рднреВрдд рдЕрдореВрд░реНрддрддрд╛рджреЗрдЦрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ, рд╡рд┐рднрд┐рдиреНрди OS рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╕реВрдХреНрд╖реНрдорддрд╛рд╣рд░реВред рддрдкрд╛рдИрдВ рдкреНрд░рд╡рд┐рдзрд┐рд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдиреБрд╣реБрдиреЗрдЫ рд░ рдбрдХрд░ рдХрд╣рд╛рдБ рд░ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмреБрдЭреНрдиреБрд╣реБрдиреЗрдЫред рд╣рд╛рдореА рдЙрддреНрдХреГрд╖реНрдЯ рдЕрднреНрдпрд╛рд╕ рдХреЗрд╕рд╣рд░реВ рдкрдирд┐ рд╕рд╛рдЭрд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рд░рд┐рд▓рд┐рдЬ рд╣реБрдиреБрднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ рдкреНрд░рд┐-рдЕрд░реНрдбрд░ рдореВрд▓реНрдп: релрежрежреж RUR рддрдкрд╛рдИрдВ "рдбрдХрд░рдорд╛ рднрд┐рдбрд┐рдпреЛ рдХреЛрд░реНрд╕" рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдХреЛрд░реНрд╕ рдкреГрд╖реНрдардорд╛.

рд╕реНрд░реЛрдд: www.habr.com

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рднрдПрдХрд╛ рд╕рд╛рдЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрд░рдкрд░реНрджреЛ рд╣реЛрд╕реНрдЯрд┐рдЩ рдЦрд░рд┐рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН ЁЯФе DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рднрд░рдкрд░реНрджреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдЩ рдХрд┐рдиреНрдиреБрд╣реЛрд╕реН | ProHoster