Как зарегистрироваться на docker hub
Перейти к содержимому

Как зарегистрироваться на docker hub

  • автор:

#6 – Деплой в Docker Hub

#6 – Деплой в Docker Hub

Если вы хотите чтобы ваши образы могли скачать другие люди, то вам обязательно нужно выгрузить их в Docker Hub. В ходе видео мы с вами познакомимся с процессом выгрузки образов в Docker Hub.

Видеоурок

Что такое Docker Hub ?

Docker не хранит все образы на вашем ПК. Вместо этого он использует различные регистры. Регистры можно представить как папки, что хранят данные. Такие регистры хранят все образы на удаленном хосте.

Docker может обращаться к регистрам и по необходимости вытягивать из них нужные образы.

Docker Hub – это один из таковых регистров. Он является официальным и содержит большое количество образов как по языкам программирования, так и по всевозможным технологиям.

Работа с Docker Hub

При работе с Docker Hub вам в первую очередь нужно зарегистрироваться у них на сайте. После регистрации выполните процесс авторизации в терминале. Для этого достаточно прописать команду docker login и следовать инструкциям.

При необходимости выйти вы всегда можете прописать команду docker logout .

Процесс выгрузки ваших образов выглядит следующим образом:

  • выполняется построение образа: docker build -t название «путь к Dockerfile»
  • далее за счет команды push происходит выгрузка: docker push название

Введение в Docker Hub

Docker Hub — это публичный репозиторий, куда вы можете загружать свои образы (images) для совместной работы с командой, заказчиками или другими пользователями.

Для создания репозитория вам нужно зарегистрироваться в Docker Hub и нажать кнопку «Create Repository» :

Вы можете создать репозиторий, используя свой Docker ID. Имя репозитория должно быть уникальным, длиной до 255 символов и состоять из символов нижнего регистра, цифр и символов — или _ . Описание может быть длиной до 100 символов и использоваться для поиска.

Также вы можете связать репозиторий с вашим аккаунтом на GitHub или Bitbucket.

После создания репозитория вы получите полный доступ к его свойствам и настройкам.

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

После чего вы получите следующий вывод:

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

Вы можете загружать несколько образов в один репозиторий, используя теги. Таким образом, вы сможете хранить разные версии своего приложения на Docker Hub, запуская его на любой машине, где установлен Docker.

Следующий шаг — это создание самого образа, который мы будем загружать на Docker Hub. В этом нам поможет Dockerfile — это файл с инструкциями для создания образов в Docker. В качестве примера я возьму образ Tomcat (веб-сервер для Java-приложений). Для этого пишем в строке поиска tomcat :

Затем выбираем tomcat из категории Verified Content (это означает, что эти образы официальные и одобрены модераторами Docker Hub), кликаем по первой записи и попадаем в репозиторий образа tomcat:

Дальше переходим во вкладку Tags и выбираем нужный нам образ и архитектуру. В моем случае, это linux/amd64 :

В строке Image History мы увидим последовательность команд, нужных для создания этого образа (это можете использовать в качестве шпаргалки):

Теперь давайте создадим свой собственный образ с помощью Dockerfile, который базируется на образе Alpine (это самый легковесный Linux-дистрибутив, который часто используется для создания образов). Для этого создадим файл с названием Dockerfile , используя следующую команду:

Теперь проверим, есть ли этот файл в директории:

Затем откройте файл любым удобным вам редактором. Поскольку я использую Vim, то моей командой будет vim Dockerfile . Затем нам нужно перейти в режим редактирования нажатием клавиш I или Insert :

Напишем следующий текст:

Для сохранения файла используется комбинация :wq ( w — write и q — quit).

Наш первый Dockerfile готов:

команда from указывает, какой образ мы хотим взять за основу;

команда run выполняет команду внутри контейнера, созданного с помощью этого образа, а именно: запускает пакетный менеджер Alpine под названием apk и устанавливает программу curl (используется для передачи файлов по сети);

с помощью команды entrypoint мы посмотрим какую версию curl мы установили.

Теперь самое время создать образ из этого Dockerfile:

Смотрим, есть ли наш образ в списке локальных образов:

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

Проверяем наш репозиторий:

Как вы можете видеть, наш образ уже загружен на Docker Hub, и мы можем его скачать, используя команду docker pull .

Настройка локального репозитория для образов Docker и работа с ним

Обновлено

Обновлено: 10.02.2023 Опубликовано: 02.04.2021

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

Подготовка сервера

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

Установка Docker

Сам репозиторий является контейнеров Docker, поэтому для его запуска необходимо установить одноименный сервис. Подробнее, об установке Docker на разные операционные системы семейства Linux читайте на странице Установка Docker на Linux.

Настройка брандмауэра

В официальной документации по настройке хранилища образов Docker приводится пример использования порта 5000. Именно его мы и будем открывать. Рассмотрим примеры использования разных утилит для настройки фаервола.

В вашей системе не обязательно будет использоваться брандмауэр. Например, он может быть настроен, чтобы пропускать все сетевые пакеты. В таком случае, настройка, рассмотренная в данном пункте не обязательна.

а) Iptables (как правило, используется в системах на базе deb или в старых RPM). Чтобы открыть нужный нам порт, вводим команду:

iptables -I INPUT -p tcp —dport 5000 -j ACCEPT
Для сохранения правила используем утилиту iptables-persistent:
apt-get install iptables-persistent
netfilter-persistent save

б) firewalld (как правило, используется в, относительно, новых системах на базе RPM). Вводим команду для открытия порта 5000:

firewall-cmd —permanent —add-port=5000/tcp
Для применения правила вводим:
firewall-cmd —reload

Репозиторий для localhost

Для начала мы развернем репозиторий, который сможет обслуживать только локальный сервер (о том, как развернуть сетевое хранилище образов Docker будет рассказано ниже). Чтобы запустить сервис, который сможет принимать запросы docker push и docker pull, вводим команду:

docker run -d -p 5000:5000 —restart=always —name registry registry:2

* в данном примере мы поднимает контейнер Docker с именем registry из образа registry:2. Он будет слушать сетевые запросы на порту 5000. Параметр —restart=always позволит автоматически запускаться контейнеру после перезагрузки сервера. Проверяем, что на порту 5000 у нас запустился контейнер docker:

ss -tunlp | grep :5000
Мы должны увидеть что-то на подобие:
tcp LISTEN 0 4096 *:5000 *:* users:((«docker-proxy»,pid=484238,fd=4))

Попробуем проверить работу нашего репозитория. На том же сервере сначала загрузим из облака докер-хаба образ, например, для python:

docker pull python:latest

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

docker tag python:latest localhost:5000/python

* в данном примере мы указываем тег localhost:5000/python, в названии которого мы видим localhost:5000 — локальный сервер, порт 5000. Загружаем образ питона на наш сервер:

docker push localhost:5000/python
Теперь удалим тот образ, который был загружен из облака:
docker image remove python:latest
. и образ, который мы загрузили в наш локальный репозиторий:
docker image remove localhost:5000/python
Теперь снова загрузим образ python, но на этот раз из нашего собственного репозитория:
docker pull localhost:5000/python
Мы должны увидеть процесс загрузки:

Using default tag: latest
latest: Pulling from python
8bf9c589d5f9: Pull complete
4c70e46d8b5f: Pull complete
ea848ad42f0d: Pull complete
48fe137f8d26: Pull complete
4b13f6ed9b0c: Extracting [==============> ] 56.82MB/192.3MB
ba85279f50e0: Download complete
59a18d8c3680: Download complete
c610993f70c6: Download complete
a9afc028cd66: Download complete

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

Digest: sha256:1e3b89f69bb6ada672153256bd88d74ae60571f6755703369a108c76595ea00f
Status: Downloaded newer image for localhost:5000/python:latest
localhost:5000/python:latest

Наш репозиторий Docker готов и работает для локального сервера.

Меняем расположение хранилища для образов

Наш репозиторий для докер образов сам является контейнером Docker и данные хранит внутри себя (каталоге /var/lib/registry). Это не является правильной практикой, так как при переустановке контейнера, все данные внутри него уничтожаются. Чтобы избежать потери данных, мы должны внешнее хранилище подключить к контейнеру. Для начала, создадим каталог на сервере, где будем хранить образы, например:

mkdir /dockerrepo
Остановим и уничтожим наш контейнер:
docker container stop registry && docker container rm -v registry
Запустим его снова, но на этот раз мы подключим созданный каталог внутрь контейнера:

docker run -d -p 5000:5000 —restart=always —name registry -v /dockerrepo:/var/lib/registry registry:2

* в данном примере мы используем опцию -v для подключения каталога /dockerrepo внутрь контейнера в качестве каталога /var/lib/registry. Проверим работу репозитория. На этот раз загрузим другой образ, например, nginx:

docker pull nginx:latest
Добавим тег:
docker tag nginx:latest localhost:5000/nginx
Загрузим образ в репозиторий:
docker push localhost:5000/nginx
Попробуем найти загруженный образ в созданном каталоге /dockerrepo:
ls /dockerrepo/docker/registry/v2/repositories
В моем случае команда вернула каталог nginx. Наш сервер готов к настройке доступа по сети.

SSL и подключение по сети

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

Получение сертификата

Есть 4 стандартных способа получения сертификата, которые нам подойдут. У каждого из них свои преимущества и недостатки. 1. Получение бесплатного сертификата у Let’s Encrypt. Мы можем получить бесплатный легитимный сертификат от Let’s Encrypt. Для этого наш сервер должен быть доступен из внешней сети по порту 80 (для выполнения проверки домена) или мы должны перевыпускать сертификат вручную каждые 3 месяца. Подробнее о способах получения в инструкции Получение бесплатного SSL сертификата Let’s Encrypt. 2. Покупка. Если мы хотим получить валидный сертификат, но при этом не можем обеспечить доступность сервера по 80 порту (или не хотим заниматься ручным обновлением сертификата каждые 3 месяца), мы можем купить сертификат. Поставщиков данной услуги, достаточно, много, например REG.RU. 3. Самоподписанный сертификат. Мы можем сгенерировать самозаверенный сертификат. Это простой способ, но такой сертификат не будет валидным, так как мы получим последовательность от узла, к которому нет доверия у разработчиков программного обеспечения. Чтобы создать такой сертификат, вводим команды:

mkdir -p /etc/ssl/docrepo

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/docrepo/public.pem -keyout /etc/ssl/docrepo/private.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=docrepo.dmosk.local»

* первой командой мы создадим каталог, в котором разместим наши сертификаты. Второй — сам сертификат. 4. Использование внутреннего центра сертификации. Мы также можем сгенерировать валидный для нашей внутренней инфраструктуры сертификат, используя свой центр сертификации. Подробнее читайте в инструкции Сертификат для Linux в центре сертификации Active Directory Certificate Services.

Запуск внешнего репозитория

После получения сертификата, можно поднять контейнер для обслуживания сетевых запросов. Предполагается, что наши сертификаты находятся в каталоге на сервере /etc/ssl/docrepo. Сначала уничтожим ранее созданный:

docker container stop registry && docker container rm -v registry
И запустим новый:

docker run -d -p 5000:5000 —restart=always —name registry -v /dockerrepo:/var/lib/registry -v /etc/ssl/docrepo:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/public.pem -e REGISTRY_HTTP_TLS_KEY=/certs/private.key registry:2

  • -v /etc/ssl/docrepo:/certs — монтирует каталог на сервере /etc/ssl/docrepo (с сертификатами) в каталог контейнера /certs.
  • -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/public.pem — создает системную переменную REGISTRY_HTTP_TLS_CERTIFICATE в контейнере, которая содержит в качестве значения путь до сертификата с открытым ключом.
  • -e REGISTRY_HTTP_TLS_KEY=/certs/private.key — создает системную переменную REGISTRY_HTTP_TLS_KEY в контейнере, которая содержит в качестве значения путь до сертификата с закрытым ключом.

