将Docker容器应用程序与现有Apache web服务器连接

将Docker容器应用程序与现有Apache web服务器连接,apache,docker,redirect,Apache,Docker,Redirect,我是Docker的新手,我很难理解如何从互联网上访问我的“包含”应用程序 [我当前的配置]两个网站(在/var/www/html中)+标准Apache+一些我希望应用到我部署的所有新东西(基于CSP的头文件重写、使用Certbot的SSL证书更新等)。我对我目前的工作相当满意 [我的两个应用程序]都是独立的应用程序(只需要一个db) -形象。(->新域名) -基于django的应用程序,包含基于(->现有域的子域)的gunicorn服务器 [问题]如果我将两个应用绑定在端口8080和8000上,

我是Docker的新手,我很难理解如何从互联网上访问我的“包含”应用程序

[我当前的配置]两个网站(在/var/www/html中)+标准Apache+一些我希望应用到我部署的所有新东西(基于CSP的头文件重写、使用Certbot的SSL证书更新等)。我对我目前的工作相当满意

[我的两个应用程序]都是独立的应用程序(只需要一个db)

-形象。(->新域名)

-基于django的应用程序,包含基于(->现有域的子域)的gunicorn服务器

[问题]如果我将两个应用绑定在端口8080和8000上,浏览器将无法访问它,因为DNS服务器不处理端口(据我所知,如果我错了,请纠正我)。如果我在标准端口上绑定,我将与现有的Apache发生冲突

你会怎么处理?我可以用某种类型的ip重定向到容器的内部ip吗?有更简单更安全的方法吗

<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>

ServerName sub.mydomain.io
重定向“/”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

如果多个应用程序在不同的端口和不同的本地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>

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

如果您有多文件外部域,您可以使用基于名称的

嗯,我花了一些时间才弄清楚,因为有两个主要的情况。我将坚持一个案例:wordpress图像

其次,棘手的部分是正确处理相对URL(例如,一些/path/to/css),因为它们是不可访问的。显然,这是一个很好的例子。这一部分是最长的:Apache2.4前后发生了很多变化,语法也没有很好的文档记录。基本上

Substitute "s|http://localhost:8081/|https://new_domain.eu/|i" 
替换html中的所有URL,以便可以正确访问相关资源(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
不太优雅,所以如果有人有建议,请告诉我


\//_

你能不能只通过代理服务器将端口传递到8080和8000?谢谢,它似乎可以工作,但我仍然无法获得css和js(据我所知,是经典的)。与规则条款斗争。
Substitute "s|http://localhost:8081/|https://new_domain.eu/|i" 
iptables -A INPUT -p tcp -s localhost --dport 8081 -j ACCEPT
iptables -A INPUT -p tcp --dport 8081 -j DROP