Развертывание с помощью docker

#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, должен ли я его использовать?

докер-compose.yml

Комментарии:

1. было бы полезно, если бы вы поделились тем, как вы запускаете контейнер docker, сопоставление портов и так далее. Если контейнер docker настроен правильно, он должен работать так, как вы описали, если только его не блокирует правило брандмауэра.

2. @Stefano Я добавил изображение docker-compose.yml

3. Файл PNG не может быть запущен и его трудно прочитать. Пожалуйста, отредактируйте вопрос, чтобы включить текст файла YAML (не изображение) непосредственно в вопрос (не за ссылкой).

4. (Вам не нужно отдельно доставлять код на удаленный сервер; он уже должен быть включен в изображение.)

Ответ №1:

Ответ на этот вопрос во многом зависит от того, где вы размещаете свое производственное приложение и какие услуги оно предоставляет вам из коробки.

Как правило, на производственных серверах обычно имеется какой-либо обратный прокси-сервер или балансировщик нагрузки приложений, расположенный перед контейнерными приложениями.

Поскольку вы начинаете с docker, и поскольку я предполагаю, что это личное или маломасштабное приложение, я могу порекомендовать следующее:

  1. Если вы гибки с точки зрения хостинг-провайдеров, попробуйте Digital Ocean. Они очень удобны для разработчиков и экономически эффективны, по крайней мере, до определенной точки масштаба.
  2. Используйте автоматический докер 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 здесь, потому что это немного не по теме и доступно много ресурсов, но вам следует серьезно подумать об этом при развертывании на удаленном сервере.