Если ты хоть раз настраивал CI/CD на Jenkins, то знаешь, что это тот еще квест: плагины, агенты, права, обновления, конфиги – список бесконечен. А теперь представь, что можно поднять Jenkins в Docker-контейнере, собрать все нужные сервисы через docker-compose
и не мучиться с локальной установкой. Это не только ускоряет старт, но и позволяет держать окружение чистым, воспроизводимым и легко переносимым. В этом посте разберемся, как это сделать без боли, с минимумом костылей и максимумом пользы.
Возможности
- Быстрый запуск Jenkins и сопутствующих сервисов (Git, базы, агенты) в одном docker-compose файле.
- Легкое масштабирование и переносимость между машинами/командами/окружениями.
- Изоляция – не засоряешь свою систему лишними пакетами и зависимостями.
- Автоматизация рутинных задач (тесты, деплой, сборка артефактов) по-настоящему становится автоматизацией.
- Быстрое восстановление после фейла – просто пересобрал контейнеры, и всё снова работает.
Что требуется (требования, ОС, железо)
- OS: Linux (Ubuntu 20.04+, CentOS 7+, Debian 10+), MacOS, Windows (WSL2 желательно).
- Железо: 2+ ядра, 4+ ГБ оперативки (Jenkins любит RAM, особенно с плагинами).
- Docker https://docs.docker.com/get-docker/
- docker-compose https://docs.docker.com/compose/install/
- Базовые знания работы с терминалом и Docker.
Установка — пошаговая инструкция
- Устанавливаем Docker и docker-compose
# Ubuntu sudo apt update sudo apt install docker.io docker-compose -y sudo systemctl enable --now docker # Проверяем версии docker --version docker-compose --version
На MacOS и Windows проще: ставь Docker Desktop, там всё в комплекте.
- Создаем рабочую папку и docker-compose.yml
mkdir ~/jenkins-docker cd ~/jenkins-docker nano docker-compose.yml
Пример минимального
docker-compose.yml
:version: "3.8" services: jenkins: image: jenkins/jenkins:lts container_name: jenkins restart: unless-stopped ports: - "8080:8080" - "50000:50000" volumes: - jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock environment: - JAVA_OPTS=-Djenkins.install.runSetupWizard=false volumes: jenkins_home:
jenkins_home
– для хранения данных Jenkins между перезапусками./var/run/docker.sock
– позволяет Jenkins запускать Docker-контейнеры (например, для сборки).
- Запускаем Jenkins
docker-compose up -d
Через минуту Jenkins будет доступен на http://localhost:8080. Логинимся, находим initialAdminPassword командой:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
- Устанавливаем плагины (по желанию)
В GUI Jenkins или через CLI. Самое нужное:Docker Pipeline
,Git
,Blue Ocean
,Pipeline: Multibranch
. - Добавляем агента (если надо)
Можно добавить еще один сервис вdocker-compose.yml
для Jenkins agent. Пример:agent: image: jenkins/inbound-agent environment: - JENKINS_URL=http://jenkins:8080 - JENKINS_AGENT_NAME=agent-1 - JENKINS_SECRET=секрет_из_jenkins depends_on: - jenkins
Использование, полный список команд и вариантов
- Запуск/остановка Jenkins
docker-compose up -d # Запуск в фоне docker-compose down # Остановка и удаление контейнеров docker-compose restart # Перезапуск
- Просмотр логов
docker-compose logs -f jenkins
- Обновление Jenkins
docker-compose pull docker-compose up -d --force-recreate
- Восстановление после сбоя
docker-compose down docker-compose up -d
Данные останутся, если не удалять volume
jenkins_home
. - Добавление новых сервисов (например, Postgres, Redis и т.д.)
postgres: image: postgres:13 environment: POSTGRES_USER: jenkins POSTGRES_PASSWORD: jenkins POSTGRES_DB: jenkins_db volumes: - pg_data:/var/lib/postgresql/data
И не забудь добавить
pg_data:
в секциюvolumes
.
Ошибки, как делать не надо
- Не запускай Jenkins как root на проде – создай отдельного пользователя.
- Не храни пароли и секреты в
docker-compose.yml
в открытом виде – используй .env или Docker secrets. - Не забывай про бэкапы volume
jenkins_home
– потеряешь его, потеряешь все проекты и настройки. - Не ставь слишком много плагинов – Jenkins может стать нестабильным и медленным.
- Не используй
latest
теги для продакшн – всегда фиксируй версию образа.
Пример реального использования в окружении
На одном из проектов мы подняли Jenkins + Docker Compose для сборки и деплоя микросервисов на staging. В docker-compose.yml
были Jenkins, Postgres, RabbitMQ и несколько Jenkins agents. Каждый pipeline собирал Docker-образ, пушил его в приватный Registry, а потом деплоил на Kubernetes через kubectl (тоже в контейнере). Все секреты – через .env
и docker secrets. Jenkins обновлялся одной командой docker-compose pull && docker-compose up -d
. Если что-то ломалось – пересобирали контейнеры, и всё снова работало.
Такой подход сэкономил кучу времени на настройке и упростил жизнь новым членам команды: клонируешь репу, делаешь docker-compose up
– и у тебя готовое CI/CD-окружение.
Заключение
Jenkins в Docker с docker-compose – это реально must-have для тех, кто не хочет тратить время на ручную настройку и любит reproducible infrastructure. Быстро, удобно, безопасно и гибко. Для глубокого погружения советую почитать:
- Официальная документация Jenkins по Docker
- Документация Docker Compose
- Плагин Docker Pipeline для Jenkins
Не бойся экспериментировать, автоматизируй всё, что можно, и не забывай про бэкапы. Удачи в CI/CD!
Ваш отзыв