TL; DR: ΠΠ±Π·ΠΎΡΠ½ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° ΡΡΠ°Π²Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°ΠΌΠΊΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. Π©Π΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Docker ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ.
ΠΠ°Π»ΠΊΠΎ ΠΈΡΡΠΎΡΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΎΡΠΊΡΠ΄Π΅ ΠΈΠ΄Π²Π° Π²ΡΠΈΡΠΊΠΎ
ΠΡΡΠΎΡΠΈΡ
ΠΡΡΠ²ΠΈΡΡ Π΄ΠΎΠ±ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ chroot. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΡΡΡ ΡΡΡΠΎΡΠΎ ΠΈΠΌΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½Π° - ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π³ΠΎ Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π»Π°, ΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏ ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΡΠ°Π·ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ. ΠΠΎ Π°ΠΊΠΎ Π΄Π°Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΏΠΎΠ»ΡΡΠΈ Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π½Π° root, ΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° βΠΈΠ·Π±ΡΠ³Π°β ΠΎΡ chroot ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΡΡΡΠΈ (RAM, ΠΏΡΠΎΡΠ΅ΡΠΎΡ), ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄ΠΎΡΡΡΠΏΡΡ Π΄ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π΅ ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ.
Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈΡΠ΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Π½ΠΎ ΡΡΡΠ½ΠΎΡΡΡΠ° Π΅ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° - ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Π²ΡΡΠΊΠ° ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΡΡΡ ΡΡΡΠΎΡΠΎ ΡΠ΄ΡΠΎ, Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’Π΅ Π²ΠΊΠ»ΡΡΠ²Π°Ρ FreeBSD Jails, Solaris Zones, OpenVZ ΠΈ LXC Π·Π° Linux. ΠΠ·ΠΎΠ»Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π½Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π½ΠΎ ΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΡΡΡΠΈ; ΠΏΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, RAM ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΡΠ΅ΡΡΠΎΡΠ½Π° Π»Π΅Π½ΡΠ°. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ chroot, Π½Π°ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΅ ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠΏΠ΅ΡΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏ ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π½ΠΎ ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π°ΠΊΡΡΠ°Π»Π½Π° ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎ-ΡΡΠ°ΡΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΄ΡΠ°ΡΠ° (ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° Linux, Π² ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΡΡΠ΅ΠΏΠ΅Π½ FreeBSD), ΠΈΠΌΠ° Π½Π΅Π½ΡΠ»Π΅Π²Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡ Π·Π° βΠΏΡΠΎΠ±ΠΈΠ²β ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΈ Ρ.Π½.), ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ, ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Π΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ (Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅). Π’Π°Π·ΠΈ ΠΈΠ΄Π΅Ρ ΠΏΠΎΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π° Π·Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΉ-ΡΡΠΊΠΈΡΡ ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π» Π½Π° ΠΊΠΎΡΡΠΎ Π΅ Docker. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π²ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ, Π·Π°Π΅Π΄Π½ΠΎ Ρ Π²Π³ΡΠ°Π΄Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π΄ΠΎΠ²Π΅Π΄ΠΎΡ Π° Π΄ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ Π΅Π΄ΠΈΠ½Π½Π° Ρ ΠΎΠ»ΠΈΡΡΠΈΡΠ½Π° ΡΡΠ΅Π΄Π° ΠΎΡ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ²ΡΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ - Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΡΡΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅.
Π΄ΠΎΠΊΠ΅Ρ
Docker Π΅ Π½Π°ΠΉ-ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΡ ΡΠΎΡΡΡΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΠΈΡΠ°Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° Go, ΡΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux - cgroups, namespaces, capabilities ΠΈ Ρ.Π½., ΠΊΠ°ΠΊΡΠΎ ΠΈ Aufs ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ, Π·Π° Π΄Π° ΠΏΠ΅ΡΡΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: wikimedia
Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°
ΠΡΠ΅Π΄ΠΈ Π²Π΅ΡΡΠΈΡ 1.11 Docker ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΊΠ°ΡΠΎ Π΅Π΄Π½Π° ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ: ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° API Π·Π°ΡΠ²ΠΊΠΈ. ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ Ρ Π²Π΅ΡΡΠΈΡ 1.11, Docker Π±Π΅ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ: ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ΅Π»ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½ ΡΠΈΠΊΡΠ» Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ (ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΡΠ΅ΠΆΠ°ΡΠ°, ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅) ΠΈ runC, ΡΡΠ΅Π΄Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° cgroups ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux. Π‘Π°ΠΌΠ°ΡΠ° Π΄ΠΎΠΊΠ΅Ρ ΡΡΠ»ΡΠ³Π° ΠΎΡΡΠ°Π²Π°, Π½ΠΎ ΡΠ΅Π³Π° ΡΡ ΡΠ»ΡΠΆΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° API Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΡΠ΅Π²Π΅Π΄Π΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅
ΠΡΠ±ΠΈΠΌΠΈΡΡ ΠΌΠΈ Π½Π°ΡΠΈΠ½ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° docker Π΅ docker-machine, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ²Π΅Π½ ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° docker Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ±Π»Π°ΡΠΈ), Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
ΠΡ 2018 Π³. ΠΎΠ±Π°ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΠΏΠΎΡΡΠΈ Π½Π΅ Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Linux Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ - ΡΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ.
Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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. ΠΡΡΠ³Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡΡ swarm mode (ΠΏΡΠ΅Π΄ΠΈ Π²Π΅ΡΡΠΈΡ 1.12 Π±Π΅ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΡΠΎ docker swarm), ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ³Π»ΠΎΠ±ΠΈΡΠ΅ Π΅Π΄Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ²ΡΡΠ°, Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. ΠΠΌΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΡΠ΅ΠΆΠ° Π²ΡΡΡ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠ²ΡΡΠΈ, ΠΈΠΌΠ° Π²Π³ΡΠ°Π΄Π΅Π½ Π±Π°Π»Π°Π½ΡΡΠΎΡ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ°ΠΉΠ½ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
YAML ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ docker compose, Ρ ΠΌΠ°Π»ΠΊΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠ»ΡΡΡΠ΅ΡΠΈ, Π½Π°ΠΏΡΠ»Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΡΡΠ΅Π΄Π½ΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π»ΠΈ. ΠΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΠΈ Kubernetes Π΅ Π·Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠΎΡΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π½Π°Π΄Ρ
Π²ΡΡΠ»ΡΡ ΡΠ΅Π·ΠΈ Π½Π° Kubernetes. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ runC, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΡΠΎ ΡΡΠ΅Π΄Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
Π Π°Π±ΠΎΡΠ° Ρ Docker
Π‘Π»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΠΊΠ»ΡΡΡΠ΅Ρ, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ GitLab ΠΈ Docker Registry Π·Π° Π΅ΠΊΠΈΠΏΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ°ΡΠΎ ΡΡΡΠ²ΡΡΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ FS Π½Π° GlusterFS, ΡΠ΅ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΊΠ°ΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΡΠΎΠΌΠΎΠ²Π΅ Π½Π° Π΄ΠΎΠΊΠ΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° Π΄ΠΎΠΊΠ΅ΡΠΈΡΠ΅. ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅: Docker Registry, Postgresql, Redis, GitLab Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° GitLab Runner Π²ΡΡΡ
Ρ Swarm. Postgresql ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ Ρ ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅
ΠΠ° Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ 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
ΠΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ traefik Π·Π° ΠΎΡΠ²Π°ΡΡΠ½Π΅ Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΎΡΠ²ΡΠ½:
03traefik.yml
version: '3.7'
services:
traefik:
image: traefik:latest
command: >
--log.level=INFO
--providers.docker=true
--entryPoints.web.address=:80
--providers.providersThrottleDuration=2
--providers.docker.watch=true
--providers.docker.swarmMode=true
--providers.docker.swarmModeRefreshSeconds=15s
--providers.docker.exposedbydefault=false
--accessLog.bufferingSize=0
--api=true
--api.dashboard=true
--api.insecure=true
networks:
- traefik
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
replicas: 3
placement:
constraints:
- node.role == manager
preferences:
- spread: node.id
labels:
- traefik.enable=true
- traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
- traefik.http.services.traefik.loadbalancer.server.port=8080
- traefik.docker.network=traefik
networks:
traefik:
external: true
# docker stack deploy --compose-file 03traefik.yml traefik
Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Redis Cluster, Π·Π° ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ:
# 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
ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ Π½Π° Docker:
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
ΠΠ°ΠΊΠ²ΠΎ ΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ? ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Traefik Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΏΡΠ΅Π· https, Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ tls ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π·Π° Postgresql ΠΈ Redis. ΠΠΎ ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄Π°Π²Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ°ΡΠΎ PoC. ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΈΡΠ΅ Π½Π° Docker.
ΠΠΎΠ΄ΠΌΠ°Π½
ΠΡΡΠ³ Π΄ΠΎΡΡΠ° Π΄ΠΎΠ±ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π³ΡΡΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ (Π³ΡΡΠΏΠΈ, Π³ΡΡΠΏΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π°Π΅Π΄Π½ΠΎ). ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Docker, ΡΠΎΠΉ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½ΠΈΠΊΠ°ΠΊΠ²Π° ΡΡΠ»ΡΠ³Π° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΡΡΠ»Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libpod. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Go, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ Ρ OCI Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π·Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΊΠ°ΡΠΎ runC.
Π Π°Π±ΠΎΡΠ°ΡΠ° Ρ Podman ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ ΠΏΡΠΈΠ»ΠΈΡΠ° Π½Π° ΡΠ°Π·ΠΈ Π½Π° Docker, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½ (ΡΠ²ΡΡΠ΄ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π³ΠΎ ΠΎΠΏΠΈΡΠ²Π°Π»ΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π°Π²ΡΠΎΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ):
$ alias docker=podman
ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Ρ Podman Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°, Π·Π°ΡΠΎΡΠΎ Π°ΠΊΠΎ ΡΠ°Π½Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Kubernetes ΡΠ°Π±ΠΎΡΠ΅Ρ Π° Ρ Docker, ΡΠΎ ΠΎΠΊΠΎΠ»ΠΎ 2015 Π³., ΡΠ»Π΅Π΄ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ²Π΅ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ (OCI - Open Container Initiative) ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° Docker Π½Π° containerd ΠΈ runC, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π° ΡΠ΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° Docker Π·Π° ΡΠ°Π±ΠΎΡΠ° Π² Kubernetes: CRI-O. Podman Π² ΡΠΎΠ²Π° ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° Docker, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½Π° Π½Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΡΠ΅ Π½Π° Kubernetes, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π³ΡΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ΅Π» Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² ΡΡΠΈΠ» Docker Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ. ΠΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ Π½ΡΠΌΠ° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠΎΡΠΊ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΎ ΠΊΠ°Π·Π²Π°Ρ, ΡΠ΅ Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΊΠ»ΡΡΡΠ΅Ρ, Π²Π·Π΅ΠΌΠ΅ΡΠ΅ Kubernetes.
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡ
ΠΠ° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° Centos 7, ΠΏΡΠΎΡΡΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Extras ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
# yum -y install podman
ΠΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
Podman ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π·Π° systemd, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ΡΠ°Π²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΡΡ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΡΠ»Π΅Π΄ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°, ΡΠ΅ systemd ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΊΠ°ΡΠΎ pid 1 Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈΠΌΠ° ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅, ΠΈΠΌΠ° ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π½Π° ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ - Π°Π½Π°Π»ΠΎΠ·ΠΈ Π½Π° docker-compose, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ Kubernetes ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Ρ ΠΎΠ΄ΡΡ ΠΎΡ Podman ΠΊΡΠΌ Kubernetes Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΏΡΠΎΡΡ.
Π Π°Π±ΠΎΡΠ° Ρ Podman
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΌΠ° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠΎΡΠΊ (ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΊΡΠΌ Kubernetes, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠ»ΡΡΡΠ΅Ρ), ΡΠ΅ Π³ΠΎ ΡΠ³Π»ΠΎΠ±ΠΈΠΌ Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ podman-compose:
# yum -y install python3-pip
# pip3 install podman-compose
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π·Π° podman Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΠ΅ΠΊΡΠΈΡ Π·Π° ΠΎΠ±Π΅ΠΌΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° ΡΡΠ»ΡΠ³ΠΈ.
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, Π·Π° ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌ ΠΈΠΌΠ΅ΡΠΎ ΠΈΠ»ΠΈ id Π½Π° pod:
# 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 Π½Π΅ ΠΏΡΠ°Π²ΠΈ Π½ΠΈΡΠΎ Π΄ΡΡΠ³ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ»ΡΠ³Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°), ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° Π½Π΅ΡΠ° ΡΠ°ΠΌΠΈ.
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Podman Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½, Π·Π° Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅, Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΡΠ΅ ΡΡΠ°ΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π° docker-compose ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ Kubernetes, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ ΠΈΠ»ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎ-Π»Π΅ΡΠ½Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° Docker.
RKT
ΠΡΠΎΠ΅ΠΊΡ
ΠΠ»Π°Ρ
ΠΡΠ΅
ΠΠ°Π½Π½ΠΈ
Π‘ΠΈΡΡΠ°ΡΠΈΡΡΠ° Ρ Kubernetes Π΅ Π΄ΠΎΡΡΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°: ΠΎΡ Π΅Π΄Π½Π° ΡΡΡΠ°Π½Π°, Ρ Docker ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΠΊΠ»ΡΡΡΠ΅Ρ (Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠΎΡΠΊ), Ρ ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΡΠΈ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ²ΠΈ ΡΡΠ΅Π΄ΠΈ Π·Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΡΠΎΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π²ΡΡΠ½ΠΎ Π·Π° ΠΌΠ°Π»ΠΊΠΈ Π΅ΠΊΠΈΠΏΠΈ (3-5 Π΄ΡΡΠΈ) , ΠΈΠ»ΠΈ Ρ ΠΌΠ°Π»ΠΊΠΎ ΠΎΠ±ΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΈΠ»ΠΈ Π»ΠΈΠΏΡΠ° Π½Π° ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΡΡΠ½ΠΊΠΎΡΡΠΈΡΠ΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° Kubernetes, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π° Π²ΠΈΡΠΎΠΊΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ.
Podman Π½Π΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΏΡΠ»Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ, Π½ΠΎ ΠΈΠΌΠ° Π΅Π΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ - ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Kubernetes, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ (buildah ΠΈ Π΄ΡΡΠ³ΠΈ). ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΊΡΠΌ ΠΈΠ·Π±ΠΎΡΠ° Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠ°Π±ΠΎΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°: Π·Π° ΠΌΠ°Π»ΠΊΠΈ Π΅ΠΊΠΈΠΏΠΈ ΠΈΠ»ΠΈ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠ΄ΠΆΠ΅Ρ - Docker (Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠΎΡΠΊ ΡΠ΅ΠΆΠΈΠΌ), Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ Π½Π° Π»ΠΈΡΠ΅Π½ Π»ΠΎΠΊΠ°Π»Π΅Π½ Ρ ΠΎΡΡ - Podman comrades ΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ - Kubernetes.
ΠΠ΅ ΡΡΠΌ ΡΠΈΠ³ΡΡΠ΅Π½, ΡΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Ρ Docker Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±ΡΠ΄Π΅ΡΠ΅, Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ ΡΠ° ΠΏΠΈΠΎΠ½Π΅ΡΠΈ ΠΈ ΡΡΡΠΎ Π±Π°Π²Π½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Ρ ΡΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°, Π½ΠΎ Podman, Ρ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΠΌΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ (ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π½Π° Linux, Π±Π΅Π· Π³ΡΡΠΏΠΈΡΠ°Π½Π΅, Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π΄ΡΡΠ³ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ) Π±ΡΠ΄Π΅ΡΠ΅ΡΠΎ Π΅ ΠΏΠΎ-ΡΡΠ½ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΠ°Π½Ρ Π²ΡΠΈΡΠΊΠΈ Π΄Π° ΠΎΠ±ΡΡΠ΄ΡΡ ΡΠ΅Π·ΠΈ ΠΎΡΠΊΡΠΈΡΠΈΡ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
PS ΠΠ° 3 Π°Π²Π³ΡΡΡ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ "
Π¦Π΅Π½Π° Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΡΡΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΏΡΡΠΊΠ°Π½Π΅: 5000 ΡΡΠ±Π»ΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° "Docker Video Course" ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com