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

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

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

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

рдХрдерд╛

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

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

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

рдбрдХрд░

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

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

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

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

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

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

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

рдпрджреНрдпрдкрд┐, 2018 рдмрд╛рдЯ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢рд╛рдпрджреИ рд╡рд┐рдХрд╕рд┐рдд рднрдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдзреЗрд░реИ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рддрд░рд┐рдХрд╛рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ - рднрдгреНрдбрд╛рд░ рдердкреЗрд░ рд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрд░ред

рдпреЛ рд╡рд┐рдзрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдерд╛рдкрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Ansible рд╡рд╛ рдЕрдиреНрдп рд╕рдорд╛рди рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрд░ рдо рдпреЛ рд▓реЗрдЦрдорд╛ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреЗрдЫреИрдиред

рд╕реНрдерд╛рдкрдирд╛ Centos 7 рдорд╛ рдЧрд░рд┐рдиреНрдЫ, рдо рд╕рд░реНрднрд░рдХреЛ рд░реВрдкрдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБ, рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рдХреЗрд╡рд▓ рддрд▓рдХрд╛ рдЖрджреЗрд╢рд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce docker-ce-cli containerd.io

рд╕реНрдерд╛рдкрдирд╛ рдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпрд╕рд▓рд╛рдИ рд╕реНрд╡рдд: рд▓реЛрдбрдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН:

# systemctl enable docker
# systemctl start docker
# firewall-cmd --zone=public --add-port=2377/tcp --permanent

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

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

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

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

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

Docker рдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ

рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрдЫрд┐, рд╣рд╛рдореА рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рдорд╛ рд╣рд╛рдореА рд╡рд┐рдХрд╛рд╕ рдЯреЛрд▓реАрдХреЛ рд▓рд╛рдЧрд┐ GitLab рд░ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рддреИрдирд╛рдд рдЧрд░реНрдиреЗрдЫреМрдВред рд╕рд░реНрднрд░рдХреЛ рд░реВрдкрдорд╛, рдо рддреАрди рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБ, рдЬрд╕рдорд╛ рдо рдердк рд░реВрдкрдорд╛ GlusterFS рд╡рд┐рддрд░рд┐рдд FS рддреИрдирд╛рдд рдЧрд░реНрдиреЗрдЫреБ, рдо рдпрд╕рд▓рд╛рдИ рдбрдХрд░ рднреЛрд▓реНрдпреБрдо рднрдгреНрдбрд╛рд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдХреЛ рдЕрд╕рдлрд▓-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рдЙрдиред рдЪрд▓рд╛рдЙрдирдХрд╛ рд▓рд╛рдЧрд┐ рдореБрдЦреНрдп рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ: рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА, Postgresql, Redis, GitLab Swarm рдХреЛ рд╢реАрд░реНрд╖рдорд╛ GitLab рд░рдирд░рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдердирдХреЛ рд╕рд╛рдеред Postgresql рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд╕рдВрдЧ рд╕реБрд░реБ рд╣реБрдиреЗрдЫ рд╕реНрдЯреЛрд▓реЛрди, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ Postgresql рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди GlusterFS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рдмрд╛рдБрдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбрд╛рдЯрд╛ GlusterFS рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫред

рд╕рдмреИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ GlusterFS рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди (рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ node1, node2, node3 рднрдирд┐рдиреНрдЫ), рддрдкрд╛рдИрдВрд▓реЗ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдлрд╛рдпрд░рд╡рд╛рд▓ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрд╡рд╢реНрдпрдХ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

# yum -y install centos-release-gluster7
# yum -y install glusterfs-server
# systemctl enable glusterd
# systemctl start glusterd
# firewall-cmd --add-service=glusterfs --permanent
# firewall-cmd --reload
# mkdir -p /srv/gluster
# mkdir -p /srv/docker
# echo "$(hostname):/docker /srv/docker glusterfs defaults,_netdev 0 0" >> /etc/fstab

рд╕реНрдерд╛рдкрдирд╛ рдкрдЫрд┐, GlusterFS рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреЗ рдХрд╛рдо рдПрдХ рдиреЛрдбрдмрд╛рдЯ рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреБрдкрд░реНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ node1:

# gluster peer probe node2
# gluster peer probe node3
# gluster volume create docker replica 3 node1:/srv/gluster node2:/srv/gluster node3:/srv/gluster force
# gluster volume start docker

рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкрд░рд┐рдгрд╛рдо рднреЛрд▓реНрдпреБрдо рдорд╛рдЙрдиреНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рдХрдорд╛рдгреНрдб рд╕рдмреИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдЪрд▓рд╛рдЙрдиреБрдкрд░реНрджрдЫ):

# mount /srv/docker

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

рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк, рдо node1 рдорд╛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдБрдЫреБ:

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

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

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

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