Подключаемся к другому компьютеру и пробуем загрузить наш образ для nginx:

docker pull docrepo.dmosk.local:5000/nginx

Если мы используем неподтвержденный сертификат (самоподписанный), то команда вернет нам ошибку:

Error response from daemon: Get https://docrepo.dmosk.local:5000/v2/: x509: certificate signed by unknown authority

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

И добавляем к настройке:

* где docrepo.dmosk.local:5000 — адрес и порт нашего сервера, к которому мы будем обращаться.

Перезапускаем сервис докера:

systemctl restart docker

Можно снова пробовать загрузить образ с центрального Hub-сервера.

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

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

* В официальной документации для генерирования файла с паролем рекомендуется применять контейнер, однако, у меня приведенная в пример команда вернула ошибку. Поэтому в данной инструкции я предлагаю универсальное решение.

а) для Ubuntu / Debian:

apt-get install apache2-utils

б) для CentOS / Red Hat:

yum install httpd-tools

Создадим каталог, в котором разместим файл с логинами и паролями:

htpasswd -Bbn repouser password > /etc/docker/auth/htpasswd

* в данном примере мы создадим пользователя repouser с паролем password. Мы поместим данные в файл /etc/docker/auth/htpasswd.

Уничтожим ранее созданный контейнер:

docker container stop registry && docker container rm -v registry

И запустим его снова с параметрами аутентификации:

docker run -d -p 5000:5000 —restart=always —name registry -v /dockerrepo:/var/lib/registry -v /etc/ssl/docrepo:/certs -v /etc/docker/auth:/auth -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/dmosk.local.pem -e REGISTRY_HTTP_TLS_KEY=/certs/dmosk.local.key -e REGISTRY_AUTH=htpasswd -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e «REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm» registry:2

  • -v /etc/docker/auth:/auth — монтируем каталог с файлом-паролем в каталог контейнера /auth.
  • -e REGISTRY_AUTH=htpasswd — указываем системную переменную для указания необходимости способа аутентификации.
  • -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd — создаем переменную с путем до файла аутентификации.
  • -e «REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm» — имя области аутентификации htpasswd (если я правильно понял, может быть произвольным).

Репозиторий готов. На компьютере, с которого мы захотим к нему подключиться, вводим:

docker login docrepo.dmosk.local:5000

Система запросит пароль — вводим тот, что создавали с помощью утилиты htpasswd. Теперь можно работать с нашим репозиторием. Удалим загруженный ранее образ:

docker image rm docrepo.dmosk.local:5000/nginx:latest

docker pull docrepo.dmosk.local:5000/nginx

Docker Compose

Мы можем описать наш сервер для репозитория Docker с помощью композера. Для начала, необходимо его установить.

После уничтожаем созданный контейнер:

docker container stop registry && docker container rm -v registry

Создаем каталог — в нем мы создадим файл docker-compose:

mkdir -p /opt/docker_repo

Переходим в созданный каталог:

Создаем файл композера:

registry:
image: registry:2
container_name: registry
hostname: registry
restart: unless-stopped
environment:
TZ: «Europe/Moscow»
ports:
— 5000:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/public.pem
REGISTRY_HTTP_TLS_KEY: /certs/private.key
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
— /opt/docker_repo/data:/var/lib/registry
— /opt/docker_repo/ssl:/certs
— /opt/docker_repo/auth:/auth

* в данном примере мы описали запуск контейнера из образа registry:2 со всеми вышеописанными настройками:

  • Порт 5000.
  • Использовать сертификат для SSL.
  • Требовать проходить аутентификацию.
  • Монтировать некоторые каталоги с хостового сервера внутрь контейнера.

Создадим каталог для сертификатов и сгенерируем необходимые ключи:

openssl req -new -x509 -days 1461 -nodes -out ssl/public.pem -keyout ssl/private.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=docrepo.dmosk.local»

Создадим каталог для хранения файла аутентификации и сам файл с паролем:

htpasswd -Bbn repouser password > auth/htpasswd

* в данном примере логи будет repouser, а пароль — password.

