У цій статті ми покажемо, як налаштувати Реєстр Docker в якості свого приватного репозиторій Docker. Docker Registry можна використовувати для зберігання та обміну образами docker. Окремо ми покажемо, як налаштувати аутентифікацію для доступу до docker registry.
Давайте для початку розберемо, з чого складаються docker image. Образ або image складається з шарів, які накладаються один на одного. Коли ми збираємо контейнер з образу, кожна команда створює новий шар, який накладається на попередній. При запуску контейнера, всі верстви образу, на основі якого зібраний контейнер доступні на читання, а сам шар контейнера на запис. На основі контейнера можна також створити новий image.
Для цього можна виконати команду:
sudo docker commit <container-id>
Даною командою ми беремо верхній рівень контейнера, той, що доступний для запису і перетворює його в шар для читання.
Давайте спробуємо запустити контейнер busybox, створити там файл і зробимо новий образ на підставі даного контейнера.
- Запустіть контейнер на базі стандартного образу busybox і підключіться в віртуальну консоль. Детальніше, основні команди, для роботи з docker описані в попередній статті:
# sudo docker run -it busybox sh
- Створіть файл всередині контейнера і вийдіть з віртуальної консолі контейнера:
# echo “test” >> 1.txt
# exit - Щоб дізнатися id запущеного контейнера потрібно виконати:
# sudo docker ps -a
Висновок буде приблизно такою:
На підставі висновку можна отримати 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
- Робимо Комміт командою:
# 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.
Висновок буде приблизно такою:
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
Тепер можна створити Докефіл і вказати в якості джерела образу свій приватний репозиторій.
Докефіл
FROM 192.168.0.19:5000/microsevice_v1 CMD ["uvicorn", "--host", "0.0.0.0", "main:app"]
Запустіть збірку образу:
# sudo 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, -з шлях і ім’я створюваного файлу.
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.
Висновок в консоль після виконання команди:
Створився конейнер з hash: 6f430176572dfeca6e81be763206ea35d182facd27ca9e732822b523d8906a
Якщо ви бачите таку помилку:
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 сховища.
Наш репозиторій порожній.
Якщо виконати команду push
, Зазначену раніше, в registry з’явиться один образ:
Але важливо, тепер щоб виконати push в репозиторій, потрібно спочатку авторизуватися через консоль. Для цього потрібно виконати:
# sudo docker login login http://192.168.0.19:5000
# sudo docker push 192.168.0.19:5000/microsevice_v1
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.