У цій статті ми покажемо, як налаштувати Реєстр Docker в якості свого приватного репозиторій Docker. Docker Registry можна використовувати для зберігання та обміну образами docker. Окремо ми покажемо, як налаштувати аутентифікацію для доступу до docker registry.

Давайте для початку розберемо, з чого складаються docker image. Образ або image складається з шарів, які накладаються один на одного. Коли ми збираємо контейнер з образу, кожна команда створює новий шар, який накладається на попередній. При запуску контейнера, всі верстви образу, на основі якого зібраний контейнер доступні на читання, а сам шар контейнера на запис. На основі контейнера можна також створити новий image.

Для цього можна виконати команду:

sudo docker commit <container-id>

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

Давайте спробуємо запустити контейнер busybox, створити там файл і зробимо новий образ на підставі даного контейнера.

  1. Запустіть контейнер на базі стандартного образу busybox і підключіться в віртуальну консоль. Детальніше, основні команди, для роботи з docker описані в попередній статті: # sudo docker run -it busybox sh
  2. Створіть файл всередині контейнера і вийдіть з віртуальної консолі контейнера:# echo “test” >> 1.txt
    # exit
  3. Щоб дізнатися id запущеного контейнера потрібно виконати:# sudo docker ps -a

    Висновок буде приблизно такою:

    список запущених образів docker

    На підставі висновку можна отримати id контейнера 4fe2a4798dd0.

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fe2a4798dd0 busybox "zsh" 11 minutes ago Created
0c58c418bc01 busybox "bash" 11 minutes ago Created
5123105938c0 busybox "/bin/bash" 11 minutes ago Created
  4. Робимо Комміт командою:# sudo docker commit 4fe2a4798dd0 mybusybox:v1
    sha256:83ca3512880377a9fd03fd5cc80cbfd441b10ea71671ace0a72eeaa645128425

    Після id контейнера передається назва нового image і тег.

У відповідь команда поверне вам хеш створеного образу. Щоб подивитися інформацію про образі, виконайте команду:

# sudo docker image inspect 83ca3512880377a9fd03fd5cc80cbfd441b10ea71671ace0a72eeaa645128425

У висновку ми отримаємо інформацію про створеному образі.

[
   {
       "Id": "sha256:83ca3512880377a9fd03fd5cc80cbfd441b10ea71671ace0a72eeaa645128425",
       "RepoTags": [
           "mybusybox:v1"
       ],
       "RepoDigests": [],
       "Parent": "sha256:22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9",
       "Comment": "",
       "Created": "2021-02-16T18:29:58.408214348Z",
       "Container": "4fe2a4798dd0dc3d9ae54f11db18dc8db9bf84f5d0ed3bdffc2a73eae9515186",
--------------

Ви можете переглянути, які команди були виконані при складанні образу. Для це в консолі виконайте команду:

sudo docker history mybusybox:v1

Висновок буде такою. На даному скріншоті видно, які команди призвели до створення нових шарів в образі.

історія докера

IMAGE CREATED CREATED BY SIZE
83ca35128803 3 days ago zsh 0B
22667f53682a 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:d1deae83af20a7959… 1.23MB

Ми коротко розглянули пристрій способу docker. Дана інформація буде корисна, для розуміння механізмів роботи docker registry.

Налагодження та запуск Docker Registry

Реєстр Docker – це інструмент, зберігання та обміну docker образами. Його образ можна скачати і запустити з офіційного репозиторію Docker Hub.

Для запуску docker registry виконайте в консолі:

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

Ця команда завантажить реєстру і запустить контейнер на порту 5000 (Ключ -p 5000: 5000). Даний контейнер буде запускатися автоматично при старті docker.

У мінімальній конфігурації ми запустили наш приватний аналог докер-концентратор. Давайте спробуємо відправити свій образ в щойно створений репозиторій. Для це нам потрібно протегіровать образ. Візьмемо для прикладу, образ, який ми створили в минулій статті. Або можете використовувати будь-який інший спосіб:

# sudo docker tag microsevice_v1 <host ip>:5000/microsevice_v1

Даною командою ми додали тег для локального образу. Формат тега:

<hostname | ip >:post/<image name>:<tag>

У моєму випадку це буде:

# sudo docker tag microsevice_v1 192.168.0.19:5000/microsevice_v1

можна вказати localhost: 5000, Але тоді ви не зможемо виконати pull даного способу з іншого комп’ютера в мережі. Також можна вказати hostname, якщо у вас налаштований DNS.

Після виконайте:

# sudo docker push 192.168.0.19:5000/microsevice_v1

Висновок консолі буде приблизно таким:

The push refers to repository [192.168.0.19:5000/microsevice_v1]
Get https://192.168.0.19:5000/v2/: http: server gave HTTP response to HTTPS client

Утиліта docker очікує, що registry працює по захищеному з’єднанню HTTPS. Можна дозволити підключення по незахищеному протоколу, для в конфігураційний файл демона docker потрібно додати наступний рядок:

# sudo nano /etc/docker/daemon.json

{
    "insecure-registries": ["192.168.0.19:5000"]
}

Після чого перезапустити демон docker.

# sudo systemctl restart docker

Ще раз спробуйте команду push.

Висновок буде приблизно такою:

sudo docker push - відправка образу в репозиторій docker registry

The push refers to repository [192.168.0.19:5000/microsevice_v1]
e547e1a2483f: Layer already exists
efda78b6f2ad: Layer already exists
8c41c444e844: Layer already exists
042a80566ff4: Layer already exists
151a914ab9a4: Layer already exists
be340e26398b: Layer already exists
d7994f7c0aa0: Layer already exists
0bd71a837902: Layer already exists
13cb14c2acd3: Layer already exists
latest: digest: sha256:0ae5b4cf9e0f6891b6b83ef62beeb6a97247fc9bd1057fba91476fea834b781e size: 2203

Ваш образ повинен успішно відправився в ваш приватний репозиторій.

Щоб подивитися список images в репозиторії можна скористатися curl або браузером:

# curl -X GET http://192.168.0.19:5000/v2/_catalog

перегляд список images в docker репозиторії через браузер

Тепер можна створити Докефіл і вказати в якості джерела образу свій приватний репозиторій.

Докефіл

FROM 192.168.0.19:5000/microsevice_v1
CMD ["uvicorn", "--host", "0.0.0.0", "main:app"]

Запустіть збірку образу:

# sudo docker build .

docker build.  збірка образу

Sending build context to Docker daemon 794.6kB
Step 1/2 : FROM 192.168.0.19:5000/microsevice_v1
---> de81735cd2c9
Step 2/2 : CMD ["uvicorn", "--host", "0.0.0.0", "main:app"]
---> Running in 126edf70fb82
Removing intermediate container 126edf70fb82
---> 906f2df00d0c
Successfully built 906f2df00d0c

Видно, що образ підтягнувся з локального сховища та зібрався контейнер.

Те ж саме можна зробити командою run, якщо вам потрібно просто запустити контейнер, а не використовувати його за основу.

sudo docker run -d 192.168.0.19:5000/microsevice_v1

Дану команду можна виконати на будь-якому іншому комп’ютері в мережі, і тим самим ми забезпечили простий механізм перенесення образів docker всередині мережі. Docker Registry дозволяє автоматизувати процес deploy сервісів і їх обмін при командній розробці.

Налаштування авторизації в Docker Registry

Docker Registry підтримує кілька способів аутентфікаціі, але в цій статті ми розглянемо просту basic authentication.

Для початку встановіть утиліту, для генерації пароля:

sudo apt install apache2-utils

Потім створіть папку, для зберігання налаштувань і Dockerfile.

# mkdir -p ~/docker-registry/auth/
# cd ~/docker-registry/auth/

Для генерації пароля виконайте:

# htpasswd -Bc registry.password docker-adm

де докер-адм – це ім’я користувача (його можна змінити на довільне), ключ це примусове шифрування пароля bcrypt, шлях і ім’я створюваного файлу.

створення пароля htpasswd

New password:
Re-type new password:
Adding password for user docker-adm

Утиліта запросить пароль і підтвердження, після чого створить файл

реєстр.пароль.

Перейдіть на рівень вище в папку ~ / docker-реєстр /

# cd ~/docker-registry/

Запустіть docker-registry з наступними змінними оточення:

docker run -d -p 5000:5000 -e REGISTRY_AUTH=htpasswd -e REGISTRY_AUTH_HTPASSWD_REALM=Registry -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data -v "$PWD/data:/data" -v "$PWD/auth:/auth" --name registry registry:2

ключі дозволяють передати в контейнер змінні оточення (environment).

  • REGISTRY_AUTH – тип аутентифікації, htpasswd;
  • REGISTRY_AUTH_HTPASSWD_REALM – це заголовок realm описаний в RFC 7235;
  • REGISTRY_AUTH_HTPASSWD_PATH – це шлях до файлу реєстр.пароль всередині контейнера, його не слід змінювати;
  • REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY – це шлях до директорії, де буде зберігатися образи всередині контейнера.

Команда довга, краще її скопіювати в текстовий файл, або в sh скрипт. Приклад скрипта, можна взяти тут

ключ -v потрібен, щоб прокинути директорії з host машини в контейнер. У нашому прикладі вказано, що директорія «$ PWD / auth» – де $ PWD це поточна директорія, з якої здійснюється запуск + авт буде змонтована в контейнер в директорію / auth. Аналогічно і другий ключ -v.

Висновок в консоль після виконання команди:

docker registry захист за допомогою basic authentication

Створився конейнер з hash: 6f430176572dfeca6e81be763206ea35d182facd27ca9e732822b523d8906a

Якщо ви бачите таку помилку:

docker: Відповідь на помилку демона: Конфлікт.  Назва контейнера "/ реєстр" вже використовується контейнером

docker: Error response from daemon: Conflict. The container name "/registry" is already in use by container "6f430176572dfeca6e81be763206ea35d182facacd27ca9e732822b523d8906a". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

В даному випадку контейнер вже запущений (ми його запустили в самому початку роботи з docker registry). Можна зупинити його і видалити контейнер командою:

# sudo docker stop registry && sudo docker rm registry

Тепер можна повторити запуск registry.

Для перевірки аутентфікаціі, перейдіть за адресою:

http://192.168.0.19:5000/v2/_catalog

У вікні потрібно вказати логін і пароль, який був зазначений при генерації файлу реєстр.пароль.

аутентифікація в docker

Якщо ви виконаєте аутентифікацію, у вікні браузера відобразиться вміст docker сховища.

порожній docker репозиторій

Наш репозиторій порожній.

Якщо виконати команду push, Зазначену раніше, в registry з’явиться один образ:

список образів в docker registry

Але важливо, тепер щоб виконати push в репозиторій, потрібно спочатку авторизуватися через консоль. Для цього потрібно виконати:

# sudo docker login login http://192.168.0.19:5000
# sudo docker push 192.168.0.19:5000/microsevice_v1

авторизація в docker regisrty з командою рядка

Username: docker-adm
Password:
WARNING! Your password will be stored unencrypted in /home/devel/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

Надалі, ми будемо використовувати registry для автоматизації розгортання сервісів в kubernetes.

Leave a Reply

Your email address will not be published. Required fields are marked *