【问题标题】:https in multiple docker containershttps 在多个 docker 容器中
【发布时间】:2020-07-09 09:51:46
【问题描述】:

我无法弄清楚如何使用包含多个 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

我使用 docker-compose 来控制容器,所以也许我需要在那里设置一些东西? 我尝试通过在 apache 中使用反向代理设置(参见下面的 http.conf),通过使用“main”容器上的端口 9010 指向“ 侧容器”。 由于 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>

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

【问题讨论】:

  • 如果您运行 side-container 只能通过 main-container 访问,那么使用 SSL 的唯一充分理由是使用 WebRTC 或 HTTP/2 进行通信。除此之外,流量永远不会离开容器,并且很容易未加密。 如果您想要 SSL,您需要确保 main-containerside-container 的证书视为有效或忽略 SSL 验证(如果有来自 @987654329 的其他输出请求,这不是一个好主意@)。

标签: apache docker ssl docker-compose


【解决方案1】:

当使用 docker compose 链接同一网络中的 docker 容器时,您需要通过 docker 服务名称来引用它们,因此请使用 0.0.0.0 而不是 side-container

ProxyPass /apptest http://side-container:8080/
ProxyPassReverse /apptest https://side-container:8080/

注意:在侧容器中运行的服务器必须在其 httpd 配置中监听 0.0.0.0:8080。

现在您可以从 docker compose 文件中完全删除端口声明,因为两个容器都在同一个 docker 网络中,因此您不需要公开任何端口。仅当您想从主机中的 localhost 或从 Internet 访问 side-container 时,才需要公开端口。

所以从侧面容器中移除:

ports:
      - "8080:8080"

同样在 docker compose 文件中,您应该将 links 替换为新语法 depends_on

depends_on:
      - side-container

端口声明

用于教育目的。

请记住,当指定8080:8080 之类的端口时,0.0.0.0:8080:80800.0.0.0 会监听来自互联网的所有请求,因此将它们限制为运行 docker 的机器的 localhost 127.0.0.1会做127.0.0.1:8080:8080

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2022-01-10
    • 2017-01-30
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多