Взаимодействие Docker контейнеры приложений с существующим веб-сервером Apache - PullRequest
0 голосов
/ 26 января 2019

Я довольно новичок в Docker, и у меня есть некоторые проблемы с пониманием того, как сделать мои «содержащиеся» приложения доступными из Интернета.

[ моя текущая конфигурация ] два веб-сайта (в / var / www / html) + стандартный Apache + некоторые настройки, которые я хотел бы применить ко всему новому, что я развертываю (переписывание заголовков на основе CSP, обновление SSL-сертификатов с Certbot и т. д. и т. д.).Я довольно доволен своим текущим конфом.

[ мои два приложения ] Оба являются автономными приложениями (требуется только дБ).

- официальный wordpress изображение.(-> новое доменное имя)

- приложение на основе django, упакованное сервером gunicorn на основе этого учебного пособия (-> поддомен существующего домена)

[ проблема ] Если я связываю оба приложения, скажем, на портах 8080 и 8000, браузеры не смогут достичь этого, поскольку DNS-серверы не обрабатывают порты (насколько я понял, поправьте меня, если я ошибаюсь),Если я буду связываться тогда по стандартным портам, у меня будет конфликт с моим существующим Apache.

Как бы вы справились с этим?Могу ли я перенаправить на внутренний ip контейнера с каким-нибудь mod_proxy ?Есть ли способ сделать это проще и безопаснее?

<VirtualHost *:443>
    ServerName sub.mydomain.io
    Redirect "/" "http://172.17.0.2/"

    ErrorLog /var/log/apache2/error.zarebski.io.com.log
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/mydomain.io/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.io/privkey.pem
</VirtualHost>

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Ну, мне потребовалось некоторое время, чтобы разобраться, потому что было два основных угловых случая.Я остановлюсь на одном случае: wordpress image

<VirtualHost *:443>
    ServerName new_domain.eu
    ProxyPass / http://localhost:8081/

    <Location />
            AddOutputFilterByType SUBSTITUTE text/html
            SetOutputFilter proxy-html
            ProxyPassReverse /
            Substitute "s|http://localhost:8081/|https://new_domain.eu/|i"
            RequestHeader    unset  Accept-Encoding
    </Location>

    SSLCertificateFile /etc/letsencrypt/live/new_domain.eu/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/new_domain.eu/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

[ Прежде всего ], я не смог получить доступ к контейнеру с их локального ip (то есть 172.7.0.3:80, не знаю почему), поэтому я использовал порт localhost, определенный при настройке контейнера:

docker run -e WORDPRESS_DB_PASSWORD=thePassWord --name wordpress --link wordpressdb:mysql -p 8081:80 -v "$PWD/html":/var/www/html -d wordpress

[ secondly ] сложная частьбыло, следовательно, правильно обрабатывать относительные URL (например, некоторые / путь / к / CSS), потому что они не были доступны.По-видимому, это хорошо известная проблема .Эта часть была самой длинной: многое изменилось вокруг Apache 2.4, и синтаксис не очень хорошо документирован.По сути,

Substitute "s|http://localhost:8081/|https://new_domain.eu/|i" 

заменяет все URL-адреса в html, чтобы можно было правильно обращаться к относительным ресурсам (css, js, png и т. Д.).

[ возможные улучшения ] Я не совсем доволен тем, что порт 8081 виден из внешнего мира.Это означает, что к приложению можно получить доступ с этого самого порта, минуя правила, которые я установил в apache.conf .Я исправил проблему, добавив правило iptables

iptables -A INPUT -p tcp -s localhost --dport 8081 -j ACCEPT
iptables -A INPUT -p tcp --dport 8081 -j DROP

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

\ // _

0 голосов
/ 27 января 2019

В случае, когда несколько приложений работают на разных портах и ​​разных локальных IP-адресах, рекомендуемый метод использует Обратный прокси

В основном вы настраиваете свой apache для пересылки запросов этим службам, то есть:

<VirtualHost *:443>
    ServerName sub.mydomain.io
    ProxyPass "/wordpress" "http://172.17.0.2:8080/"
    ProxyPass "/django" "http://172.17.0.2:8000/"

    ErrorLog /var/log/apache2/error.mydomain.io.com.log
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/mydomain.io/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.io/privkey.pem
</VirtualHost>

Если у вас есть многоярусный внешний домен, вы можете использовать Name Based Виртуальные хосты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...