рджреЛрд╕реНрд░реЛ рдЖрджреЗрд╢рдХреЛ рдирддрд┐рдЬрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН, node2 рд░ node3 рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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

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

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

# docker network create --driver=overlay etcd
# docker network create --driver=overlay pgsql
# docker network create --driver=overlay redis
# docker network create --driver=overlay traefik
# docker network create --driver=overlay gitlab

рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рд╕рд░реНрднрд░рд╣рд░реВ рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЙрдБрдЫреМрдВ, рдпреЛ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдХреЗрд╣реА рд╕реЗрд╡рд╛рд╣рд░реВ рдмрд╛рдБрдзреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

# docker node update --label-add nodename=node1 node1
# docker node update --label-add nodename=node2 node2
# docker node update --label-add nodename=node3 node3

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА etcd рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, KV рднрдгреНрдбрд╛рд░рдг рдЬреБрди 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

рд╣рд╛рдореА Redis рдХреНрд▓рд╕реНрдЯрд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ, рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рднрдгреНрдбрд╛рд░рдг рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:

# mkdir -p /srv/redis

05redis.yml

version: '3.7'

services:
  redis-master:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379:6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: global
      restart_policy:
        condition: any
    volumes:
      - 'redis:/opt/bitnami/redis/etc/'

  redis-replica:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_PASSWORD=xxxxxxxxxxx
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: replicated
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: any

  redis-sentinel:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '16379'
    depends_on:
      - redis-master
      - redis-replica
    entrypoint: |
      bash -c 'bash -s <<EOF
      "/bin/bash" -c "cat <<EOF > /opt/bitnami/redis/etc/sentinel.conf
      port 16379
      dir /tmp
      sentinel monitor master-node redis-master 6379 2
      sentinel down-after-milliseconds master-node 5000
      sentinel parallel-syncs master-node 1
      sentinel failover-timeout master-node 5000
      sentinel auth-pass master-node xxxxxxxxxxx
      sentinel announce-ip redis-sentinel
      sentinel announce-port 16379
      EOF"
      "/bin/bash" -c "redis-sentinel /opt/bitnami/redis/etc/sentinel.conf"
      EOF'
    deploy:
      mode: global
      restart_policy:
        condition: any

volumes:
  redis:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "/srv/redis"

networks:
  redis:
    external: true

# docker stack deploy --compose-file 05redis.yml redis

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

06registry.yml

version: '3.7'

services:
  registry:
    image: registry:2.6
    networks:
      - traefik
    volumes:
      - registry_data:/var/lib/registry
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure
      labels:
        - traefik.enable=true
        - traefik.http.routers.registry.rule=Host(`registry.example.com`)
        - traefik.http.services.registry.loadbalancer.server.port=5000
        - traefik.docker.network=traefik

volumes:
  registry_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/registry"

networks:
  traefik:
    external: true

# mkdir /srv/docker/registry
# docker stack deploy --compose-file 06registry.yml registry

рд░ рдЕрдиреНрддрдорд╛ - GitLab:

08gitlab-runner.yml

version: '3.7'

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

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

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

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

рдХреНрд▓рд╕реНрдЯрд░ рд░ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рдЕрдиреНрддрд┐рдо рдЕрд╡рд╕реНрдерд╛:

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

рдЕрд░реВ рдХреЗ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ? https рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди Traefik рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреБрд╣реЛрд╕реН, Postgresql рд░ Redis рдХреЛ рд▓рд╛рдЧрд┐ tls рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдердкреНрдиреБрд╣реЛрд╕реНред рддрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ PoC рдХреЛ рд░реВрдкрдорд╛ рджрд┐рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЕрдм рдбрдХрд░рдХреЛ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╣реЗрд░реМрдВред

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

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

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

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

$ alias docker=podman

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

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

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

# yum -y install podman

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

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

Podman рдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ

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

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

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

systemd:

# podman generate systemd 71fc2b2a5c63
# pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
Documentation=man:podman-generate-systemd(1)
Requires=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Before=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
ExecStop=/usr/bin/podman stop -t 10 db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
ExecStop=/usr/bin/podman stop -t 10 da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
ExecStop=/usr/bin/podman stop -t 10 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3/userdata/conmon.pid

[Install]
WantedBy=multi-user.target

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

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

rkt

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

рдкреНрд▓рд╛рд╢

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

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

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

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

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

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

рд░рд┐рд▓реАрдЬ рдЕрдШрд┐ рдкреВрд░реНрд╡-рдЕрд░реНрдбрд░ рд▓рд╛рдЧрдд: 5000 rublesред рдХрд╛рд░реНрдпрдХреНрд░рдо "рдбрдХрд░ рднрд┐рдбрд┐рдпреЛ рдХреЛрд░реНрд╕" рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ рдкрд╛рдареНрдпрдХреНрд░рдо рдкреГрд╖реНрдардорд╛.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди