https в нескольких контейнерах docker - PullRequest
7 голосов
/ 09 июля 2020

У меня проблемы с выяснением того, как правильно настроить веб-сервер с https, который содержит несколько контейнеров Docker.

У меня запущен основной контейнер apache с использованием "httpd" docker -изображение . Для простоты назовем этот сайт « main.com ». SSL здесь отлично работает. Я настроил файл конфигурации httpd.conf для перенаправления всех вызовов с порта 80 на порт 443 и загрузил модули SSL и прокси. (Доступны оба порта 80 и 443).

У меня есть еще один контейнер Docker, который запускает API для обслуживания геоданных на « main.com ». Мы можем назвать этот контейнер « сайд-контейнер ». В Dockerfile для " side-container " я выставляю порт 8080 из этого. Затем я могу позвонить « main.com: 8080 », чтобы сделать запрос к моему « сайд-контейнеру », который запускает API.

Проблема -> По крайней мере, я мог, пока не изменил « main.com » на использование только https.

Я застрял, пытаясь получить « боковой контейнер"снова работать. При попытке подключиться к « 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 ниже), используя порт 9010 в контейнере « main », чтобы указать на порт 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>

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

1 Ответ

4 голосов
/ 14 июля 2020

При связывании docker контейнеров в одной сети с docker compose вам необходимо ссылаться на них по имени службы docker, поэтому вместо 0.0.0.0 используйте side-container:

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

ПРИМЕЧАНИЕ: сервер, работающий в боковом контейнере, должен прослушивать 0.0.0.0:8080 в своей конфигурации httpd.

Теперь вы можете удалить из docker составьте файл объявления портов в целом, потому что оба контейнера находятся в одной сети docker, поэтому вам не нужно открывать какие-либо порты. Открытие портов необходимо только в том случае, если вы хотите получить доступ к side-container с localhost на хост-машине или с inte rnet.

Итак, удалите из бокового контейнера:

ports:
      - "8080:8080"

Также в файле docker compose вы должны заменить links новым синтаксисом depends_on:

depends_on:
      - side-container

Объявление портов

В образовательных целях.

Помните, что при указании порта, например, 8080:8080 совпадает с 0.0.0.0:8080:8080, а 0.0.0.0 прослушивает все запросы от inte rnet, таким образом, чтобы ограничить их локальным хостом 127.0.0.1 машины, на которой выполняется docker, вы должны сделать 127.0.0.1:8080:8080.

...