ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π² Docker

АндрСй ΠšΠΎΠΏΡ‹Π»ΠΎΠ², наш тСхничСски Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€, Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ популяризира Docker. Π’ Π½ΠΎΠ²Π°Ρ‚Π° статия Ρ‚ΠΎΠΉ Ρ€Π°Π·ΠΊΠ°Π·Π²Π° ΠΊΠ°ΠΊ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π² Docker. ΠŸΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° с тях, Π·Π°Ρ‰ΠΎ Π½Π΅ Π±ΠΈΠ²Π° Π΄Π° сС оставят ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ с ΠΏΡ€Π°Π²Π° root ΠΈ ΠΊΠ°ΠΊ Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π½Π΅ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π² Dockerfile.

Всички процСси Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ‰Π΅ работят ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» root, Π°ΠΊΠΎ Π½Π΅ сС ΡƒΠΊΠ°ΠΆΠ΅ ΠΏΠΎ спСциалСн Π½Π°Ρ‡ΠΈΠ½. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» няма ограничСния. ИмСнно ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π°, Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с root Π½Π΅ Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° сигурността. Ако Π½Π° локалния ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ с root ΠΏΡ€Π°Π²Π° Π² ΡΡŠΠ·Π½Π°Ρ‚Π΅Π»Π΅Π½ ΡƒΠΌ, ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π° стартират процСси ΠΏΠΎΠ΄ root Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ.

Π’ΠΈΠ½Π°Π³ΠΈ ΠΈΠΌΠ° бъговС, ΠΊΠΎΠΈΡ‚ΠΎ позволяват Π½Π° Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½ софтуСр Π΄Π° избяга ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π΄Π° достигнС хост ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π°. ΠŸΡ€ΠΈΠ΅ΠΌΠ°ΠΉΠΊΠΈ Π½Π°ΠΉ-Π»ΠΎΡˆΠΎΡ‚ΠΎ, трябва Π΄Π° осигурим стартиранСто Π½Π° процСси Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΊΠΎΠΉΡ‚ΠΎ няма ΠΏΡ€Π°Π²Π° Π½Π° хост ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π°.

БъздаванС Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»

Π‘ΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π΅ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ Π² линуксовитС дистрибуции. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π±Π°Π·ΠΎΠ²ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π°Ρ‚.

Π—Π° дистрибуции, Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° debian, Π² Dockerfile Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Π—Π° alpine:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° процСси ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»

Π—Π° Π΄Π° стартиратС всички послСдващи процСси ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» с UID 2000, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅:

USER 2000

Π—Π° Π΄Π° стартиратС всички послСдващи процСси ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» node, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅:

USER node

ΠŸΠΎΠ²Π΅Ρ‡Π΅ Π² докумСнтацията.

ΠœΠΎΠ½Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΌΠΈ

ΠŸΡ€ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΌΠΈ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, осигурСтС Π½Π° потрСбитСля Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° Ρ‡Π΅Ρ‚Π΅ ΠΈ (ΠΈΠ»ΠΈ) пишС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π—Π° Ρ‚ΠΎΠ²Π° UID (GID) Π½Π° потрСбитСля Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ потрСбитСля извън ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π°, трябва Π΄Π° ΡΡŠΠ²ΠΏΠ°Π΄Π°Ρ‚. Π˜ΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π΅ са ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ЧСсто Π½Π° линуксов ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€ потрСбитСлят ΠΈΠΌΠ° UID ΠΈ GID Ρ€Π°Π²Π½ΠΈ Π½Π° 1000. Π’Π΅Π·ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ сС присвояват Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π½Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π°.

Π”Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ своитС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ Π΅ просто:

id

Π©Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ°Ρ‚Π΅Π»Π½Π° информация Π·Π° вашия ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π».
Π—Π°ΠΌΠ΅Π½Π΅Ρ‚Π΅ 2000 ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ със своя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ всичко Ρ‰Π΅ бъдС Π½Π°Ρ€Π΅Π΄.

ΠŸΡ€ΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ Π½Π° потрСбитСля UID ΠΈ GID

Ако потрСбитСлят Π΅ създадСн ΠΏΠΎ-Ρ€Π°Π½ΠΎ, Π½ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС промСнят ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС Ρ‚Π°ΠΊΠ°:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π±Π°Π·ΠΎΠ² ΠΎΠ±Ρ€Π°Π· alpine, трябва Π΄Π° инсталиратС ΠΏΠ°ΠΊΠ΅Ρ‚Π° shadow:

RUN apk add β€”no-cache shadow

ΠŸΠΎΠ΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° потрСбитСля Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ€Π°Π·Π°

Ако Π²Π°ΡˆΠΈΡΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ съвпада с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° всички, ΠΊΠΎΠΈΡ‚ΠΎ работят ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΄Π° посочитС Ρ‚ΠΎΠ·ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² Dockerfile. ЧСсто ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π΅ ΡΡŠΠ²ΠΏΠ°Π΄Π°Ρ‚.

Как Π΄Π° постигнСтС ΠΆΠ΅Π»Π°Π½ΠΎΡ‚ΠΎ Π½Π΅ Π΅ Π²Π΅Π΄Π½Π°Π³Π° ясно. Π—Π° ΠΌΠ΅Π½ Ρ‚ΠΎΠ²Π° бСшС Π½Π°ΠΉ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡ‚ΠΎ Π² процСса Π½Π° усвояванС Π½Π° docker. Много ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π½Π° docker Π½Π΅ ΠΎΡΡŠΠ·Π½Π°Π²Π°Ρ‚, Ρ‡Π΅ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Ρ‚Π°ΠΏΠΈ Π² ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° ΠΎΠ±Ρ€Π°Π·Π°. ΠŸΡŠΡ€Π²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Dockerfile. ΠŸΡ€ΠΈ стартиранС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π·Π° Dockerfile Π²Π΅Ρ‡Π΅ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°.

Π‘ΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ трябва Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ€Π°Π·Π°. Π’ΠΎΠ²Π° ΡΡŠΡ‰ΠΎ Π²Π°ΠΆΠΈ ΠΈ Π·Π° опрСдСлянСто Π½Π° потрСбитСля, ΠΏΠΎΠ΄ ΠΊΠΎΠ³ΠΎΡ‚ΠΎ сС стартират процСси. Π—Π½Π°Ρ‡ΠΈ, Ρ‡Π΅ ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ трябва Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° UID (GID).

Π—Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° външни ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² Dockerfile слуТат Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΈ ENV ΠΈΒ ARG. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ сравнСниС Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊ.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΏΡ€Π΅Π· docker-compose Ρ‚Π°ΠΊΠ°:

docker-compose

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

P.S. Π—Π° Π΄Π° ΠΎΠ²Π»Π°Π΄Π΅Π΅Ρ‚Π΅ всички Ρ‚ΡŠΠ½ΠΊΠΎΡΡ‚ΠΈ Π½Π° docker, Π½Π΅ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΄Π° Ρ‡Π΅Ρ‚Π΅Ρ‚Π΅ докумСнтация ΠΈΠ»ΠΈ статии. НСобходимо Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΡƒΠΆΠ½ΠΎ Π΅ Π΄Π° усСтитС docker.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster