Whi*_*hir 7 apache ssl docker docker-compose
我在弄清楚如何使用包含多个 Docker 容器的 https 正确设置 Web 服务器时遇到问题。
我有一个使用“httpd” docker-image运行 apache 的主容器。为简单起见,我们称这个网站为“ main.com ”。SSL 在这里工作得很好。我已经设置了 httpd.conf 配置文件以将所有对端口 80 的调用重定向到端口 443 并加载 SSL 和代理模块。(端口 80 和 443 都暴露了)。
我有另一个 Docker 容器,它运行一个 API 来为“ main.com ”提供地理数据。我们可以称这个容器为“ side-container ”。在“ side-container ”的 Dockerfile 中,我从中公开了端口 8080。然后我可以调用“ main.com:8080 ”来查询我运行 API 的“ side-container ”。
问题 -->至少在我将“ main.com ”更改为仅使用 https之前我可以。
我被困在试图让“ side-container ”再次工作。尝试连接到“ main.com:8080 ”时,出现超时错误。
我的“docker ps”看起来像这样:
IMAGE COMMAND PORTS NAMES
main-container "httpd-foreground" 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9010->9010/tcp main
side-container:latest "/docker-entrypoint.…" 0.0.0.0:8080->8080/tcp side-container
Run Code Online (Sandbox Code Playgroud)
我使用 docker-compose 来控制容器,所以也许我需要在那里设置一些东西?我已经尝试通过使用 apache 中的反向代理设置(请参阅下面的 http.conf)来使其工作,方法是使用“主”容器上的端口 9010指向“侧容器”上的端口 8080 。由于 SSL 握手失败,我可以让它回复“内部服务器错误”,但仅此而已。
我的背景是纯物理学,而不是软件和网络服务器,所以也许我遗漏了一些明显的东西。任何提示都非常感谢。
从 httpd.conf:
<IfModule mod_ssl.c>
Listen 443
Listen 8080
Listen 0.0.0.0:9010 https
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
SSLProtocol all -SSLv3
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512
SSLSessionCache shmcb:/dev/ssl_gcache_data(512000)
</IfModule>
<Virtualhost *:443>
ServerName main.com
SSLEngine on
#Primary Certificate file
SSLCertificateFile /usr/local/apache2/conf/certificate.crt
#Private Key
SSLCertificateKeyFile /usr/local/apache2/conf/private.key
#Chain bundle file
SSLCertificateChainFile /usr/local/apache2/conf/ca_bundle.crt
</VirtualHost>
<Virtualhost 0.0.0.0:9010>
ServerName main.com
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLCertificateFile /usr/local/apache2/conf/certificate.crt
SSLCertificateKeyFile /usr/local/apache2/conf/private.key
SSLCertificateChainFile /usr/local/apache2/conf/ca_bundle.crt
ProxyPass /apptest http://0.0.0.0:8080/
ProxyPassReverse /apptest https://0.0.0.0:8080/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: '3'
services:
main-container:
build:
context: .
dockerfile: Dockerfile
container_name: "main"
restart: "always"
ports:
- "80:80"
- "443:443"
- "9010:9010"
links:
- side-container
networks:
- fu
side-container:
image: side-container:latest
container_name: "side-container"
ports:
- "8080:8080"
volumes:
- ${HOME}/data:/data
restart: "always"
networks:
- fu
networks:
fu:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
当使用 docker compose 连接同一网络中的 docker 容器时,您需要通过 docker 服务名称引用它们,而不是0.0.0.0使用side-container:
ProxyPass /apptest http://side-container:8080/
ProxyPassReverse /apptest https://side-container:8080/
Run Code Online (Sandbox Code Playgroud)
注意:在侧容器中运行的服务器必须在其 httpd 配置中侦听 0.0.0.0:8080。
现在您可以从 docker compose 文件中完全删除端口声明,因为两个容器都位于同一个 docker 网络中,因此您不需要公开任何端口。仅当您想side-container从主机中的本地主机或从互联网访问时才需要公开端口。
因此,从侧面容器中删除:
ports:
- "8080:8080"
Run Code Online (Sandbox Code Playgroud)
另外,在 docker compose 文件中,您应该替换links为新语法depends_on:
depends_on:
- side-container
Run Code Online (Sandbox Code Playgroud)
出于教育目的。
请记住,指定端口时,与侦听来自互联网的所有请求8080:8080相同,因此将它们限制为运行 docker 的计算机的本地主机。0.0.0.0:8080:80800.0.0.0127.0.0.1127.0.0.1:8080:8080
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |