Jenkins в Docker: настройка CI/CD с docker-compose

Если ты хоть раз настраивал 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.

Установка — пошаговая инструкция

  1. Устанавливаем 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, там всё в комплекте.

  2. Создаем рабочую папку и 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-контейнеры (например, для сборки).
  3. Запускаем Jenkins
    docker-compose up -d
    

    Через минуту Jenkins будет доступен на http://localhost:8080. Логинимся, находим initialAdminPassword командой:

    docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    
  4. Устанавливаем плагины (по желанию)
    В GUI Jenkins или через CLI. Самое нужное: Docker Pipeline, Git, Blue Ocean, Pipeline: Multibranch.
  5. Добавляем агента (если надо)
    Можно добавить еще один сервис в 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. Быстро, удобно, безопасно и гибко. Для глубокого погружения советую почитать:

Не бойся экспериментировать, автоматизируй всё, что можно, и не забывай про бэкапы. Удачи в CI/CD!

Хотите прочитать больше про Разное?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *