Использование реестра docker для совместного использования моего приложения с несколькими образами контейнеров: Проблемы с подключением нескольких репозиториев образов
Мое локальное приложение в контейнере docker состоит из 4 образов, React, Django, nginx, postgres. Оно отлично работает локально, (хотя, конечно, мне нужно вручную перейти на 127.1.1.0 на моем локальном компьютере, чтобы просмотреть приложение)
Я хочу, чтобы другие люди тоже могли просматривать это приложение, если у них на локальном компьютере установлен docker, поэтому, используя шаги из документации по docker, я разместил все четыре образа в docker hub. 
Остальная часть документации вызывает у меня недоумение, так как когда я пробовал пример с использованием имени моего локального образа докера, как показано ниже,
docker run -d -p 3000:8000 --restart=always --name myport myport_nginx ,
только служба nginx image была извлечена и смогла запуститься как отдельный контейнер, но остальные службы не были вызваны.
Итак, мой вопрос: как мне определить эти четыре образа, чтобы они были подключены так, как они подключены на моем локальном компьютере, и чтобы любой человек с локальным docker мог получить мое репо и проверить мое приложение, зайдя на 127.0.0.1 на своем локальном компьютере. Я знаю, что dockerbub является аналогом github и это должно быть просто, но почему-то моя голова запуталась, и я хотел бы получить некоторые разъяснения.
Ниже приведен файл dockercompose.yml, используемый для сборки приложения в первом случае. Я знаю, что можно изменить мой .yaml так, чтобы один образ мог вызывать и запускать все остальные три, и я хотел бы получить помощь в этом, если это возможно или это хорошая практика.
version: "3.7"
services:
django:
build:
context: ./backend
dockerfile: Dockerfile
volumes:
- django_static_volume:/usr/src/app/static
expose:
- 8000
env_file:
- ./backend/.env
command: gunicorn mainapp.wsgi:application --bind 0.0.0.0:8000
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- ./postgres/.env
react:
build:
context: ./frontend
dockerfile: Dockerfile
args:
- API_SERVER=${ENV_API_SERVER}
volumes:
- react_static_volume:/usr/src/app/build/static
expose:
- 3000
env_file:
- .env
command: serve -s build -l 3000
depends_on:
- django
nginx:
restart: always
build: ./nginx
volumes:
- django_static_volume:/usr/src/app/django_files/static
- react_static_volume:/usr/src/app/react_files/static
ports:
- 80:80
depends_on:
- react
- django
volumes:
postgres_data:
django_static_volume:
react_static_volume:
команда должна быть docker-compose up. docker run запустит только один контейнер. Docker Compose up official docs
Давайте сосредоточимся на одной службе. Вам нужно будет внести аналогичные изменения во все из них.
react:
build:
context: ./frontend
dockerfile: Dockerfile
Это создает каталог frontend в вашей локальной системе. Вам нужно заменить это строкой image:, указывающей на ваш образ Docker Hub.
args:
- API_SERVER=${ENV_API_SERVER}
Это компилирует определенный URL в образ, который вы отправляете в Docker Hub. Другие потребители могут не иметь возможности использовать это. Если ваш контейнер обратного прокси nginx уже обслуживает и React-приложение, и бэкенд API на одном хосте и по разным URL-путям, вы можете использовать URL только по пути, например /api и не настраивать это.
volumes:
- react_static_volume:/usr/src/app/build/static
Это заменяет статические файлы в вашем приложении содержимым именованного тома. Если вы каким-то образом изменили это локально, у других ваших потребителей этого не будет; если вы обновите образ, именованный том останется неизменным, и обновленные файлы в образе не будут видны. Я бы рекомендовал удалять такие именованные тома. (Вашему контейнеру nginx нужно будет COPY статические файлы в свой образ.)
expose:
- 3000
Это ничего не делает и может быть безопасно удалено.
env_file:
- .env
Этот .env файл существует только в вашей локальной системе. Вы можете либо распространить этот файл, либо преобразовать его в инлайн environment: переменные, либо, в зависимости от того, каковы настройки, исправить их с помощью инструкций Dockerfile ENV.
command: serve -s build -l 3000
Это переопределяет CMD изображения и не должно быть необходимым.
depends_on:
- django
Это нормально.
После очистки всего этого, для этой услуги я бы ожидал чего-то более похожего на:
react:
image: 2fresh/frontend
depends_on:
- django
Вам может показаться полезным иметь docker-compose.override.yml файл рядом с docker-compose.yml. В нем содержатся определения, которые нужны только для локальной разработки, например, как build: использовать изображения. Эти два файла будут объединены, и наличие build: и image: вместе указывает Compose, какое имя использовать для собранного образа.
# docker-compose.override.yml
version: '3.8'
services:
react:
build: ./frontend
# all other settings in main docker-compose.yml file