ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΌΡ ΠΏΡΠΈΡΡΡΠΏΠΈΠΌ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Buildah, Ρ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ Π²Π²ΠΎΠ΄Π½Π°Ρ ΡΠ°ΡΡΡ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠΎΠΌ ΠΈΠ· ΠΆΠ°ΡΠ³ΠΎΠ½Π° Π² ΠΏΠ΅ΡΠ²ΡΡ Π²ΡΡΡΠΏΠΈΡΠ΅Π»ΡΠ½ΡΡ Π°Π±Π·Π°ΡΠ°Ρ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΡΠ°ΡΠ΅ΠΉ.
Π‘Π½Π°ΡΠ°Π»Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ OCI, Buildah ΠΈ Docker.
Open Container Initiative (OCI)
ΠΡΠ°ΠΊ, ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ OCI, ΠΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π° ΠΡΠΊΡΡΡΡΡ ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² (OCI), Π·Π°ΠΏΡΡΠ΅Π½Π½Π°Ρ 22 ΠΈΡΠ½Ρ 2015 Π³ΠΎΠ΄Π° Docker, CoreOS ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠ°ΡΡΠ½Π΅ΡΠ°ΠΌΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ, ΡΠ΅Π»ΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡΠΊΡΡΡΡΡ ΠΎΡΡΠ°ΡΠ»Π΅Π²ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ² Π΄Π»Ρ ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ OCI ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ: ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (runtime-spec) ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² (image-spec).
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ Β«ΠΏΠ°ΠΊΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡΒ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½ Π½Π° Π΄ΠΈΡΠΊΠ΅.
Β«ΠΠ°ΠΊΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡΒ» – ΡΡΠΎ Π½Π°Π±ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π»ΡΠ±ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΠΉ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Docker ΠΈ CRI-O) Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ Π½ΠΈΠΌ.
ΠΠ° Π²ΡΡΠΎΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ OCI Π±ΡΠ΄Π΅Ρ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ°Π· OCI, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°ΡΡ ΡΡΠΎΡ ΠΎΠ±ΡΠ°Π· Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ OCI Runtime.
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ OCI Runtime Bundle Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ OCI Runtime (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Docker ΠΈ CRI-O).
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ Buildah.
Buildah
Buildah – ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ², ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ Ρ Open Container Initiative (OCI).
ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ Docker, Podman, Kubernetes ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠΌ Π²Π°ΡΠΈΠΌ Π»ΡΠ±ΠΈΠΌΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ.
ΠΠΎΠΌΠ°Π½Π΄Ρ Buildah ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² Dockerfile.
Π¦Π΅Π»Ρ Buildah ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° coreutils Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π³ΠΎ Π»ΡΠ΄ΡΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Dockerfile.
Π‘Π°ΠΌΡΠΉ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Buildah – ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ² Bash Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ², Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ Π²Ρ Π±Ρ ΠΏΠΈΡΠ°Π»ΠΈ Dockerfile Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΠΌΠΎΠ½Π°.
ΠΠΎΠ²ΠΎΡΡ ΠΏΡΠΎΡΡΡΠΌ ΡΠ·ΡΠΊΠΎΠΌ, OCI ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΈ ΡΠΎ, ΠΊΠ°ΠΊ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Buildah ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ².
Π§ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΊΠΎΠ΅ Docker?
Docker
ΠΠΎ Π²Π΅ΡΡΠΈΠΈ 1.11 Docker ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ»Π° ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½ΡΠΌ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ.
ΠΠΎΠ½ΠΎΠ»ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ» Π²ΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π°Π³ΡΡΠΆΠ°Π» ΠΎΠ±ΡΠ°Π·Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², Π·Π°ΠΏΡΡΠΊΠ°Π» ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ» ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ API ΠΈ Π²ΡΡΡΡΠΏΠ°Π» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π΅ΠΌΠΎΠ½Π° ΡΠ±ΠΎΡΠ° ΠΆΡΡΠ½Π°Π»ΠΎΠ², ΠΈ Π²ΡΠ΅ ΡΡΠΎ Π² ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root (Source coreos).
Π’Π°ΠΊΠ°Ρ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΏΡΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠΈ, Π½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ΠΎΠ²ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ°ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π² Unix.
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Docker Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Linux, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ upstart ΠΈ systemd https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html#rkt-vs-docker.
ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Docker Π½Π° ΡΠ°Π·Π½ΡΠ΅ ΡΠ°ΡΡΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΡΠΊΡΡΠ²ΡΠ΅ΠΌΡΡ Π½ΠΈΠΆΠ΅ Π°Π±Π·Π°ΡΠ΅ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° Docker 1.11.
Β«ΠΡ ΡΠ°Π΄Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Docker Engine 1.11, Π½Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΡ Π²Π΅ΡΡΠΈΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° runC β’ ΠΈ containerd β’. Π ΡΡΠΎΠΌ Π²ΡΠΏΡΡΠΊΠ΅ Docker ΠΏΠ΅ΡΠ²ΡΠΌ Π²ΡΠΏΡΡΡΠΈΠ» ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ OCI, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ, Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ Linux Foundation Π² ΠΈΡΠ½Π΅ 2015 Π³ΠΎΠ΄Π°. Source Docker Β».
ΠΠΎ ΠΈΡ ΡΠ»ΠΎΠ²Π°ΠΌ (Docker), ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Docker Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Π»Π΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈ, Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅, Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅.
Π‘ ΡΠ΅Ρ ΠΏΠΎΡ containerd ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π½Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΡΠ°ΠΌ Π΄Π΅ΠΌΠΎΠ½ docker.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· docker-cli.
Docker-cli ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠΈΠ²Π°Π΅Ρ Ρ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ Docker.
ΠΠ΅ΠΌΠΎΠ½ Docker (dockerd) ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· containerd, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ½ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ. containerd ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ΅ΡΠ΅Π· runC ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠ΅ ΡΠΈΠΊΠ»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² Ρ ΠΎΡΡΠ΅.
ΠΠΊΡΠ°ΡΡΠ΅, runc – ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ CLI Π΄Π»Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ OCI.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Buildah
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ Π½Π° Π²Π°ΡΠ΅ΠΌ CentOS 8, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Buildah.
ΠΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Podman ΡΡΠ΄ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π° Ρ Π½ΡΠ»Ρ.
sudo dnf update
sudo dnf -y install buildah podman
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅, Π±ΡΠ» Π»ΠΈ ΠΎΠ½ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½
$ rpm -q buildah
buildah-1.11.6-4.module_el8.1.0+272+3e64ee36.x86_64
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·Π° OCI Ρ Π½ΡΠ»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Buildah
ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π· ΠΈΠ· Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΡΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ° Apache.
ΠΠ΅Π»Π°Ρ ΡΡΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΎΠ±ΡΠ°Π·Π° Π±Π»ΠΎΠΊ Π·Π° Π±Π»ΠΎΠΊΠΎΠΌ.
ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΎ ΡΠ°Π½Π΅Π΅, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ buildah scratch Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ.
Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Β«rootΒ».
brandnewcontainer=$(buildah from scratch)
$ buildah containers
CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME
e6c2f7b0b567 * scratch working-container
-- ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠ΅Π· podman
$ podman images
scratchmnt=$(buildah mount $brandnewcontainer)
echo $scratchmnt
/var/lib/containers/storage/overlay/40e7215211b47e8de47991d0dc7be07e
ΠΠΎΠΌΠ°Π½Π΄Π° Buildah mount ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄Π°Π΅Ρ Π²Π°ΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΉ Ρ Ρ ΠΎΡΡΠ°.
ΠΠ°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΎΠ±ΡΠ°Π·:
yum -y group install "Minimal Install" --releasever=8 --installroot=$scratchmnt
$ buildah umount $brandnewcontainer
e6c2f7b0b5679133ad6e0ad6bd74164dac7f357f0076cf6cc819f9ed664236d5
$ buildah run $brandnewcontainer bash
[root@e6c2f7b0b567 /]# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@e6c2f7b0b567 /]# yum install httpd -y
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΏΡΠΎΡΡΡΡ HTML-ΡΡΡΠ°Π½ΠΈΡΡ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² Apache ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈ Π²ΡΠΉΠ΄ΠΈΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
[root@e6c2f7b0b567 /]# echo "Testing Apache." > /var/www/html/index.html
[root@e6c2f7b0b567 /]# exit
ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡ ΠΊ Π½Π°ΡΠ΅ΠΉ Ρ ΠΎΡΡ-ΡΠΈΡΡΠ΅ΠΌΠ΅, Π²ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ° httpd Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ»ΡΠΆΠ±Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ buildah Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π΄Π΅ΠΌΠΎΠ½Π° httpd Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°:
$ buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container
$ buildah config --port 80/tcp working-container
$ buildah commit working-container localhost/firstapache:latest
Getting image source signatures
Copying blob b34ab2705c68 done
Copying config a0c546bc39 done
Writing manifest to image destination
Storing signatures
a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ buildah Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠΈΠΊΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·Π°, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Podman, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Π°, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΈ ΡΠ·Π½Π°ΠΉΡΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ Π½Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Ρ.
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/firstapache latest a0c546bc3927 8 minutes ago 1.68 GB
Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π·:
$ podman run -p 8080:80 -d --name apache-server a0c546bc3927
b1d29603542c8f91a289127cee4fa9157962f8fcdda9baa82b335e08a94c0992
Π§ΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π½Π°Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ Apache ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ°Π½Π΅Π΅, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠΎ-ΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΠ°ΠΊ Π²Ρ ΡΠΆΠ΅ Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ curl, Π»ΠΈΠ±ΠΎ Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Ρ Π±ΡΠ°ΡΠ·Π΅Ρ, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΏΠΎΡΡ 80 Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π±ΡΠ» ΡΠ²ΡΠ·Π°Π½ Ρ ΠΏΠΎΡΡΠΎΠΌ 8080 Π² ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ curl.
curl -ik "localhost:8080"
HTTP/1.1 200 OK
Date: Thu, 23 Apr 2020 22:21:54 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Thu, 23 Apr 2020 22:02:43 GMT
ETag: "f-5a3fc6872e6c0"
Accept-Ranges: bytes
Content-Length: 15
Content-Type: text/html; charset=UTF-8
Testing Apache.
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ½ΠΎ Π²ΠΈΠ΄Π΅ΡΡ, Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡ ΠΈ Π΄Π°Π» Π½Π°ΠΌ ΠΎΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ.
ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Buildah ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π² Π²Π°ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π°Π»ΡΡΡ ΠΎΠ±ΡΠ°Π·Π² ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ, ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈΡ ΠΈ Ρ.Π΄.
Π§ΡΠΎΠ±Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΅Π³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΠΌ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Β«buildah imagesΒ», Π·Π°ΡΠ΅ΠΌ Π½Π°Π±Π΅ΡΠ΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΈ Π·Π°ΠΏΡΡΡΠΈΠΌ:
$ buildah inspect a0c546bc3927
{
"Type": "buildah 0.0.1",
"FromImage": "localhost/firstapache:latest",
"FromImageID": "a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543",
"FromImageDigest": "sha256:2060eb441d905934f0aa1749b0d9ed065fd464b30483a963e5719b27836c844d",
"Config": "{\"created\":\"2020-04-23T22:09:50.515019063Z\",\"architecture\":\"amd64\",\"os\":\"linux\",\"config\":{\"ExposedPorts\":{\"80/tcp\":{}},\"Cmd\":[\"/usr/sbin/httpd\",\"-DFOREGROUND\"],\"Labels\":{\"io.buildah.version\":\"1.11.6\"}},\"rootfs\":{\"type\":\"layers\",\"diff_ids\":[\"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94\"]},\"history\":[{\"created\":\"2020-04-23T22:09:50.515019063Z\",\"created_by\":\"/bin/sh\"}]}",
"Manifest": "{\"schemaVersion\":2,\"config\":{\"mediaType\":\"application/vnd.oci.image.config.v1+json\",\"digest\":\"sha256:a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543\",\"size\":396},\"layers\":[{\"mediaType\":\"application/vnd.oci.image.layer.v1.tar\",\"digest\":\"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94\",\"size\":1684295168}]}",
"Container": "",
"ContainerID": "",
"MountPoint": "",
"ProcessLabel": "",
"MountLabel": "",
"ImageAnnotations": null,
"ImageCreatedBy": "",
"OCIv1": {
"created": "2020-04-23T22:09:50.515019063Z",
"architecture": "amd64",
"os": "linux",
"config": {
"ExposedPorts": {
"80/tcp": {}
},
"Cmd": [
"/usr/sbin/httpd",
"-DFOREGROUND"
],
"Labels": {
"io.buildah.version": "1.11.6"
}
},
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94"
]
},
"history": [
{
"created": "2020-04-23T22:09:50.515019063Z",
"created_by": "/bin/sh"
}
]
},
"Docker": {
"created": "2020-04-23T22:09:50.515019063Z",
"container_config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Buildah – ΡΡΠΎ ΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ°Π·Π° Ρ Π½ΡΠ»Ρ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ°Π· Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ½ΠΎΠ²Ρ.
Β ΡΠΌ. ΡΠ°ΠΊΠΆΠ΅:
![]()