Запускаем наш контейнер с помощью композера:

docker-compose up -d

* так как мы используем готовый образ, нам не нужно делать docker-compose build.

Наш контейнер должен запуститься.

Читайте также

Возможно, вам будут интересны другие инструкции по Docker:

Работа с образами — Docker: Основы

Docker — больше, чем просто программа. Это целая экосистема со множеством проектов и сервисов.

В работе с Docker часто приходится иметь дело с Registry. Это хранилище образов, которое работает как репозиторий пакетов любого пакетного менеджера. Именно здесь хранятся образы, которые Docker скачивает во время выполнения команды docker run . Посмотреть список образов хранилища можно на сайте https://hub.docker.com/ .

docker images

Список образов, скачанных на компьютер, можно посмотреть командой docker images :

# В вашем случае вывод будет отличаться docker images REPOSITORY TAG IMAGE ID CREATED SIZE workshopdevops*web latest cfd7771b4b3a 2 days ago 817MB hexletbasics*app latest 8e34a5f631ea 2 days ago 1.3GB mokevnin/rails latest 96487c602a9b 2 days ago 743MB ubuntu latest 2a4cca5ac898 3 days ago 111MB ruby 2.4 713da53688a6 3 weeks ago 687MB ruby 2.5 4c7885e3f2bb 3 weeks ago 881MB nginx latest 3f8a4339aadd 3 weeks ago 108MB elixir latest 93617745963c 4 weeks ago 889MB postgres latest ec61d13c8566 5 weeks ago 287MB 

Вторая колонка в выводе выше называется TAG. Когда мы выполняли команду docker run nginx , то на самом деле выполнялась команда docker run nginx:latest . То есть мы не просто скачиваем образ nginx, а скачиваем его конкретный тег. latest — тег по умолчанию. По задумке он обозначает последнюю версию образа.

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

Теги в Docker изменяемы. Другими словами, создатель образа может перезаписать образ, связанный с любым тегом. Такой подход может показаться странным и ненадежным, ведь нет гарантий. К счастью, на практике, есть определенные соглашения, которым стараются следовать все популярные образы. Тег latest действительно содержит последнюю версию и постоянно обновляется, но кроме этого тега активно используется семантическое версионирование . Рассмотрим теги https://hub.docker.com/_/nginx

Теги с полной семантической версией (x.x.x) делают неизменяемыми, даже если в них встречается что-то еще — например, 1.12.2-alpine. Такую версию смело можно брать для продакшен-окружения, так как создатели образа гарантируют, что они будут следовать общим правилам. Теги, подобные такому 1.12, обновляются при изменении patch версии. То есть внутри образа может оказаться и версия 1.12.2 и в будущем 1.12.8. Точно такая же схема и с версиями, в которых указана только мажорная версия, например, 1. Только в данном случае обновление идет не только по патчу, но и по минорной версии.

docker pull

Как влияют теги на работу команды docker run во время скачивания образа? docker run скачивает образ если его нет, но эта проверка не связана с обновлением содержимого. Если nginx:latest обновился, то docker run его не будет скачивать, он использует тот latest, который прямо сейчас уже загружен. Для гарантированного обновления образа существует другая команда: docker pull . Вот она всегда проверяет, обновился ли образ для определенного тега.

# Пытается скачать обновления в образе # даже если он присутствует в локальной системе docker pull nginx 

Кроме тегов имя образа может содержать префикс, например, etsy/chef . Этот префикс является именем аккаунта на сайте, через который создаются образы, попадающие в Registry. Большинство образов как раз такие, с префиксом. И есть небольшой набор, буквально сотня образов, которые не имеют префикса. Их особенность в том, что эти образы поддерживает сам Docker. Поэтому если вы видите, что в имени образа нет префикса, значит это официальный образ. Список таких образов можно увидеть здесь .

docker rmi

Удаляются образы командой docker rmi .

Удаление иногда бывает нужно, когда заканчивается место. Образы могут быть тяжелыми и в случае ограниченных ресурсов их регулярно удаляют.

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

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *