ποΈ ΠΠ°ΠΉΠ΄: ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Ρ Docker Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½-ΡΡΠ΅Π΄Π΅
ΠΠΈΠΆΠ΅ β ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ, ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ.
1οΈβ£ ΠΡΠ±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ
Docker ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½-ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ:
β
Docker Swarm β Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΌΠ°Π»ΡΡ
ΠΈ ΡΡΠ΅Π΄Π½ΠΈΡ
ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
β
Kubernetes (K8s) β ΠΏΡΠΎΠΌΡΡΠ»Π΅Π½Π½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡ, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ
ΡΠΈΡΡΠ΅ΠΌ
β
Nomad (ΠΎΡ HashiCorp) β Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½Π°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°
π ΠΠ»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Swarm, Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌ β Kubernetes.
2οΈβ£ ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΊΠ»Π°ΡΡΠ΅ΡΠ°
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ:
β’ 3 manager-Π½ΠΎΠ΄Ρ (quorum, HA)
β’ 2+ worker-Π½ΠΎΠ΄Ρ
β’ overlay-ΡΠ΅ΡΡ
β’ load balancer (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ nginx, HAProxy)
β’ private registry (Harbor, GitLab Registry)
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°:
docker swarm init --advertise-addr MANAGER_IP
docker swarm join --token <join-token> MANAGER_IP:2377
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ overlay-ΡΠ΅ΡΠΈ:
docker network create --driver overlay --attachable my-overlay
---
3οΈβ£ Π Π°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
ΠΡΠΈΠΌΠ΅Ρ docker-compose.yml (Π²Π΅ΡΡΠΈΠΈ 3 Π΄Π»Ρ Swarm):
version: '3.9'
services:
web:
image: mycompany/webapp:latest
replicas: 5
deploy:
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
networks:
- frontend
ports:
- "80:80"
networks:
frontend:
driver: overlay
ΠΠ°ΠΏΡΡΠΊ:
docker stack deploy -c docker-compose.yml mystack
---
4οΈβ£ Zero-Downtime Updates
ΠΠΎΠ±Π°Π²Ρ healthcheck Π² Dockerfile:
HEALTHCHECK --interval=30s --timeout=10s \
CMD curl -f http://localhost/health || exit 1
Π docker-compose.yml ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ update_config β ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π±Π΅Π· Π΄Π°ΡΠ½ΡΠ°ΠΉΠΌΠ° (ΠΏΠΎ 2 ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΊΠ°ΠΆΠ΄ΡΠ΅ 10s, Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ healthcheck).
---
5οΈβ£ Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
docker swarm unlock-key
docker swarm join-token manager
docker node ls
ΠΡΠΊΠ°ΠΏ Raft:
docker container stop $(docker container ls -q --filter name=swarm)
cp -r /var/lib/docker/swarm ~/swarm-backup
6οΈβ£ ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
β
Prometheus + Grafana β ΠΌΠ΅ΡΡΠΈΠΊΠΈ
β
ELK Stack / Loki β Π»ΠΎΠ³ΠΈ
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ° cAdvisor:
docker run -d \
-p 9323:9323 \
--name cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
google/cadvisor:latest
7οΈβ£ ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
β’ ΠΠ°ΠΏΡΡΠΊ ΠΎΡ Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
USER appuser
β’ Read-only root filesystem:
deploy:
read_only: true
β’ ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ capability:
deploy:
cap_drop:
- ALL
β’ Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ² (Trivy):
trivy image mycompany/webapp:latest
β’ ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ latest ΡΠ΅Π³:
image: mycompany/webapp:1.3.2
8οΈβ£ ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Dockerfile
β
multi-stage build
β
ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΠΉ ΡΠ»ΠΎΠΈ
β
Π΄Π°Π½Π½ΡΠ΅ β Π²ΠΎ Π²Π½Π΅ΡΠ½ΠΈΠ΅ volume
ΠΡΠΈΠΌΠ΅Ρ multi-stage:
FROM node:18 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
9οΈβ£ Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΠ°ΠΌΠΈ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΠ°:
echo "my-secret-value" | docker secret create db_password -
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² docker-compose.yml:
secrets:
- db_password
Π ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΊΠ°ΠΊ /run/secrets/db_password.
π CI/CD
ΠΡΠΈΠΌΠ΅Ρ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° (GitLab):
stages:
- build
- deploy
build:
stage: build
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHA .
- docker push registry.example.com/myapp:$CI_COMMIT_SHA
deploy:
stage: deploy
script:
- docker service update --image registry.example.com/myapp:$CI_COMMIT_SHA mystack_web
π― ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ =
β
Π³ΡΠ°ΠΌΠΎΡΠ½Π°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°
β
rolling updates + healthchecks
β
Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ (secrets, cap_drop, read_only)
β
ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
β
CI/CD ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ
β
ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΉ Π±ΡΠΊΠ°ΠΏ
π Swarm = Π±ΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ, Kubernetes = ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.