Когда я делаю рысь локальный хост: 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 я создаю мостовую сеть и сопоставляю:
Мои вопросы:
Почему я могу подключиться с моего хоста к моему контейнеру, используя 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-прокси?