Подарите себе и изображениям своей команды дом: используйте Harbor, чтобы создать частный центр изображений Docker.
Подарите себе и изображениям своей команды дом: используйте Harbor, чтобы создать частный центр изображений Docker.

По сравнению с традиционными методами развертывания некоторые предприятия и группы разработчиков все чаще склоняются к использованию облачных технологий. Контейнеризация является ключевым моментом. Очень удобно автоматизировать процесс записи, тестирования, публикации и развертывания программного обеспечения с помощью облачной технологии.

Картинка в заголовке!
Картинка в заголовке!

Так? Если мы хотим контейнеризировать проекты, автоматизировать тестирование и развертывание программного обеспечения, как развернуть центр зеркалирования контейнеров? Особенно в GitLab PipelineиJenkinsДля внутреннего использования,Взаимодействие с кластером интрасети,Используя центр зеркала контейнера, нет необходимости учитывать стоимость пропускной способности внешней сети, скорость высокая, и это так же легко, как съесть шоколад.

Вспомогательное обучающее видео

В этой статье используется облегченный сервер приложений Tencent Cloud для создания соответствующего руководства. Друзья могут обратиться к адаптации руководства для работы:

Harbor VS Docker Registry

Harbor — это сервер реестра корпоративного уровня для хранения и распространения образов Docker. Он расширяет Docker Distribution с открытым исходным кодом, добавляя некоторые важные для предприятия функции, такие как безопасность, идентификация и управление. Будучи частным сервером реестра корпоративного уровня, Harbour обеспечивает более высокую производительность и безопасность. Повысьте эффективность пользователей, использующих реестр для создания и запуска среды для передачи образов.

То есть,по сравнению сВстроенный реестр Docker

  • Предоставить на основеГрафический интерфейс управления веб-интерфейсом,Более удобный для пользователя
  • Поддерживает механизмы контроля доступа для пользователей, проектов и изображений.
  • Изображения можно сканировать, чтобы найти уязвимости и повысить безопасность.
  • Полностью поддерживает стандартизированное управление корпоративными пользователями, такое как LDAP/AD.
  • Может быть хорошо интегрирован в процессы CI/CD.
  • Предоставить открытые функции API для облегчения стыковки со сторонними системами.

Очень подходит для команд и малых и средних предприятий.

Зеркальный центр своими руками.

Некоторые друзья могут не понимать, зачем им нужно создавать собственный зеркальный центр Docker? Не лучше ли напрямую получить официальный источник или общедоступное облачное изображение?

Действительно,Если это просто личное исследование или сервер, которому нужен только публичный имидж,Удобнее напрямую использовать общедоступные источники изображений.。ноЕсли вам нужно создавать свои собственные продукты, зеркалировать проекты и выполнять непрерывные итерации,Вам понадобится выделенный зеркальный склад для распределения хранилища:

  • Упрощает управление версиями, выпуск и откат частных образов продуктов, а также поддерживает развертывание в нескольких средах;
  • После обновления продукта новые изображения можно отправлять одним щелчком мыши с помощью атомарных операций;
  • Зеркальная сборка можетИндивидуальная интеграция в конвейер CI/CD,Например: в GitLab При использовании CI/CD используйте собственный образ, чтобы напрямую пропустить базовую упаковку зависимостей;
  • Поддерживает собственное пространство имен, чтобы отличить его от изображений в общедоступных источниках;
  • Частные источники можно настроить с помощью элементов управления разрешениями, и доступ к ним могут получить только разработчики.

Приведите пример,Если вы используете конвейер GitLab,Создать проект,нуждатьсяNodejsА как насчет окружающей среды?每次都нуждаться:Извлечь образ Nodejs -> Изменить источник обновления пряжи -> Установить зависимости -> Создать проект -> Проект развертывания

GitLab
GitLab

но,Использовать частный репозиторий напрямую,При подключении к интранету,Используйте образ интрасети напрямую, чтобы заранее упаковать и настроить его.Nodejsзеркало:Извлечь личное изображение Nodejs -> Установить зависимости -> Создать проект -> Развертывание в Docker

Скорость будет намного выше, и вы даже сможете использовать собственный образ для отправки сообщений после развертывания:

сборочная линия
сборочная линия
Результаты отправки WeChat
Результаты отправки WeChat

Однако трудно поддерживать вышеуказанные требования к разработке имиджа продукта и непрерывной доставке, напрямую используя общедоступные источники. Поэтому крайне важно построить свой собственный зеркальный центр. Конечно, вы также можете напрямую приобрести частное решение для хранения изображений Tencent Cloud, что также является хорошим методом:

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

Выбрать гавань?

