Рейтинг:0

НЕ МОЖЕТ привязать порт хоста 14433 к порту контейнера 433 с помощью локального хоста, но https работает с IP-адресом контейнера (например, 172.21.0.2)

флаг bd

Когда я делаю рысь локальный хост: 14080 с хоста работает. Сайт загружается из контейнера.

Когда я делаю рысь локальный хост: 14433 с хоста, это НЕ работает.

Когда я делаю рысь https://localhost:14433 с хоста, это НЕ работает. Ошибка: Не удалось установить безопасное соединение с удаленным хостом.

Контейнер работает в мостовой сети, запущенной с помощью docker-compose. IP-адрес контейнера: 172.21.0.2.

Но когда я сделаю рысь https://172.21.0.2 ОНО РАБОТАЕТ...

...сайт загружается из контейнера с использованием https и SSL-сертификатов. Я получаю только предупреждение SSL:

172.21.02!=cert(CN<example.com>) — Продолжить?

... что означает, что CN сертификата не совпадает с IP-адресом, который я пытался открыть, но я все еще могу игнорировать это предупреждение и продолжать открывать сайт.

Это означает, что http работает на локальном хосте (а также работает, когда я использую IP-адрес контейнера).

Но https работает только тогда, когда я пытаюсь подключиться с использованием IP-адреса контейнера, но не работает, когда я использую localhost.

Вот почему я думаю, что в привязках портов сетей, созданных докером, есть ошибка.

Я хотел бы иметь возможность подключаться к контейнеру с помощью локального хоста, поэтому мне не нужно указывать новый IP-адрес контейнера каждый раз, когда я перезапускаю контейнер, потому что я планирую настроить обратный прокси-сервер apache2 на хосте, поэтому что внешний мир может подключиться к моему сайту в контейнере, используя https.

Это мои настройки apache2 на хосте:

Файл example.com.conf в моем хосте apache conf:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]
    CustomLog /var/www/docker/example.com/log/host/custom.log combined
    ErrorLog /var/www/docker/example.com/log/host/error.log
    Redirect permanent / https://example.com/
    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass        "/" "http://172.21.0.2/"
    ProxyPassReverse "/" "http://172.21.0.2/"
</VirtualHost>

Файл example.com-le-ssl.conf в моем хосте apache conf:

<IfModule mod_ssl.c>
ErrorLog /var/www/docker/example.com/log/host/error.log
LogLevel debug
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ProxyPreserveHost on
    ServerAdmin [email protected]
    LogLevel debug
    CustomLog /var/www/docker/example.com/log/host/custom.log combined
    ErrorLog /var/www/docker/example.com/log/host/error.log
    <If "%{HTTP_HOST} == 'www.example.com'">
      Redirect permanent / https://example.com/
    </If>
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLProxyEngine on
    SSLEngine on
    ProxyRequests off
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass        "/" "http://172.21.0.2/"
    ProxyPassReverse "/" "http://172.21.0.2/"
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>

Это моя конфигурация Apache в контейнере:

Файл default-ssl.conf в моем хосте apache conf:

Имя сервера example.com

<Виртуальный хост _default_:80>
    Имя сервера example.com
    Псевдоним сервера www.example.com
    Администратор сервера [email protected]
    DocumentRoot /var/www/html/www
    Журнал ошибок /var/log/container/error.log
    CustomLog /var/log/container/custom.log вместе
</ виртуальный хост>

<IfModule mod_ssl.c>
Отладка на уровне журнала
    <Виртуальный хост _default_:443>
        Имя сервера example.com
        Псевдоним сервера www.example.com
        Администратор сервера [email protected]
        DocumentRoot /var/www/html/www
        Отладка на уровне журнала
        Журнал ошибок /var/log/container/error.log
        CustomLog /var/log/container/custom.log вместе
        Включить /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</ виртуальный хост>
</ЕслиМодуль>

Это мой файл docker-compose.yml:

версия: '3.7'

сети:
  пример веб-приложения:
    водитель: мост

Сервисы:
  референтный:
    имя_контейнера: пример веб-приложения
    строить:
      контекст: ./
      докерфайл: Докерфайл
      цель: разработчик
    изображение: пример веб-приложения
    перезапуск: если не остановлен
    сети:
      - пример веб-приложения
    порты:
      **- "14433:433"
      - "14080:80"**
    рабочий_каталог: /var/www/html
    тома:
      - ./container_apache_conf:/etc/apache2/сайты-доступны
      - ./апи:/вар/www/html/апи
      - ./архив:/var/www/html/архив
      - ./журнал/контейнер:/вар/журнал/контейнер
      - ./журнал/хост:/вар/лог/хост
      - ./etc/letsencrypt:/etc/letsencrypt
      - ./www:/var/www/html/www

Это мой Dockerfile:

ИЗ базы php:7.4-apache AS
RUN apt-получить обновление
RUN mkdir -p /var/www/html/www # здесь будет сохранен сайт
RUN mkdir -p /var/log/container # здесь будут сохраняться логи apache
# подключение и интернационализация mysql для php
ЗАПУСК docker-php-ext-установить mysqli
ЗАПУСК docker-php-ext-enable mysqli
RUN apt-get install -y libicu-dev
ЗАПУСК docker-php-ext-configure междунар.
ЗАПУСК docker-php-ext-install международ.
# включает https для apache
ЗАПУСК a2enmod ssl
ЗАПУСК a2ensite default-ssl.conf


ИЗ базы AS dev
ЗАПУСК pecl установить xdebug-3.1.1
ЗАПУСК docker-php-ext-enable xdebug

С базового теста AS

ИЗ базы AS prod

Это то, что генерируется:

проверка сети докеров examplecom_example


