1. Введение
Разработка и эксплуатация контейнерных приложений Docker не требуют надежного управления образами.Хотя Docker официально предоставляет общедоступный репозиторий образов, также необходимо развернуть реестр в нашей частной среде с точки зрения безопасности и эффективности. Гавань сделанаVMware
Проект управления Docker Registry корпоративного уровня с открытым исходным кодом включает в себя управление правами (RBAC), LDAP, аудит журналов, интерфейс управления, самостоятельную регистрацию, репликацию образов и поддержку китайского языка.
2. Компоненты
Шаблон Docker Compose для развертывания Harbour находится по адресу /Deployer/docker-compose.yml, Откройте этот файл шаблона, и вы обнаружите, что Harbour состоит из 5 контейнеров:
- прокси: обратный прокси-сервер, состоящий из сервера Nginx.
- реестр: экземпляр контейнера, состоящий из официального образа реестра Docker с открытым исходным кодом.
- ui: основные сервисы в архитектуре, код, который составляет этот контейнер, является основной частью проекта Harbour.
- mysql: контейнер базы данных, состоящий из официального образа MySql.
- log: Контейнер, на котором работает rsyslogd, собирает журналы из других контейнеров в виде log-driver.
Эти контейнеры проходят черезDocker linkФорма связана вместе, так что контейнеры могут обращаться друг к другу по имени контейнера. Для конечных пользователей должен быть открыт только служебный порт прокси-сервера (например, Nginx).
3. Принцип работы
Предположим, мы разворачиваем Harbour на виртуальной машине с именем hostnameRegistry.abcdocker.com. Пользователь инициирует запрос на вход в эту службу Harbour с помощью команды входа в систему docker: docker loginRegistry.abcdocker.com Когда пользователь вводит необходимую информацию и нажимает Enter, клиент Docker отправит HTTP на адрес «registry.abcdocker.com/ v2/" GET-запрос.
Каждый контейнер Harbour обрабатывается через следующие этапы:
(1)Docker login
(a) Сначала запрос будет получен прокси-контейнером, прослушивающим порт 80. В соответствии с предустановленными правилами сопоставления Nginx в контейнере перенаправит запрос в контейнер реестра в бэкенде;
(b) На стороне контейнера реестра, поскольку настроена аутентификация на основе токенов, реестр вернет код ошибки 401, предлагая клиенту Docker получить доступ к URL-адресу, связанному со службой токенов. В Harbour этот URL-адрес указывает на основные службы;
(c) После того, как клиент Docker получит этот код ошибки, он отправит запрос на URL-адрес службы токенов, объединит и закодирует имя пользователя и пароль в соответствии со спецификацией BasicAuthentication протокола HTTP и поместит их в заголовок запроса. (заголовок);
(d) Аналогично, после того как запрос будет отправлен в прокси-контейнер через порт 80, Nginx перенаправит запрос в ui-контейнер в соответствии с правилами. расшифрует заголовок запроса, чтобы получить имя пользователя, пароль;
(e) После получения имени пользователя и пароля код в контейнере пользовательского интерфейса запросит базу данных и сравнит имя пользователя и пароль с данными в контейнере mysql (Примечание: контейнер пользовательского интерфейса также поддерживает аутентификацию LDAP, в этом случае следующий пользовательский интерфейс попытается установить связь с внешней службой LDAP и проверить имя пользователя/пароль). Если сравнение прошло успешно, контейнер пользовательского интерфейса вернет код состояния, указывающий на успех, сгенерирует токен с ключом и вернет его клиенту Docker в теле ответа. Процесс взаимодействия между компонентами в этом процессе показан на следующем рисунке.
Пока что однаждыdocker login
После успешного завершения клиент Docker сохранит имя пользователя и пароль, закодированные на шаге (c), в локальном скрытом файле.
(2) Docker Push
После того, как пользователь успешно войдет в систему, используйте команду docker push, чтобы отправить образ Docker в Harbor: docker push register.abcdocker.com/library/hello-world(a) Сначала клиент docker повторит процесс входа в систему, сначала отправит запрос в реестр, а затем получит адрес службы токена;
(b) После этого клиент Docker предоставит дополнительную информацию при доступе к сервису токенов в ui-контейнере, указав, что он хочет подать заявку на токен для операции push в imagelibrary/hello-world;
(c) После того, как служба токенов перенаправит запрос через Nginx, она получит доступ к базе данных, чтобы проверить, есть ли у текущего пользователя разрешение на отправку изображения. Если у него есть разрешение, он закодирует информацию об изображении и действие push, подпишет его с помощью закрытого ключа, сгенерирует токен и вернет его клиенту Docker;
(d) После получения токена клиент Docker поместит токен в заголовок запроса, сделает запрос в реестр и попытается начать отправку образа. После того, как Реестр получит запрос, он расшифрует токен с открытым ключом и проверит его, после чего начнется передача образа. Мы опускаем шаг переадресации прокси.На следующем рисунке показано взаимодействие каждого компонента в этом процессе.
В-четвертых, среда установки
айпи адрес | докер версия | версия для создания докеров | ядро | Centos |
---|---|---|---|---|
192.168.1.197 | 17.03 | 1.22 | 4.17.12 | 7.4 |
Уведомление:Все сервисные компоненты Harbour развернуты в Docker, поэтому официальная установка использует Docker-compose для быстрого развертывания, поэтому нам нужно установить Docker и Docker-compose.Поскольку Harbour основан на версии Docker Registry V2, версия Docker требуется для быть не ниже 1.10.0, версия Docker-compose не ниже 1.6.0
5. Подготовка окружающей среды
# 设置主机名
hostnamectl set-hostname harbor
# 时间同步
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
ntpdate -u cn.pool.ntp.org
hwclock --systohc
timedatectl set-timezone Asia/Shanghai
# 关闭swap分区
vim /etc/fstab #永久关闭swap分区
swap was on /dev/sda11 during installation
UUID=0a55fdb5-a9d8-4215-80f7-f42f75644f69 none swap sw 0 0
#注释掉SWAP分区项,即可
或者
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
swapoff -a && swapon -a
# 关闭防火墙 Selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
# 升级内核
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y&&
sed -i s/saved/0/g /etc/default/grub&&
grub2-mkconfig -o /boot/grub2/grub.cfg && reboot
Шесть, установите Docker, Docker-compose
Загрузите установочный пакет Docker
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
➜ yum install docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm -y
➜ yum install docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm -y
设置开机启动并启动docker
systemctl enable docker
systemctl start docker
替换docker相关配置
sed -i '/ExecStart=\/usr\/bin\/dockerd/i\ExecStartPost=\/sbin/iptables -I FORWARD -s 0.0.0.0\/0 -d 0.0.0.0\/0 -j ACCEPT' /usr/lib/systemd/system/docker.service
sed -i '/dockerd/s/$/ \-\-storage\-driver\=overlay2 --insecure-registry 192.168.60.26/g' /usr/lib/systemd/system/docker.service
注意:
1.Docker默认从官方拉取镜像,并且从1.12版本之后,默认私有仓库是使用https来进行连接,我们需要将使用私服的主机上docker启动文件进行修改,在启动命令添加--insecure-registry 192.168.1.197
Docker-compose Install
Адрес на гитхабе:GitHub.com/docker/comp…
Введение в Docker Compose
Docker Compose — последняя часть службы оркестровки Docker.Вышеупомянутая Machine позволяет пользователям быстро устанавливать Docker на другие платформы, Swarm позволяет контейнерам Docker эффективно работать в кластерах, а Compose позволяет пользователям развертывать распределенные приложения в кластерах. Проще говоря, Docker Compose относится к сервису «прикладного уровня». Пользователи могут определять, какая группа контейнеров запускает какое приложение. Он поддерживает динамически изменяющиеся приложения и расширяет их при необходимости.
Установить Docker-композицию
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
Общие команды Docker-compose
docker-compose up -d ###后台启动,如果容器不存在根据镜像自动创建
docker-compose down -v ###停止容器并删除容器
docker-compose start ###启动容器,容器不存在就无法启动,不会自动创建镜像
docker-compose stop ###停止容器
Установить гавань
Официальный адрес порта
GitHub.com/VMware/Ha попало…
Способы установки Harbour 2
1.离线安装
$ wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
$ tar xf harbor-online-installer-v1.5.0.tgz
2.在线安装
$ wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.2.tgz
$ tar xf harbor-online-installer-v1.5.2.tgz
重点:下载那个823M的安装
Настроить гавань
После распаковки имя конфигурационного файла — harbour.cfg, который является конфигурационным файлом Harbour.Править harbour.cfg
На самом деле нам нужно только изменить поле Hostname
[root@harbor harbor]# head harbor.cfg
## Configuration file of Harbor
#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version = 1.5.0
#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 = 192.168.1.197
объяснение конфигурации, связанной с harbour.cfg
[root@master harbor]# grep -Ev "^$|^[#;]" harbor.cfg
# Harbor版本
_version = 1.5.0
# hostname 设置访问地址,可以使用IP/域名,不可以设置127.0.0.1 && localhost
hostname = 192.168.60.24
# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
# Job 最大进程数
max_job_workers = 50
# 是否创建证书,创建证书将会在下面的路径下生成
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
# 私钥存储路径
secretkey_path = /data
# 设置日志大小
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M
# 是否使用代理
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,ui
# 邮箱设置,发送重置密码邮件时使用
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
email_insecure = false
# 安装Harbor后,管理员UI登陆的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
# 认证方式,这里支持多种认证方式,比如LDAP、数据库认证。默认是db_auth
auth_mode = db_auth
# LDAP认证时配置项
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid
ldap_scope = 2
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=mydomain,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2
#是否开启自动注册
self_registration = on
# Token有效时间,默认30分钟
token_expiration = 30
# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(管理员)
project_creation_restriction = everyone
# Mysql数据库root用户默认密码root123,根据实际时使用来进行修改
db_host = mysql
db_password = root123
db_port = 3306
db_user = root
# Redis配置
redis_url = redis:6379
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config =
На этот раз мы используем автономную установку, установочный пакет указан выше.
tar xf harbor-offline-installer-v1.5.0.tgz
./install
7. Посетите гавань
Доступ: 192.168.1.197
Порт по умолчанию — 80. Если вам нужно изменить порт, измените сопоставление соответствующей службы в docker-compose.yaml.
Восемь, настройка клиента без https
[root@localhost ~]# echo '{ "insecure-registries":["172.16.1.146:8888"] }' > /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json
{ "insecure-registries":["172.16.1.146:8888"] }
restart docker
[root@localhost ~]# service docker restart
Если он не настроен, клиент сообщит об ошибке: Ответ об ошибке от демона: Get https:// 172.16.1.146:5000/v1/_ping: http: сервер дал HTTP-ответ HTTPS-клиенту.
[root@localhost harbor]# docker login 172.16.1.146:8888
Username (admin): admin
Password:
Login Succeeded
9. Управление зеркалами
отметить и загрузить
docekr tag 镜像名称:标签 你的IP:端口/项目名称/镜像名称:标签
docker push 你的IP:端口/项目名称/镜像名称:标签
[root@localhost harbor]# docker tag registry:2.6.2 172.16.1.146:8888/wondertek/registry:2.6.2
[root@localhost harbor]# docker push 172.16.1.146:8888/wondertek/registry:2.6.2
The push refers to a repository
[172.16.1.146:8888/wondertek/registry]
9113493eaae1: Layer already exists
621c2399d41a: Layer already exists
59e80739ed3f: Layer already exists
febf19f93653: Layer already exists
e53f74215d12: Layer already exists
2.6.2: digest: sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c size: 1364
Удалите локальное зеркало и загрузите снова
[root@localhost harbor]# docker rmi 172.16.1.146:8888/wondertek/registry:2.6.2
Untagged: 172.16.1.146:8888/wondertek/registry:2.6.2
Untagged: 172.16.1.146:8888/wondertek/registry@sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c
[root@localhost harbor]# docker pull 172.16.1.146:8888/wondertek/registry:2.6.2
Trying to pull repository 172.16.1.146:8888/wondertek/registry ...
2.6.2: Pulling from 172.16.1.146:8888/wondertek/registry
Digest: sha256:feb40d14cd33e646b9985e2d6754ed66616fedb840226c4d917ef53d616dcd6c
Status: Downloaded newer image for 172.16.1.146:8888/wondertek/registry:2.6.2