#django #docker #deployment #docker-compose #remote-server
Вопрос:
Я новичок в развертывании с docker. На самом деле я запускаю свое приложение django на своем компьютере внутри контейнера docker, и оно успешно работает на локальном хосте порта:8080. Затем я перенес код на удаленный сервер и запустил docker-compose, и приложение также успешно работает там. Я хочу спросить, как я могу увидеть приложение с помощью ip — адреса сервера? Например, если ip-адрес 123.45.67.89, я думаю, что приложение должно работать в 123.45.67.89:8080, но оно там не запускается. Как я могу получить доступ к приложению, запущенному в контейнере на удаленном сервере?
P.S. Я не использовал nginx, должен ли я его использовать?
Комментарии:
1. было бы полезно, если бы вы поделились тем, как вы запускаете контейнер docker, сопоставление портов и так далее. Если контейнер docker настроен правильно, он должен работать так, как вы описали, если только его не блокирует правило брандмауэра.
2. @Stefano Я добавил изображение docker-compose.yml
3. Файл PNG не может быть запущен и его трудно прочитать. Пожалуйста, отредактируйте вопрос, чтобы включить текст файла YAML (не изображение) непосредственно в вопрос (не за ссылкой).
4. (Вам не нужно отдельно доставлять код на удаленный сервер; он уже должен быть включен в изображение.)
Ответ №1:
Ответ на этот вопрос во многом зависит от того, где вы размещаете свое производственное приложение и какие услуги оно предоставляет вам из коробки.
Как правило, на производственных серверах обычно имеется какой-либо обратный прокси-сервер или балансировщик нагрузки приложений, расположенный перед контейнерными приложениями.
Поскольку вы начинаете с docker, и поскольку я предполагаю, что это личное или маломасштабное приложение, я могу порекомендовать следующее:
- Если вы гибки с точки зрения хостинг-провайдеров, попробуйте Digital Ocean. Они очень удобны для разработчиков и экономически эффективны, по крайней мере, до определенной точки масштаба.
- Используйте автоматический докер nginx-прокси. Этот инструмент позволяет вам добавить пару строк в свой
docker-compose.yml
файл и волшебным образом получить настроенный прокси-сервер nginx, ничего не зная о nginx.
Я использую этот подход для развертывания нескольких персональных веб-сайтов на одном недорогом сервере.
Пример docker-compose.yml
может выглядеть так:
services:
nginx:
image: nginxproxy/nginx-proxy
ports: ["${PORT:-80}:80"]
restart: always
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
environment:
DEFAULT_HOST: www.yoursite.com
app:
depends_on: [nginx]
restart: always
image: your/image
environment:
VIRTUAL_HOST: myapp.localhost,www.yoursite.com
что в основном говорит nginx-прокси для обслуживания вашего приложения на обоих http://myapp.localhost и http://www.yoursite.com.
Конечно, вам нужно будет указать DNS ваших доменов на ваш IP-адрес digital ocean.
Ответ №2:
Технически это должно работать так, как вы это сделали, но, возможно, порт 8080 не открыт для внешнего мира.
Вы можете изменить отображение портов в своем docker-compose.yml
файле:
ports:
- "80":"8080"
Затем вы можете получить доступ к своему приложению с 123.45.67.89, без указания какого-либо порта, так как по умолчанию используется 80. Если это не работает, дважды проверьте ip-адрес и правила брандмауэра.
Однако использование Nginx почти всегда является хорошей идеей, поскольку локальный веб-сервер, который вы используете, не готов к работе (с точки зрения функций и безопасности). Я не буду объяснять, как реализовать Nginx здесь, потому что это немного не по теме и доступно много ресурсов, но вам следует серьезно подумать об этом при развертывании на удаленном сервере.