Когда я делаю рысь локальный хост: 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 martin@email.com
    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 martin@email.com
    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
    Администратор сервера martin@email.com
    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
        Администратор сервера martin@email.com
        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 я создаю мостовую сеть и сопоставляю:
Мои вопросы:
- Почему я могу подключиться с моего хоста к моему контейнеру, используя 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. 
- Что мне делать, чтобы иметь возможность перенаправлять https-трафик с моего хост-апача (как обратный прокси-сервер) на мой контейнерный апач с использованием локального хоста, т.е. https://127.0.0.1:14433/ - чтобы к моему контейнеру можно было получить доступ из Интернета, также используя https, и поэтому мне не нужно указывать IP-адрес контейнера в моей конфигурации apache хоста обратного https-прокси?