Работа с приватными реестрами (Private Registry)
TL;DR:
docker login→docker push. Для CI: логин через STDIN (безопасно). Docker Hub rate limits: 100 pulls/6h анонимно. Свой registry: одна команда.
В корпоративной среде образы хранятся в приватных реестрах (GitHub Container Registry, GitLab Registry, Nexus, Harbor, AWS ECR). Docker требует аутентификации для доступа к ним.
1. Логин (docker login)
Никогда не используйте пароль от аккаунта! Используйте Access Tokens.
GitHub Container Registry (GHCR)
- Перейдите в GitHub → Settings → Developer Settings → Personal access tokens (Classic).
- Создайте токен с правами
read:packages(для скачивания) иwrite:packages(для загрузки). - Сохраните токен в файл или переменную.
# Логин через STDIN (безопасно, не остается в bash history)
echo $GH_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdinУспех: Login Succeeded. Конфиг сохранится в ~/.docker/config.json.
AWS ECR
AWS использует временные токены (живут 12 часов).
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com2. Использование в Docker Compose
Docker Compose автоматически использует креды из ~/.docker/config.json хоста. Никакой дополнительной настройки не нужно.
services:
app:
# Просто укажите полный путь к образу
image: ghcr.io/my-org/my-private-app:v1.03. Pull Secrets на сервере (CI/CD)
Как дать серверу доступ к реестру, не логинясь вручную?
Вариант А: Config JSON (Docker)
Создайте на сервере файл ~/.docker/config.json с base64-кодированным auth string.
{
"auths": {
"ghcr.io": {
"auth": "BASE64_STRING_HERE" # echo -n "user:token" | base64
}
}
}Вариант Б: CI/CD Variables
В GitLab CI или GitHub Actions используйте встроенные механизмы.
- GitHub Actions:
docker/login-action(см. гайд по Pipeline). - GitLab CI: Переменная
$CI_REGISTRY_USER/$CI_REGISTRY_PASSWORDдоступна автоматически.
4. Запуск собственного Registry
Иногда нужно поднять свой простой реестр (например, внутри закрытого VPN).
# 1. Запуск реестра на порту 5000
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 2. Тегирование образа
docker tag my-app:latest localhost:5000/my-app:v1
# 3. Пуш
docker push localhost:5000/my-app:v1Проблема HTTPS (Insecure Registry)
По умолчанию Docker требует HTTPS для всех реестров, кроме localhost. Если вы хотите пушить в http://192.168.1.50:5000 (без SSL), нужно разрешить это в настройках демона.
/etc/docker/daemon.json:
{
"insecure-registries" : ["192.168.1.50:5000"]
}Не делайте так в продакшене! Используйте Nginx с Let’s Encrypt перед реестром.
5. Работа с Docker Hub (Rate Limits)
У Docker Hub есть жесткие лимиты на скачивание для анонимов (100 пуллов за 6 часов).
Если ваш CI падает с ошибкой toomanyrequests, обязательно настройте авторизацию даже для публичных образов.
- Зарегистрируйте бота на Docker Hub.
- Сделайте
docker login. - Лимит увеличится до 200 (Free) или станет безлимитным (Pro).
Типичные ошибки
| Ошибка | Симптом | Решение |
|---|---|---|
docker login в CLI с паролем | Пароль в bash history | echo $TOKEN | docker login -u user --password-stdin |
| Docker Hub rate limit | toomanyrequests: You have reached your pull rate limit | Аутентифицироваться (200 pulls) или использовать mirror/private registry |
| HTTP registry без TLS | server gave HTTP response to HTTPS client | Добавить в daemon.json: "insecure-registries": ["myregistry:5000"] |
| Нет cleanup policy | Registry растёт бесконечно | Настроить garbage collection и retention policy |