Существует множество других сторонних вариантов создания Docker-центра. Помимо непосредственной покупки решения для приватизации у указанного выше поставщика облачных услуг, вы также можете использовать другие аналогичные решения для хранения частных изображений, например: Sonatype Nexus Repository OSS

Фактически, Nexus также может завершить строительство зеркального центра.,Преимущество использования Harbour в том, что его легко развернуть, особенно намного проще настроить SSL.

Мой текущий сервер, внутреннее соединение Tencent Cloud, выглядит следующим образом:

мой текущий сервер
мой текущий сервер

Жаль, что мы тогда плохо спланировали; мы не купили все серверы в одном районе!

Вау вау вау
Вау вау вау

Условия эксплуатации

Прежде всего, настоятельно рекомендуется сотрудничать с официальной документацией:

В частности, в отношении SSL используйте OpenSSL для самоподписания. При активации Nginx HTTPS он используется для завершения зашифрованной передачи и шифрования входа в Docker на других устройствах:

Официальный раздел по настройке SSL
Официальный раздел по настройке SSL

Второе — конфигурация сервера. На данный момент официально рекомендуемое оборудование:

Информация о конфигурации

самый низкий

рекомендовать

CPU

2 CPU

4 CPU

Память

4 GB

8 GB

хранилище

40 GB

160 GB

Но я протестировал и обнаружил, что 2 ГБ памяти на самом деле достаточно для отдельных лиц и небольших команд.

О программном обеспечении серверов Linux в целом сказать особо нечего:

  1. Docker Engine: требуется версия не ниже v17.06.0-ce;
  2. Docker Compose: требуется как минимум версия v1.18.0;
  3. OpenSSL: версия не должна быть слишком низкой.,Вы можете подписать сертификат самостоятельно, но рекомендуется также подписать его самостоятельно.

Развертывание образа Harbour

Учебник официально начинается. На этот раз мы используем:

  • Производитель сервера: Tencent Cloud легкий сервер приложения2C2G Гуанчжоу;
  • Версия Linux: Debian11.

Установить Докер

сначала это Установить Докер,конкретные операции,Вы можете обратиться к моему предыдущему руководству по настройке GitLab:

Эффект от установки Docker:

Установить Докеруспех
Установить Докеруспех

Инсталляционный пакет порта

Если ваш сервер находится в материковом Китае,Тогда предлагаю вам в процессе скачивания Инсталляционный пакет порта,Обязательно выберите версию автономной установки.

Версия автономной установки включает в себя все зависимые образы (такие как Nginx, Logger и т. д.), конечно, если вы выбираете Гонконг и другие регионы сервера приложений Tencent Cloud Light, вам не нужно это учитывать;

Инсталляционный пакет портаскачать адрес:Harbor Github Releases: https://github.com/goharbor/harbor/releases

Загрузите версию Harbour для автономной установки.
Загрузите версию Harbour для автономной установки.

После распаковки внутренняя структура файла:

Язык кода:tree
копировать
harbor
├── common.sh         # Общие команды, используйте драйвер install.sh
├── harbor.v2.7.3.tar.gz  
├── harbor.yml.tmpl   # Шаблон конфигурации
├── install.sh        # Скрипт установки
├── LICENSE
└── prepare    

На этом предварительные приготовления завершены.

Самозаверяющий сертификат OpenSSL

Для повышения безопасности доступ к развернутой нами гавани осуществляется через HTTPS, и для шифрования связи требуется сертификат SSL. Предотвратите перехват и подделку данных посредниками.

Сертификаты, выданные доверенным центром сертификации (CA), необходимо обновлять либо один раз в год, либо каждые 3 месяца. Однако после запуска нашей гавани, если нет уязвимости безопасности, ее нельзя будет изменить в течение нескольких лет после запуска. Что нам следует делать в это время?

Ответ: самозаверяющий сертификат OpenSSL.,Вы можете подписать контракт на десять лет. Вы не можете позволить себе продлить срок действия сервера, но сертификат все еще действителен.

Будьте смелыми и подпишите сертификат на 100 лет. Когда вы уйдете, сертификат все равно останется там~(^ω^)

Недостатки:

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

Теперь приступаем к созданию сертификата:

Язык кода:shell
копировать
# Сгенерировать ключ
openssl genrsa -out yourdomain.com.key 4096
# Генерировать открытый ключ
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=mintimate/OU=Personal/CN=yourdomain.com" \
 -key yourdomain.com.key \
 -out yourdomain.com.crt

