Настройка обеспечена мастером Дженкинса с докером

Я хотел бы создать защищенный мастер-сервер Jenkins на ec2 с докере. Я использую стандартный файл docker jenkins отсюда: https://registry.hub.docker.com/_/jenkins/

По умолчанию открывается незащищенный порт 8080 http. Однако я хочу, чтобы он использовал стандартный 443-порт с https (сначала я хочу использовать самоподписанный сертификат ssl).

Я немного изучил эту тему и нашел несколько возможных решений. Я не очень опытен с докером, поэтому я все еще не мог найти простой, который я могу использовать или реализовать. Вот несколько вариантов, которые я нашел:

  • Используйте стандартный доклер jenkins на 8080, но настройте защищенный сервер apache или nginx на моем экземпляре ec2, который перенаправит трафик. Мне это не нравится, потому что сервер будет за пределами докера, поэтому я не могу сохранить его в контроле версий
  • Как-то измените файл докеры jenkins, чтобы запустить jenkins с https, настроенным в соответствии с https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins. Я не уверен, как это сделать. Нужно ли создавать собственный контейнер докеров?
  • использовать файл докеров с защищенным nginx, подобным этому https://registry.hub.docker.com/u/marvambass/nginx-ssl-secure/ и каким-то образом объединить два контейнера докеров или заставить их общаться? Не знаю, как это сделать.

Может ли кто-нибудь испытать, пожалуйста, рекомендую мне лучшее решение?

P.S. Я не уверен, сколько проблем ec2 собирается дать мне, но я предполагаю, что он просто открыл 443 в группе безопасности.

Ответ 1

После прохождения нескольких учебных пособий на Docker я обнаружил, что самым простым вариантом является номер 2. Длинное изображение Дженкинса объявляет точку входа таким образом, что вы можете легко передать аргументы дженкинсам.

Допустим, что у вас есть хранилище ключей (например, самоподписанное в этом примере) как jenkins_keystore.jks в домашней папке экземпляра ubuntu ec2. Вот пример того, как сгенерировать один:

keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 2048

Теперь вы можете легко настроить jenkins для запуска на https только без создания собственного изображения докеров:

docker run -v /home/ubuntu:/var/jenkins_home -p 443:8443 jenkins --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword
  • -v /home/ubuntu:/var/jenkins_home предоставляет домашнюю папку хоста контейнеру dener jenkins
  • -p 443:8443 отображает порт 8443 jenkins в контейнере в порт 443 хоста
  • --httpPort=-1 --httpsPort=8443 блокирует jenkins http и предоставляет его с https на порту 8443 внутри контейнера.
  • --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword предоставляет ваше хранилище ключей, которое было отображено из домашней папки хоста в контейнер /var/jenkins_home/.

Ответ 2

Я бы использовал nginx вместе с jenkins в том же контейнере и использовал supervisord для управления обоими процессами. Защита различных сервисов со встроенными инструментами - это боль; nginx работает одинаково для всех сервисов и легко настраивается. Возможно, и в какой-то мере лучше использовать docker-compose (было показано), чтобы создать два разных контейнера и связать их с довольно внутренней сетью, которую докер предоставляет со ссылками. Проблема в том, что совместная работа рабочих пар все еще не поддерживается в менеджерах кластеров, таких как марафон. Гораздо проще сообщить большинству служб о запуске одного контейнера, а не запускать два контейнера, но убедитесь, что они находятся на одном хосте.

Ответ 3

Как и Отогнан, я бы тоже порекомендовал заняться # 2, но, похоже, его ответ устарел.

Прежде всего, используйте изображение jenkins/jenkins:lts, так как изображение jenkins устарело (см. Https://hub.docker.com/_/jenkins/).

Теперь давайте настроим это. Вам нужно будет остановить ваш текущий контейнер jenkins, чтобы освободить порты.

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

keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 4096

Далее, давайте передадим аргументы SSL в контейнер jenkins. Это скрипт, который я использую для этого:

read -s -p "Keystore Password:" password
echo
sudo cp jenkins_keystore.jks /var/lib/docker/volumes/jenkins_home/_data
docker run -d -v jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 443:8443 -p 50000:50000 jenkins/jenkins:lts --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password
  • этот скрипт запрашивает у пользователя пароль хранилища ключей
  • -v jenkins_home: /var/jenkins_home создает именованный том с именем jenkins_home, который, по jenkins_home, существует в /var/lib/docker/volumes/jenkins_home/_data.
    • если каталог в /var/lib/docker/volumes/jenkins_home/_data еще не существует, вам необходимо создать именованный том с помощью docker volume перед копированием хранилища ключей.
  • -p 443:8443 сопоставляет порт 8443 jenkins в контейнере с портом 443 хоста
  • --httpPort=-1 --httpsPort=8443 блокирует http и выставляет https на порт 8443 внутри контейнера (порт 443 вне контейнера).
  • --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password обеспечивает ваше хранилище ключей, которое находится в /var/jenkins_home/jenkins_keystore.jks внутри контейнера (/var/lib/docker/volumes/jenkins_home/_data/jenkins_keystore.jks вне контейнера).
  • -v/var/run/docker.sock: /var/run/docker.sock является обязательным, но это рекомендуемый способ, позволяющий вашему экземпляру jenkins раскрутить другие контейнеры-докеры.
  • -v $(which docker): /usr/bin/docker также необязателен, но позволяет контейнеру jenkins иметь возможность запускать бинарный файл docker.
    • Помните, что, поскольку докер теперь динамически связан, он больше не поставляется с зависимостями, поэтому вам может потребоваться установить зависимости в контейнере.
    • Альтернативой является -v $(which docker): /usr/bin/docker и установка docker внутри контейнера jenkins. Вам необходимо убедиться, что внутренний докер контейнера и внешний хост хоста имеют одинаковую версию, так что связь через /var/run/docker.sock поддерживается.
    • В любом случае вы можете использовать Dockerfile для создания нового образа док-станции Jenkins.
    • Другой альтернативой является включение -v $(which docker): /usr/bin/docker, но установка статически связанного двоичного файла docker на хост-компьютере.

Теперь у вас должен быть доступ к веб-порталу jenkins через https без указания порта (поскольку порт 443 по умолчанию используется для https)

Спасибо Отогнану за то, что он привел меня сюда.