Как создать частные образы docker, а затем использовать их в docker-compose setup на одном компьютере?

#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’ также не помогает, поскольку я полагаю, что это механизм задержки «во время выполнения» и не влияет на извлечение изображения.

Обходной путь:

  1. перенаправление порта MY-IP: 5000 на machine_running_docker: 5000
  2. закомментируйте ‘myimage’
  3. docker-compose up <- запускает и запускает реестр
  4. удалите комментарии вокруг «myimage»
  5. docker-compose up -d myimage
  6. прибыль

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

Как с этим справиться? Как и где я должен хранить свои образы 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
}