[
    {
        "Имя": "examplecom_example",
        «Идентификатор»: «7311d1a7254466bd6ab44833362460cde4336ade622bca87def62bb3d840ef3f»,
        "Создано": "2022-02-13T21:16:34.861655456Z",
        «Область действия»: «местный»,
        «Водитель»: «мост»,
        «Включить IPv6»: ложь,
        "ИПАМ": {
            "Драйвер": "по умолчанию",
            «Опции»: ноль,
            "Конфигурация": [
                {
                    "Подсеть": "172.21.0.0/16",
                    «Шлюз»: «172.21.0.1»
                }
            ]
        },
        "Внутренний": ложь,
        «Присоединяемый»: правда,
        "Вход": ложь,
        «Конфигурация»: {
            "Сеть": ""
        },
        "Только Конфигурация": ложь,
        "Контейнеры": {
            "be53d5b37e2fbcaae49bb111b921dfd4caf5db20ed680403083333ffac983b93": {
                "Имя": "пример",
                "EndpointID": "fb1428d29e2fc9564b3e1758a7efac15909a897021320b15f 1df8c1d600efd89",
                "MacAddress": "00:00:00:00:00:00",
                "IPv4-адрес": "172.21.0.2/16",
                "IPv6-адрес": ""
            },
    }
]

Это вывод docker ps:

ИДЕНТИФИКАТОР КОНТЕЙНЕРА ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНА СТАТУС ИМЕНА ПОРТОВ
be53d5b37e2f пример "docker-php-entrypoi¦" 11 часов назад Up 11 часов 443/tcp, 0.0.0.0:14080->80/tcp, :::14080->80/tcp, 0.0.0.0:14433->433 /tcp, :::14433->433/tcp пример

Я использую официальный образ докера php.

И в docker compose я создаю мостовую сеть и сопоставляю:

  • "14433:433"
  • "14080:80"

Мои вопросы:

  1. Почему я могу подключиться с моего хоста к моему контейнеру, используя http на http://127.0.0.1:14080, но не используя https на https://127.0.0.1:14433, хотя оба порта для http и https (14080:80 и 14433:433) должны быть сопоставлены одинаково? И почему https все еще работает, когда я подключаюсь к контейнеру, используя https на https://172.21.0.2.

  2. Что мне делать, чтобы иметь возможность перенаправлять https-трафик с моего хост-апача (как обратный прокси-сервер) на мой контейнерный апач с использованием локального хоста, т.е. https://127.0.0.1:14433/ - чтобы к моему контейнеру можно было получить доступ из Интернета, также используя https, и поэтому мне не нужно указывать IP-адрес контейнера в моей конфигурации apache хоста обратного https-прокси?

Рейтинг:0
флаг in

Зачем эти *?

      **- "14433:433"
      - "14080:80"**

Попробуйте с

версия: '3.7'

сети:
  пример веб-приложения:
    водитель: мост

Сервисы:
  референтный:
    имя_контейнера: пример веб-приложения
    строить:
      контекст: ./
      докерфайл: Докерфайл
      цель: разработчик
    изображение: пример веб-приложения
    перезапуск: если не остановлен
    сети: эти
      - пример веб-приложения
    порты:
      - "14433:433"
      - "14080:80"
    рабочий_каталог: /var/www/html
    тома:
      - ./container_apache_conf:/etc/apache2/сайты-доступны
      - ./апи:/вар/www/html/апи
      - ./архив:/var/www/html/архив
      - ./журнал/контейнер:/вар/журнал/контейнер
      - ./журнал/хост:/vatheser/лог/хост
      - ./etc/letsencrypt:/etc/letsencrypt
      - ./www:/var/www/html/www

И, пожалуйста, покажите вывод докер пс.

И для Apache в качестве прокси, хотя я слышал, что nginx в настоящее время предпочтительнее, вы можете использовать такую ​​​​конфигурацию.

<VirtualHost *:80>

ServerName your.vhost.tld

RewriteEngine on
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

ErrorLog ${APACHE_LOG_DIR}/your.vhost.tld-error.log
CustomLog ${APACHE_LOG_DIR}/your.vhost.tld-access.log vhost_combined

</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

ServerName your.vhost.tld
<Proxy *>
order deny,allow
Allow from all
</Proxy>

SSLEngine on
SSLCertificateFile      /etc/apache2/ssl/your.vhost.tld/certificate.crt
SSLCertificateKeyFile   /etc/apache2/ssl/your.vhost.tld/certificate.key
#SSLCACertificateFile   /etc/apache2/ssl/your.vhost.tld/cert.cabundle

SetEnv           force-proxy-request-1.0 1
SetEnv           proxy-nokeepalive       1
SetEnv           proxy-initial-not-pooled 1

ErrorLog ${APACHE_LOG_DIR}/your.vhost.tld-error.log
CustomLog ${APACHE_LOG_DIR}/your.vhost.tld-access.log vhost_combined

ProxyTimeout 600
SSLProxyEngine On
#ProxyRequests On
#ProxyPreserveHost On
RewriteEngine off

#PROXY's
ProxyRequests Off
<Location "/">
ProxyPreserveHost On
ProxyPass https://localhost:14443
ProxyPassReverse https://localhost:14443
</VirtualHost>
</IfModule>
флаг bd
**- "14433:433" - "14080:80"** была просто орфографической ошибкой при сбое сервера. У docker-compose.yml было правильное написание без **.
флаг bd
Чем отличается файл docker-compose.yml? Единственная разница, которую я вижу, это добавление «этих» после «сетей:». Но это дает мне ошибку при попытке запустить docker compose. ОШИБКА: yaml.scanner.ScannerError: при сканировании простого ключа в "./docker-compose.yml", строка 16, столбец 5 не удалось найти ожидаемый ':' в "./docker-compose.yml", строка 18, столбец 5
флаг bd
openssl s_client -crlf -connect localhost:14433 -servername www.example.com Дает мне: ПОДКЛЮЧЕН(00000003) написать: errno=104 --- нет доступного однорангового сертификата --- Имена ЦС сертификата клиента не отправлены --- SSL-рукопожатие прочитало 0 байт и записало 310 байт Проверка: ОК --- Новый, (НЕТ), Шифр ​​(НЕТ) Безопасное повторное согласование НЕ поддерживается Сжатие: НЕТ Расширение: НЕТ ALPN не согласован Предварительные данные не были отправлены Подтвердите код возврата: 0 (хорошо) ---
флаг bd
Я согласен, nginx предпочтительнее, но я не решаюсь запускать nginx и apache2 на одной машине, и я также не решаюсь переносить все остальные веб-сайты на докер или nginx, потому что у них много серверных и apache2-настроек.
флаг bd
Я попробовал ваши настройки, но ошибка все еще сохраняется. Lynx выдает: Предупреждение!: Непредвиденная ошибка чтения сети; соединение прервано. Не удается получить доступ к `example.com' Предупреждение!: Не удается получить доступ к документу.
флаг bd
Я отказался от проблемы и попробовал с nginx. Оно работает. Вместо этого я перенесу все на nginx.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.