Объясните значение параметров открытого ключа:

  • -x509: укажите для создания самозаверяющего сертификата X.509;
  • -nodes: указывает, что сгенерированный закрытый ключ не зашифрован;
  • -sha512: указывает на использование алгоритма хеширования SHA-512 для подписи.
  • -days 3650: указывает, что сертификат действителен в течение 3650 дней (приблизительно 10 лет).
  • -subj "/C=CN/ST=Beijing/L=Beijing/O=minimize/OU=Personal/CN=yourdomain.com": укажите информацию о субъекте сертификата. «C» представляет код страны (Country), «ST» представляет провинцию/штат (State), «L» представляет город (Locality), «O» представляет организацию (Organization), а «OU» представляет организационную структуру. единица (организационная единица), «CN» означает общее имя.
  • -key yourdomain.com.key: укажите файл закрытого ключа, используемый для подписи сертификата.
  • -out yourdomain.com.crt: указывает выходной путь и имя созданного файла сертификата.
Создайте пару ключей, действительную в течение десяти лет.
Создайте пару ключей, действительную в течение десяти лет.

На основе сгенерированного ключа и открытого ключа мы используем сгенерированный сертификат для проверки соответствия сертификата, соответствующего имени домена, на стороне сервера, создаем здесь файл конфигурации расширения сертификата:

Язык кода:shell
копировать
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF
Расширенное создание файла конфигурации
Расширенное создание файла конфигурации

Наконец, сгенерируйте соответствующий сертификат:

Язык кода:shell
копировать
# Создать запрос на подпись
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key yourdomain.com.key \
    -out yourdomain.com.csr

# Используйте только что созданный центр сертификации Ключевая подпись CSR, а также только что упомянутые внутренние параметры v3.ext
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in yourdomain.com.csr \
    -out yourdomain.com.crt

Запомните текущий адрес сертификата, предполагая:

  • /home/mintimate/myApplication/harbor/ssl

Что мы можем сделать дальше.

Инициализировать гавань

Чиновник действительно дал один Шаблон конфигурации,Он находится в папке после распаковкиharbor.yml.tmpl。Мы напрямуюкопировать Одна порция выходит,Внесите изменения на его основе:

Язык кода:shell
копировать
cp harbor.yml.tmpl harbor.yml

Внесите изменения впоследствии:

Настройки инициализации
Настройки инициализации

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

  • имя хоста: адрес доступа к гавани,其实иexternal_urlпочти
  • https/port: открыть Harbor порт 8443;
  • https/certificate: используйте файл сертификата SSL хоста;
  • https/private_key: использовать файл ключей SSL хоста;
  • external_url: Установить через доменное имяdocker.example.comдоступ。

А поскольку мы используем собственный Nginx для обратного прокси-сервера Harbor, нам необходимо изменить http/port на другие адреса, например: 8080, 8081.

Затем используйте встроенный сценарий установки для инициализации:

Язык кода:shell
копировать
sudo ./install
Запустить скрипт инициализации
Запустить скрипт инициализации

Если предыдущие конфигурации верны, то докер-контейнер в это время уже будет запущен:

Запустить успешно
Запустить успешно

Nginx можно настроить следующим образом, который на самом деле является простым обратным прокси-сервером:

Язык кода:text
копировать
server{
    listen 80;
    listen 443 ssl http2;
    server_name domain.com;

    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    ssl_certificate    /home/mintimate/myApplication/harbor/ssl/domain.com.crt;
    ssl_certificate_key    /home/mintimate/myApplication/harbor/ssl/domain.com.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass    https://127.0.0.1:8443;  #Обратите внимание на порт здесь
    }
}

На данный момент Harbour готов к тестовому доступу.

Посетите гавань

Следующий,Вы можете получить к нему доступ с помощью браузера. Посетите гавань. Ничего неожиданного,Возникает такая ошибка проверки сертификата SSL:

Ошибка проверки сертификата SSL
Ошибка проверки сертификата SSL

Причина проста,Наш SSL-сертификат не выдан профессиональной и заслуживающей доверия организацией.,даМы используем OpenSSL для подписи. Браузер думает, что сертификат поддельный;Но это не имеет никакого эффекта,Зашифрованная передача все еще возможна.,Если вы беспокоитесь,Вы можете проверить, является ли это сертификатом, подписанным вами:

Содержание сертификата
Содержание сертификата

Как видите, это подписанный нами сертификат сроком действия на десять лет.

Поскольку он используется нами или нашей командой, такое самоподписание вполне допустимо. Если вы хотите использовать его извне или беспокоитесь, вы также можете использовать сертификат SSL от профессиональной организации, чтобы заменить все описанные выше шаги внутреннего самоподписания.

Продолжаем посещать и обычно можем войти в интерфейс входа в нашу гавань:

Домашняя страница гавани
Домашняя страница гавани

