Добавить в корзинуПозвонить
Найти в Дзене

Docker для сисадмина: контейнеризируй или страдай

**Теги:** docker, linux, devops, администрирование, sysadmin --- Я долго сопротивлялся Docker. «Зачем мне это, если я и так умею настраивать сервисы руками?» — думал я, в третий раз переустанавливая PHP 7.4 рядом с PHP 8.2 и молясь, чтобы они не подрались. Потом всё-таки попробовал. Теперь я не понимаю, как жил без этого. --- ## Почему это важно именно для сисадминов, а не только для девопсов Docker принято считать «девопс-инструментом», но для системного администратора он решает очень конкретные бытовые проблемы: - **Конфликты зависимостей** — Node 14 и Node 20 на одной машине без плясок с nvm - **Воспроизводимость** — сервис поднимается одинаково на dev, staging и prod - **Изоляция** — упавший контейнер не кладёт соседние сервисы - **Откат за 10 секунд** — `docker pull` старого образа и перезапуск --- ## Базовая концепция за 5 минут Три вещи, которые нужно понять: **Image** — это слепок файловой системы. Неизменяемый. Как ISO-образ диска. **Container** — запущенный экземпляр образа.

**Теги:** docker, linux, devops, администрирование, sysadmin

---

Я долго сопротивлялся Docker. «Зачем мне это, если я и так умею настраивать сервисы руками?» — думал я, в третий раз переустанавливая PHP 7.4 рядом с PHP 8.2 и молясь, чтобы они не подрались.

Потом всё-таки попробовал. Теперь я не понимаю, как жил без этого.

---

## Почему это важно именно для сисадминов, а не только для девопсов

Docker принято считать «девопс-инструментом», но для системного администратора он решает очень конкретные бытовые проблемы:

- **Конфликты зависимостей** — Node 14 и Node 20 на одной машине без плясок с nvm

- **Воспроизводимость** — сервис поднимается одинаково на dev, staging и prod

- **Изоляция** — упавший контейнер не кладёт соседние сервисы

- **Откат за 10 секунд** — `docker pull` старого образа и перезапуск

---

## Базовая концепция за 5 минут

Три вещи, которые нужно понять:

**Image** — это слепок файловой системы. Неизменяемый. Как ISO-образ диска.

**Container** — запущенный экземпляр образа. Можно запустить 10 контейнеров из одного образа.

**Volume** — постоянное хранилище данных вне контейнера. Контейнер умрёт — данные останутся.

```

Image → Container (эфемерный)

Volume (постоянный)

```

---

## Установка без лишнего

```bash

# Ubuntu/Debian

curl -fsSL https://get.docker.com | sh

usermod -aG docker $USER # добавляем себя в группу, перелогиниваемся

# Проверка

docker run hello-world

```

Всё. Не нужно ставить Docker Desktop, не нужно ничего настраивать.

---

## Docker Compose: то, чем вы будете пользоваться каждый день

Запуск через `docker run` с кучей флагов — это для экспериментов. В проде используют `docker-compose.yml`.

Пример: поднимаем Nginx + PostgreSQL + Redis одной командой.

```yaml

# docker-compose.yml

version: '3.8'

services:

nginx:

image: nginx:alpine

ports:

- "80:80"

- "443:443"

volumes:

- ./nginx/conf.d:/etc/nginx/conf.d:ro

- ./certbot/www:/var/www/certbot:ro

restart: unless-stopped

postgres:

image: postgres:16-alpine

environment:

POSTGRES_DB: myapp

POSTGRES_USER: appuser

POSTGRES_PASSWORD_FILE: /run/secrets/db_password

volumes:

- postgres_data:/var/lib/postgresql/data

restart: unless-stopped

# Не открываем порт наружу — только внутри сети

redis:

image: redis:7-alpine

command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru

volumes:

- redis_data:/data

restart: unless-stopped

volumes:

postgres_data:

redis_data:

networks:

default:

name: app_network

```

```bash

docker compose up -d # запустить в фоне

docker compose down # остановить

docker compose logs -f # смотреть логи в реальном времени

docker compose ps # статус сервисов

```

---

## Практики, которые спасут нервы

### 1. Никогда не храните данные внутри контейнера

```bash

# Плохо: данные исчезнут при пересоздании контейнера

docker run postgres

# Хорошо: данные живут в volume

docker run -v postgres_data:/var/lib/postgresql/data postgres

```

### 2. Всегда указывайте версию образа

```yaml

# Плохо — образ обновится и что-нибудь сломается

image: nginx:latest

# Хорошо — воспроизводимо

image: nginx:1.25-alpine

```

### 3. Секреты не в переменных окружения

```yaml

# Плохо — видно в docker inspect и логах

environment:

DB_PASSWORD: "supersecret123"

# Хорошо — через файл или Docker Secrets

env_file:

- .env # в .gitignore!

```

### 4. Healthcheck для критичных сервисов

```yaml

postgres:

image: postgres:16-alpine

healthcheck:

test: ["CMD-SHELL", "pg_isready -U appuser -d myapp"]

interval: 10s

timeout: 5s

retries: 5

```

---

## Мониторинг контейнеров

```bash

# Ресурсы в реальном времени

docker stats

# Подробно по конкретному

docker stats postgres_1

# Логи с временными метками

docker logs --timestamps --tail 100 nginx_1

# Залезть внутрь работающего контейнера

docker exec -it postgres_1 bash

```

Для серьёзного мониторинга — **Portainer** (веб-интерфейс) или **cAdvisor + Prometheus + Grafana** (если хочется красивых графиков).

---

## Обновление сервисов без даунтайма

```bash

# Обновить один сервис

docker compose pull nginx

docker compose up -d nginx

# Откатиться

docker tag nginx:1.25-alpine nginx:backup

docker compose up -d nginx # если что-то пошло не так — меняем тег обратно

```

---

## Подводные камни

**Логи растут бесконечно**

Без ограничения логи контейнеров забьют диск за недели.

```json

// /etc/docker/daemon.json

{

"log-driver": "json-file",

"log-opts": {

"max-size": "10m",

"max-file": "3"

}

}

```

**Время в контейнере не совпадает с хостом**

```yaml

volumes:

- /etc/localtime:/etc/localtime:ro

- /etc/timezone:/etc/timezone:ro

```

**Контейнер не стартует после перезагрузки сервера**

Проверьте `restart: unless-stopped` в compose-файле и что Docker-демон добавлен в автозагрузку: `systemctl enable docker`.

---

## Итог

Docker не заменяет понимание того, что происходит внутри. Вам всё равно нужно знать Linux, понимать сети, уметь читать логи.

Но Docker убирает огромный класс проблем, связанных с воспроизводимостью и изоляцией. После месяца работы с ним возвращаться к ручной настройке каждого сервиса физически тяжело.

В следующей части разберём Dockerfile — как собирать собственные образы правильно, без лишних слоёв и уязвимостей.