我有一个网络应用程序的集合,每个程序都运行在自己的Docker容器中。我可以通过 http://localhost:9001
比如说,我想通过远程访问它们。我想通过以下方式远程访问它们 https://site.example.com
,而不是。我有一个通配符Let's Encrypt证书用于 example.com
.
我知道我需要Apache来做从FQDN到Port的直接流量。所以我设置了一个 VirtualHost
下图)。正常的网络活动似乎可以正常工作。我可以正常浏览网站。
然而,当我尝试使用OAuth(例如BitBucket)登录时,我得到一个URI重定向不匹配的错误。当我在容器外运行时,这种情况不会发生。我认为我的Proxy设置有问题。有谁能告诉我如何纠正?
<VirtualHost *:443>
ServerAdmin admin@example.com
ServerName site.example.com
ServerSignature Off
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9001/
ProxyPassReverse / http://127.0.0.1:9001/
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem
AllowEncodedSlashes NoDecode
</VirtualHost>
对于这样的用例。Traefik 是一个非常适应的工具。再加上 docker-compose你可以在同一个主机上设置多个docker容器,每个容器都有自己的端点。要远程访问它们,你只需要将远程主机的IP地址绑定到你所有的端点上(或者使用公共DNS来完成)。
下面是一个 docker-compose.yml
使用Traefik的例子。
version: "3"
services:
traefik:
image: traefik:latest
command: --api --docker --logLevel=DEBUG
ports:
- "80:80"
- "443:443"
- "8082:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
labels:
- "traefik.enable=false"
your_first_container:
image: <YOUR_IMAGE>
labels:
- "traefik.frontend.rule=Host:site.example.com"
- "traefik.port=9001"