В этой публикации я расскажу про реестр контейнеров реестр контейнеров Harbor. Точнее про его установку. К сожалению, особо подробно расписывать установку времени нет, но основные моменты я отмечу.
В качестве операционной системы я буду использовать Ubuntu Server 22.04.
Почему Harbor?
Для внутренних нужно нужно было какое-то решение для хранения готовых образов Docker. Изначально планировалось использование репозитория контейнера Gitea, но столкнулись с тем, что почему-то при скачивании образов некоторые слои не удавалось загрузить. Примерно так:
Почему? Возможно, что какой-то баг в репозиториях контейнеров Gitea.
Альтернатива была в виде нативного репозитория Docker Registry. Но, мы решили попробовать решение Harbor, т.к. оно включает в себя веб панель администрирования, возможность создавать проекты, пользователей и много других возможностей.
Предварительные требования
Полный перечень предварительных требований приведен на странице официального руководства.
Аппаратные требования
Аппаратные требования приведены в таблице ниже.
Компонент | Минимальные требования | Рекомендуемые требования |
Кол-во ЦП, шт. | 2 | 4 |
Объем оперативной памяти, ГБ | 4 | 8 |
Объем диска, ГБ | 40 | 160 |
Программные требования
Программные требования приведены в таблице ниже.
ПО | Версия |
Docker engine | Версия 17.06.0 или новее |
Docker Compose | Версия 1.18.0 или новее |
Дополнительно необходима утилита openssl, если вы планируете генерировать самоподписанный сертификат. Я буду устанавливать сертификат от Let’s Encrypt. Соответственно, мне openssl не будет нужен.
Реестр контейнеров Harbor – установка
Я разделил процесс установки Harbor на два этапа – подготовительный и непосредственно саму установку.
Подготовка операциооной системы и установка предварительного ПО
Сначала установим все необходимые обновления на сервер:
sudo apt update
sudo apt -y upgrade
Установим docker и docker-compose
sudo apt install -y docker.io docker-compose
Запустим сервис docker и разрешим его автозапуск:
sudo systemctl start docker && sudo systemctl enable docker
Теперь я скопирую открытый и закрытый ключ SSL сертификата на сервер, чтобы настроить доступ по HTTPS с сертификатом от доверенного центра сертификации:
scp itproblog.crt itproblog.key 10.10.10.22:~
Вы можете выпустить сертификат от Let’s Encrypt или сгенерировать самоподписанный сертификат.
Для размещения Harbor на файловой системе я создам соответствующую директорию в opt:
sudo mkdir /opt/harbor
Также создам отдельную директорию для ключей SSL сертификата и скопирую их туда:
sudo mkdir /opt/harbor/certs
sudo cp $HOME/itproblog* /opt/harbor/certs/
И еще создам директорию для хранения данных приложения:
sudo mkdir /opt/harbor/data
Установка Harbor
Теперь можем приступить к установке Harbor. Сначала загрузим самую последнюю версию дистрибутива с репозитория.
Есть два типа установщика – оффлайн установщик и онлайн установщик. Я буду использовать онлайн установщик. На момент подготовки материала статьи самая последняя версия была v2.6.3. Я буду устанавливать именно её.
cd /opt/harbor/
sudo wget https://github.com/goharbor/harbor/releases/download/v2.6.3/harbor-online-installer-v2.6.3.tgz
Распаковываем архив:
sudo tar xzvf harbor-online-installer-v2.6.3.tgz -C /opt
Создадим конфигурационный файл:
sudo cp harbor.yml.tmpl harbor.yml
В этом конфигурационном файле нам нужно будет сконфигурировать ряд параметров, которые представлены в таблице ниже.
Параметр | Назначение | Значание | |
hostname | DNS-имя по которому вы будите обращаться к сервису. Именно на это имя вы долдны выпустить сертификат (либо самоподписанный, либо от стороннего ЦС). | cr.itproblog.ru | |
harbor_admin_password | Пароль пользователя admin для доступа к веб интерфейсу администрирования | Qwerty123 | |
password | Пароль для доступа в базе данных postgres | Qwerty123 | |
data_volume | Директория для хранения данных приложения | /opt/harbor/data/ | |
certificate | Открытый ключ SSL сертификата | /opt/harbor/certs/itproblog.crt | |
private_key | Закрытый ключ SSL сертификата | /opt/harbor/certs/itproblog.key |
Внесем изменения в конфигурационный файл:
sudo nano harbor.yml
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: cr.itproblog.ru
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /opt/harbor/certs/itproblog.crt
private_key: /opt/harbor/certs/itproblog.key
<...>
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Qwerty123
# Harbor DB configuration
database:
# The password for the root user of Harbor DB. Change this before any production use.
password: Qwerty123
# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
max_idle_conns: 100
# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
# Note: the default number of connections is 1024 for postgres of harbor.
max_open_conns: 900
# The default data volume
data_volume: /opt/harbor/data/
Сохраняем внесенные изменения.
Теперь все готово к тому, чтобы запустить установку Harbor. Команда для запуска установки:
sudo ./install.sh --with-notary --with-trivy --with-chartmuseum
Status: Downloaded newer image for goharbor/chartmuseum-photon:v2.6.3
Creating harbor-log ... done
Creating chartmuseum ... done
Creating harbor-db ... done
Creating registryctl ... done
Creating redis ... done
Creating registry ... done
Creating harbor-portal ... done
Creating notary-signer ... done
Creating trivy-adapter ... done
Creating harbor-core ... done
Creating notary-server ... done
Creating harbor-jobservice ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Дожидаемся окончания процесса установки. В процессе установки скрипт install.sh выполнит загрузку необходимых образов, настройки и создаст файл docker-compose для последующего запуска или остановки сервисов.
Теперь можем попробовать запустить веб панель администрирования. В моем случае адрес будет следующий:
https://cr.itproblog.ru/
Логин – admin. Стандартный пароль Harbor12345, я его изменял в конфигурационном файле выше. С настройками, как я приводил выше информация по подключению будет следующая:
login: admin
password: Qwerty123
В случае успешного запуска и логина вы увидите первоначальный экран веб интерфейса администрирования:
Кстати, обратите внимание, что в первоначально директории (из которой мы запускали установку) был создан файл docker-compose для запуска и остановки всех сервисов:
roman@harbor:/opt/harbor$ ls
LICENSE common data harbor-online-installer-v2.6.3.tgz harbor.yml.tmpl prepare
certs common.sh docker-compose.yml harbor.yml install.sh
roman@harbor:/opt/harbor$
Теперь вы можете подключаться к doker репозиторию и выполнять все рядовые операции – загружать образы, выгружать образы и т.д.:
sudo docker login cr.itproblog.ru
Устранение возможных проблем после перезагрузки сервера
В ходе использования репозитория контейнеров Harbor я столкнулся с тем, что после перезагрузки сервера иногда веб панель администрирования может быть не доступна.
Если посмотреть статус контейнеров, то можно увидеть, что один из контейнеров (nginx) не может запуститься успешно:
В его журнале можно увидеть следующие ошибки:
sudo docker logs nginx
2023/01/13 16:48:58 [emerg] 1#0: host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
nginx: [emerg] host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
2023/01/13 16:49:50 [emerg] 1#0: host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
nginx: [emerg] host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
2023/01/13 16:50:50 [emerg] 1#0: host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
nginx: [emerg] host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
2023/01/13 16:51:51 [emerg] 1#0: host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
nginx: [emerg] host not found in upstream "notary-server:4443" in /etc/nginx/conf.d/notary.upstream.conf:2
Насколько я понял – эта ошибка возникает из-за порядка запуска сервисов. Как её устранить? Об этом чуть ниже.
Решение
Я победил её следующим образом – в файле crontab для события перезагрузки системы настроил остановку и запуск всех сервисов через docker-compose.
Сначала нужно добавить новую запись в файл crontab. Сначала переключимся в контекст супер пользователя:
sudo su
И добавим новую запись в crontab:
crontab -e
@reboot docker-compose -f /opt/harbor/docker-compose.yml down; docker-compose -f /opt/harbor/docker-compose.yml up -d
После сохранения файла и выхода из режима редактирования вы должны увидеть сообщение о том, что запить добавлена в crontab.
roman@harbor:~/harbor$ sudo su
root@harbor:/home/roman/harbor# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
root@harbor:/home/roman/harbor#
После внесенных изменений проблем с доступностью сервиса я не наблюдал.