Установка и запуск docker в контейнере Docker, работающем в Openshift - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я работаю над следующим сценарием

Я пытаюсь настроить контейнер в OpenShift, который запускает Jenkins, который сам может запускать докер, чтобы использовать декларативные конвейеры, где сборка выполняется в нем.собственный докер-контейнер.Это в основном делает необходимым установку и запуск docker внутри этого контейнера.

Я работал над ним довольно давно.Проверил десятки сообщений и тем в сети, но я не смог этого сделать.В общем, я дошел до сих пор

  • Я могу установить докер в свой контейнер (из baseimage openshift / jenkins-2-centos7: последняя версия)
  • Я не могу заставить работать докер какэто использует systemctl, который

Теперь я читал, что systemctl не работает внутри док-контейнеров или, по крайней мере, крайне не рекомендуется, поскольку он мешает PID 1 в системе.Без

systemctl start docker

я не смогу подключиться к демону (как и ожидалось) и сообщение об ошибке

Невозможно подключиться к демону Docker.,Docker -d работает на этом хосте?

Поэтому я попытался настроить демона, используя

, следующий в моем Dockerfile

RUN usermod -aG docker $(whoami)
RUN dockerd -H unix:///var/run/docker.sock

, который также не будет работать, сообщая, что cgroups не может быть смонтирована.После еще одного исследования я обнаружил, что это можно сделать с помощью скрипта cgroupfs-mount из

https://github.com/tianon/cgroupfs-mount/tree/master

Но и здесь мне не повезло, оставив меня со следующей ошибкой

Ошибка запуска демона: Ошибка инициализации сетевого контроллера: ошибка при получении экземпляра контроллера: не удалось создать цепочку NAT DOCKER: сбой iptables: iptables -t nat -N DOCKER: iptables v1.4.21: невозможно инициализировать iptablestable `nat ': В доступе отказано (вы должны быть пользователем root) Возможно, iptables или ваше ядро ​​необходимо обновить.

Теперь, после нескольких часов, у меня закончились идеи.У кого-нибудь есть идеи, как заставить работать докер внутри OpenShift?Было бы очень здорово

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Вам понадобится привилегированный модуль, запускающий jenkins, который монтирует докер-сокет узла openshift.Это плохая идея, поскольку jenkins запустит контейнер вне семантики и контроля kubernetes.

Почему бы не использовать s2i service , поставляемый с openshift?

С уважением.

0 голосов
/ 01 февраля 2019

Я пытаюсь настроить контейнер в OpenShift, который запускает Jenkins, который сам может запускать docker, чтобы использовать декларативные конвейеры, где сборка выполняется в своем собственном docker-контейнере.Это, в основном, делает необходимым установить и запустить Docker внутри этого контейнера.

Я не думаю, что ваш вывод здесь является единственной возможностью, и то, что я опишу ниже, является более простым подходом, чтобы получить то, что(Думаю) хочешь!:) Если у вас есть другие варианты использования, кроме этих 3, которые я опишу, дайте мне знать, и я постараюсь обновить их, чтобы охватить их:

  • Трубопроводы, работающие в своих собственных контейнерах
  • Запуск дополнительных контейнеров из конвейеров
  • Создание образов контейнеров из конвейеров

Конвейеры, работающие в своих собственных контейнерах

Для этого случая естьотличный плагин Kubernetes .

С помощью этого плагина вы добавляете облако Kubernetes / OpenShift в глобальную конфигурацию Jenkins.Это может быть либо тот, в котором работает Jenkins (если вы используете образ Jenkins, предоставленный OpenShift, по крайней мере, он добавляется по умолчанию), либо внешний кластер.

Внутри этой конфигурации вы можете определить PodTemplates(опять же, есть пара примеров, представленных в образе Jenkins, предоставленных OpenShift), или вы можете указать это в своем конвейере напрямую, я думаю.Когда ваш конвейер запрашивает узел / агент с меткой, совпадающей с одним из них (и не существует давно работающих агентов, которые совпадают), из этого шаблона будет создан модуль pod, и ваше выполнение конвейера будет происходить внутри контейнера в этом,Как только он больше не нужен, он снова будет депровизирован.

Вот шаги конвейера, представленные этим плагином: https://jenkins.io/doc/pipeline/steps/kubernetes/

Запуск дополнительных контейнеров из конвейеров

Как частьвашего конвейера, вы можете захотеть запустить некоторые тесты, и те могут ожидать, что смогут взаимодействовать, например, с базой данных.Вы можете создать ресурсы для этого в своем проекте OpenShift (например, Развертывание и предоставить его с помощью Сервиса), а затем разорвать их.Плагин openshift-client очень полезен здесь и содержит документы о том, как взаимодействовать с OpenShift.

Создание образов контейнеров из конвейеров

Если ваша цель - создать образы контейнеровиз конвейеров помните, что OpenShift также предоставляет эту возможность (в зависимости от конфигурации безопасности) через Builds .Как и в предыдущем разделе, вы можете использовать плагин openshift-client для создания и запуска сборок.


Для получения дополнительной информации об образе Jenkins, который поддерживается OpenShift (и обычнокак делать полезные вещи в Jenkins на OpenShift), есть эта выделенная страница в документации OpenShift .

0 голосов
/ 31 января 2019

У вас есть эта статья от @jpetazzo, от команды Docker, о Docker In Docker (DinD):

статья:

Основной целью Docker-in-Docker было помочь в разработке самого Docker.Многие люди используют его для запуска CI (например, с Jenkins), что поначалу кажется нормальным, но они сталкиваются со многими «интересными» проблемами, которых можно избежать, если вместо этого подключить разъем Docker к вашему контейнеру Jenkins.

DinD Repo:

Эта работа устарела благодаря совместным усилиям некоторых удивительных людей, таких как @jfrazelle и @tianon, которые также являются черными поясами в искусстве расставлять мебель IKEA.вместе.

Если вы хотите запустить Docker-in-Docker сегодня, все, что вам нужно сделать, это:

docker run --privileged -d docker:dind

Итак, здесь - это статьяиспользуя другой подход для построения док-контейнеров с Jenkins внутри док-контейнера:

docker run -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  jenkins/jenkins:lts

Таким образом, вы можете адаптировать одно из этих решений к вашему сценарию OpenShift.Я надеюсь, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...