Я пытаюсь создать прокси-сервер виртуального хоста Apache в контейнере Docker (у меня Docker 1.6), поэтому я сделал следующее:
Сначала настройте два контейнера Docker, каждый из которых запускает собственное веб-приложение:
docker run -it -p 8001:80 -p 4431:443 --name build ubuntu:latest
apt-get update
apt-get install apache2 libapache2-mod-php -y
echo “<?php phpinfo(); ?>” >> /var/www/html/info.php
service apache2 restart
потом
docker run -it -p 8002:80 -p 4432:443 --name cicd ubuntu:latest
apt-get update
apt-get install apache2 libapache2-mod-php -y
echo “<?php phpinfo(); ?>” >> /var/www/html/info.php
service apache2 restart
Каждый из них отлично работает на своих соответствующих портах. Итак, затем я создаю контейнер с Apache:
docker run -it -p 8000:80 -p 4430:443 --name apache_proxy ubuntu:latest
apt-get update
apt-get install apache2 -y
a2enmod proxy
a2enmod proxy_http
service apache2 restart
Это отлично работает само по себе на порту 8000.
Затем я создал файл виртуального хоста для каждого из других контейнеров Docker:
<VirtualHost *:80>
ServerName build.example.com
<Proxy *>
Allow from localhost
</Proxy>
ProxyPass / http://localhost:8001/
</VirtualHost>
и
<VirtualHost *:80>
ServerName cicd.example.com
<Proxy *>
Allow from localhost
</Proxy>
ProxyPass / http://localhost:8002/
</VirtualHost>
Затем поместил оба в /etc/apache2/sites-available/
контейнера apache_proxy
.
Теперь я вернулся в контейнер apache_proxy
и выполнил следующее:
a2ensite build.example.conf
a2ensite cicd.example.conf
service apache2 restart
Запустив apachectl -S
из командной строки контейнера apache_proxy
, я вижу, что действует следующее:
VirtualHost configuration:
*:80 is a NameVirtualHost
default server 172.17.0.17 (/etc/apache2/sites-enabled/000-default.conf:1)
port 80 namevhost 172.17.0.17 (/etc/apache2/sites-enabled/000-default.conf:1)
port 80 namevhost build.example.com (/etc/apache2/sites-enabled/build.example.conf:1)
port 80 namevhost cicd.example.com (/etc/apache2/sites-enabled/cicd.example.conf:1)
Я могу получить доступ к каждому отдельному контейнеру через соответствующий порт, и я должен иметь возможность перейти по следующим URL-адресам, чтобы перейти на соответствующие сайты:
build.example.com:8000 должен проксировать контейнер/веб-сайт через порт 8001 cicd.example.com:8000 должен проксировать контейнер/веб-сайт через порт 8002
Вместо этого я получаю следующую ошибку:
503 Сервис недоступен
Проверяю логи, получаю следующее:
[Mon Oct 16 21:17:32.510127 2017] [proxy:error] [pid 165:tid 140552167175936] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:8001 (localhost) failed
[Mon Oct 16 21:17:32.510278 2017] [proxy:error] [pid 165:tid 140552167175936] AH00959: ap_proxy_connect_backend disabling worker for (localhost) for 0s
[Mon Oct 16 21:17:32.510302 2017] [proxy_http:error] [pid 165:tid 140552167175936] [client 172.26.16.120:61391] AH01114: HTTP: failed to make connection to backend: localhost
[Mon Oct 16 21:17:32.799053 2017] [proxy:error] [pid 166:tid 140552217532160] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:8001 (localhost) failed
[Mon Oct 16 21:17:32.799232 2017] [proxy:error] [pid 166:tid 140552217532160] AH00959: ap_proxy_connect_backend disabling worker for (localhost) for 0s
[Mon Oct 16 21:17:32.799256 2017] [proxy_http:error] [pid 166:tid 140552217532160] [client 172.26.16.120:61392] AH01114: HTTP: failed to make connection to backend: localhost, referer: http://build.example.com:8000/info.php
Последние несколько часов я копался в кроличьих норах, пытаясь заставить это работать, и я уверен, что теперь мне не хватает чего-то довольно простого. Может ли кто-нибудь пролить свет на ошибочность моего пути?
ПРИМЕЧАНИЕ
Я следил за огромной кроличьей норой, касающейся SELinux, который не включен или даже не установлен в прокси-контейнере Ubuntu/Apache.
Я также должен заявить, что я не являюсь сетевым гуру или мастером настройки веб-серверов. Я знаю только достаточно, чтобы быть опасным.
РЕДАКТИРОВАТЬ
Основываясь на предложениях, я пробовал следующее:
ProxyPass / http://cicd:80/
вызывает ошибку 502ProxyPass / http://ip.address.of.server:8002/
время ожидания истеклоProxyPass / http://ip.address.of.container:8002/
вызывает ошибку 503ProxyPass / http://127.0.0.1:8002/ retry=0
вызывает ошибку 503 (предложено в других ответах)
echo net.ipv4.ip_forward=1
? - person guido   schedule 17.10.2017