Администратор по умолчанию:admin;пароль по умолчанию:Harbor12345

здесь,HarborРазвертывание завершено。янаконец Снова Демонстрационное использованиеодин раз。

Демонстрационное использование

Создать проект

Сначала наша консоль в Harbour Создать проект:

Создать проект в Harbour
Создать проект в Harbour

Подключиться к гавани

Войдите в Docker на другом сервере, которому необходимо использовать этот центр изображений Docker, в предыдущей статье мы использовали самозаверяющий HTTPS;,Не забудьтеIPИли сначала добавьте доменное имя в/etc/docker/daemon.jsonв файлеinsecure-registriesВ пункте конфигурации,Используется для настройки Docker для доверия адресам реестра, которые не являются HTTPS или SSL, выданными закрытым органом. например:

Язык кода:shell
копировать
{
  "insecure-registries" : ["192.168.0.100:5000", "harbor.internal.com:80"]
}

Что касается macOS и Windows, Docker Desktop по сути представляет собой операцию оболочки виртуальной машины Linux. Мы можем управлять ею непосредственно в настройках программного обеспечения рабочего стола:

Операции в Docker Desktop
Операции в Docker Desktop

Независимо от описанной выше ситуации, не забудьте перезапустить службу Docker, чтобы применить конфигурацию.

Наконец подключите:

Язык кода:shell
копировать
docker login 『domain.com』

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

Подключиться к гавани успех
Подключиться к гавани успех

Отправить изображение

Давайте построим зеркало и попробуем его,这里я基于node:lts-busterзеркало,Создайте пакет, содержащийrsync工具包的зеркало,Внутри Dockerfile:

Язык кода:shell
копировать
# Использовать узел образ v18.18
FROM node:lts-buster

WORKDIR /app

RUN bash -c 'echo "deb http://mirrors.cloud.tencent.com/debian/ buster main non-free contrib" > /etc/apt/sources.list'
RUN bash -c 'echo "deb-src http://mirrors.cloud.tencent.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list'
RUN bash -c 'echo "deb http://mirrors.cloud.tencent.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list'
RUN bash -c 'echo "deb-src http://mirrors.cloud.tencent.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list'
RUN bash -c 'echo "deb http://mirrors.cloud.tencent.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list'
RUN bash -c 'echo "deb-src http://mirrors.cloud.tencent.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list'
RUN apt update -y
RUN apt install rsync -y
Создать образ
Создать образ

После упаковки,использоватьdocker images命令就Может看到я们本地的зеркало:

Завершенная сборка образа
Завершенная сборка образа

Наконец, мы нажимаем:

Язык кода:shell
копировать
docker tag my-node:latest doamin.com/test_demo/my-node:latest
толкать Завершенная сборка образа
толкать Завершенная сборка образа

После успешной отправки вы увидите изображение, которое мы только что отправили, в интерфейс управления Harbour:

Посмотреть результаты по Харбор
Посмотреть результаты по Харбор

Если ты хочешь быть похожим на меня,Используется в конвейере GitLab.,Конвейерная аутентификация,Можеткопировать~/.docker/config.jsonконтент внутри,как GitLab Runnerпеременная параметраDOCKER_AUTH_CONFIG,таксборочная линия会自动использоватьDOCKER_AUTH_CONFIGЗавершить операцию аутентификации,Чтобы избежать сбоя при получении пользовательского образа:

Аутентификация в GitLab
Аутентификация в GitLab

Улучшить гавань

Впоследствии выяснилось, что Harbor официально выпустила новую версию, так как же нам обновить Harbor?

Операция обновления, разные версии Harbor, детали могут отличаться, рекомендуется обратиться к официальным инструкциям по обновлению:

Проще говоря,Просто сначала остановите контейнеры, связанные с Гаванью.,Потом сделай резервную копию и вытащиHarborинструмент обновленияharbor-migrator,наконец,Для завершения установки используйте более позднюю версию Harbor.

Я не буду здесь вдаваться в подробности.

END

Ладно, на этом демонстрация закончена. Наличие собственного частного хранилища образов Docker может значительно упростить нашу среду разработки и производства.

Неудивительно, что эта статья — последняя, ​​которую я буду обновлять в сообществе Tencent Cloud; мы вместе уже три года, и нам суждено увидеть вас снова. Если однажды мои статьи снова станут пригодными для размещения в сообществе, возможно, я когда-нибудь вернусь, иначе было бы очень позорно проводить поощрительную награду в сообществе.

Я участвую в четвертом выпуске специального тренировочного лагеря Tencent Technology Creation 2023 года с эссе, получившими награды. Приходите и разделите приз со мной!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose