#docker #docker-compose #docker-registry
#docker #docker-compose #docker-реестр
Вопрос:
Проблема, с которой я сталкиваюсь:
- У меня есть настройка docker-compose на моем сервере
- Я хочу создавать образы docker для своих проектов (я использую drone.io) и сохранить их на указанном сервере
- Я хочу создавать контейнеры, используя мои личные изображения в моей настройке создания
Что я сделал:
Я не хотел отправлять свой личный образ docker в DockerHub, поэтому я решил создать контейнер реестра в моей настройке docker-compose (CI автоматически помещает туда образы docker). Теперь я хотел бы использовать это изображение в том же файле docker-compose, который, как я ожидал, будет легко извлечен из реестра.
Соответствующая часть моего файла docker-compose.yml для лучшей визуализации:
version: "3.7"
services:
myimage:
image: registry.example.com:5000/username/myimage
depends_on:
- registry
networks:
- traefik_public
labels:
// traefik labels
registry:
image: registry:2
networks:
- traefik_public
ports:
- '5000:5000'
labels:
// traefik labels giving this container 'registry.example.com' domain
Вместо этого я сразу понял, что нарушил свою настройку на вызов:
docker-compose up -d
выдал следующий вывод:
Network traefik_public is external, skipping
Pulling myimage (registry.example.com:5000/username/myimage:)...
ERROR: Get https://registry.example.com:5000/v2/: dial tcp MY-IP:5000: connect: connection refused
Это понятно, контейнер реестра не запущен и, следовательно, не может предоставить требуемый образ для создания и запуска «myimage».
Добавление ‘depends_on’ к определению ‘myimage’ также не помогает, поскольку я полагаю, что это механизм задержки «во время выполнения» и не влияет на извлечение изображения.
Обходной путь:
- перенаправление порта MY-IP: 5000 на machine_running_docker: 5000
- закомментируйте ‘myimage’
- docker-compose up <- запускает и запускает реестр
- удалите комментарии вокруг «myimage»
- docker-compose up -d myimage
- прибыль
Вышеуказанные шаги работают, но, к сожалению, для меня неприемлемы, поскольку они полностью снижают ценность наличия всех контейнеров в одном файле и делают запуск / остановку контейнеров действительно неудобными.
Как с этим справиться? Как и где я должен хранить свои образы docker, чтобы я мог использовать их в настройке compose? Возможно ли это каким-либо образом использовать частный реестр или нет?
Комментарии:
1. Реестр — это запущенная служба. Если я понимаю вашу проблему, вы хотите извлечь данные из неработающего или недоступного реестра. Это не сработает. Реестр должен быть запущен, чтобы извлекать из него изображения.
2. Звучит как проблема XY . Какую проблему вы на самом деле пытаетесь решить, для которой вы рассматривали это как вероятное решение?
3. @gview Я знаю, я пытался как-то отложить извлечение изображений до тех пор, пока контейнер, обслуживающий их, не будет готов
4. @ShashankV спасибо, вы заставили меня переосмыслить мой первоначальный вопрос, я отредактировал весь материал, чтобы выделить исходную проблему, которую я пытаюсь решить
5. Вы пытаетесь объединить реестр и ваше приложение в один файл docker-compose? Вы говорите: «CI автоматически помещает туда изображения docker» — куда перемещается CI? Где вы пытаетесь развернуть свою комбинацию (приложение реестр)?
Ответ №1:
Итак, основываясь на ответах @ShashankV, я собрал хорошее рабочее решение:
Я разделил свои сервисы на две части, представленные двумя файлами docker-compose. Во-первых, так называемая административная часть запускает основные службы, такие как traefik, registry, portainer и так далее, чтобы я мог использовать их в своих следующих частях.
Вторая часть запускает менее важные службы или службы, зависящие от первой части. Таким образом, я могу повторно использовать свои ярлыки traefik, использовать изображения из моего реестра и так далее.
ПРИМЕЧАНИЕ: службы из ОБЕИХ частей используют одну и ту же внешнюю сеть docker, так что я могу использовать обратный прокси-сервер traefik для каждой службы.
Это сложнее, чем то, что предложил @ShashankV, и оно обеспечивает тесную связь служб из обоих файлов компоновки (одна и та же сеть, метки трафиков). Если вам это не нужно в вашем случае использования, вам, вероятно, будет лучше использовать отдельную сеть для вашей первой и второй части.
И последнее, но не менее важное: я написал пользовательскую функцию bash, которая позволяет мне поднимать или опускать весь стек с помощью одной команды, соблюдая порядок создания файлов.
#!/bin/bash
# manages separate docker-compose files
function docker-stack() {
operation=$1
if [ "$operation" = "up" ]; then
files=$(ls -1 docker-compose-*.yml| sort -n)
for file in $files
do
docker-compose -f $file up -d
done
elif [ "$operation" = "down" ]; then
files=$(ls -1 docker-compose-*.yml| sort -nr)
for file in $files
do
docker-compose -f $file down
done
elif [ "$operation" = "pull" ]; then
files=$(ls -1 docker-compose-*.yml| sort -n)
for file in $files
do
docker-compose -f $file pull
done
else
echo "Unknown command $operation"
fi
}