Docker-запуск Apache на хосте и контейнере для разных веб-сайтов
Я хочу использовать Docker, чтобы иметь возможность запускать старое приложение, которое требует PHP 5.3, при этом все еще имея мои другие веб-сайты на моем хост-сервере, работающем на хосте Apache.
Итак, у меня есть siteA.com, siteB.com, siteC.com запуск на хосте, используя хост Apache / PHP / MySQL server, и у меня есть siteZ.com это установлено в контейнере Docker, который должен использовать Apache / PHP контейнера, но сервер MySQL хоста.
вот представление архитектура я хотел бы получить :
моя проблема в том, что кажется, что я не могу запустить Apache в контейнере, так как порт 80 уже используется на хосте.
моей целью было бы, чтобы люди могли получить доступ siteA.com, siteB.com, siteC.com и siteZ.com, без необходимости указывать другой порт для любого из этих веб-сайтов.
мне удалось получить siteZ.com запуск с использованием порта 8080, но это, очевидно, не выбор.
спасибо
PS: обратите внимание, что я совершенно новичок в Docker.
Edit: вы можете найти мое рабочее решение здесь. Спасибо VonC за показывая мне путь :)
3 ответов
Я не могу запустить Apache в контейнер, так как порт 80 уже используется на хосте.
конечно, вы можете: в контейнере вы можете запустить Apache на любом порту, который хотите.
но когда вы делаете docker
run
, затем вам нужно карта этот порт контейнера к порту хоста (который не будет 80, так как он уже взят, но, например, 8080
docker run -d -p 8080:80 yourImage
моей целью было бы, чтобы люди могут получить доступ siteA.com, siteB.com, siteC.com и siteZ.com
это называется обратным прокси, и вы можете запустить на порту 80 NGiNX (в контейнере или нет), который затем обратит прокси обратно в siteA, B или C (каждый работает на другом порту, в контейнере или нет).
См., например,"nginx обратный прокси с несколькими доменами ssl".
ваш основной Apache больше не будет работать непосредственно на порту 80 (или может, если вы поместите его в контейнер!)
цель за положить все в свой собственный контейнер изоляции.
Не только изоляция файловой системы с chroot или изоляция памяти, но и конфигурация изоляция: в контейнере Apache всегда запускается (если вы хотите) в 80/443, независимо от того, сколько контейнеров Apache запущено.
Вы просто запускаете их с соответствующим сопоставлением портов хоста, но внутри контейнера конфигурация остается фиксированной и идентичной.
спасибо VonC это!--15--> мне удалось заставить его работать, но я немного изменил свою архитектуру, в результате чего получилось 3 контейнера вместо 1.
у меня есть один контейнер для каждой версии Apache / PHP и один контейнер с nginx в качестве обратного прокси. Я думаю, вы можете легко адаптировать это для установки Nginx на хосте и изменить его конфигурацию в соответствии с архитектурой, описанной в моем вопросе.
обратите внимание, что, поскольку я новичок в Docker, и noob что касается системного администрирования Linux, их, вероятно, некоторые ошибки и вещи, которые не имеют никакого смысла в следующих сценариях, но это работает для меня. Не стесняйтесь, чтобы улучшить его :)
Nginx обратный прокси-изображение
Dockerfile:
FROM debian:jessie
MAINTAINER AntoineB version: 0.1
RUN apt-get update && \
apt-get install -y --force-yes \
nginx \
nano
EXPOSE 80
EXPOSE 443
ADD ./proxy.conf /etc/nginx/conf.d/proxy.conf
CMD ["nginx"]
вот ссылка :
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_busy_buffers_size 64k;
и я запускаю его, используя следующий скрипт bash:
docker run -ti -d -p 80:80 -v /home/antoineb/Docker/images/nginxproxy/virtualhosts:/etc/nginx/sites-enabled --name nginxproxy nginxproxy /bin/bash
у меня есть /home/antoineb/Docker/images/nginxproxy/virtualhosts
папка на моем хосте, содержит следующее :
server {
listen 80;
server_name siteZ.com;
location / {
proxy_pass http://apache22php53:80;
}
}
server {
listen 80;
server_name siteA.com;
location / {
proxy_pass http://apache24php56:80;
}
}
server {
listen 80;
server_name siteB.com;
location / {
proxy_pass http://apache24php56:80;
}
}
Apache 2.2 + PHP 5.3 изображение
Dockerfile:
FROM debian:wheezy
MAINTAINER AntoineB version: 0.1
RUN apt-get update
RUN echo "deb http://packages.dotdeb.org squeeze all" > /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb-src http://packages.dotdeb.org squeeze all" >> /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "deb http://ftp.debian.org/debian/ squeeze main contrib non-free" >> /etc/apt/sources.list.d/dotdeb_squeeze.list
RUN echo "Package: *php*" > /etc/apt/preferences.d/php53.pref
RUN echo "Pin: release o=packages.dotdeb.org,n=squeeze" >> /etc/apt/preferences.d/php53.pref
RUN echo "Pin-Priority: 989" >> /etc/apt/preferences.d/php53.pref
RUN apt-get update && \
apt-get install -y --force-yes \
apache2 \
php5 \
php5-curl \
php5-gd \
php5-mysql \
nano
RUN a2enmod \
php5 \
rewrite
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
EXPOSE 80
EXPOSE 443
CMD /usr/sbin/apache2ctl -D FOREGROUND
я запускаю его, используя следующий скрипт :
docker run -ti -d -p 2253:80 -v /home:/home -v /home/antoineb/Docker/images/apache22php53/virtualhosts:/etc/apache2/sites-enabled --name apache22php53 apache22php53 /bin/bash
мои веб-сайты хранятся в / home / website.com / www, и мои виртуальные хосты apache хранятся на хосте в /home/antoineb/Docker/images/apache22php53/virtualhosts
.
Apache 2.4 + PHP 5.6.9 изображение
Dockerfile:
FROM debian:jessie
MAINTAINER AntoineB version: 0.1
RUN apt-get update && \
apt-get install -y --force-yes \
apache2 \
php5 \
php5-curl \
php5-gd \
php5-mysql \
nano
RUN a2enmod \
php5 \
rewrite
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
EXPOSE 80
EXPOSE 443
CMD /usr/sbin/apache2ctl -D FOREGROUND
мой скрипт работает :
docker run -ti -d -p 2456:80 -v /home:/home -v /home/antoineb/Docker/images/apache24php56/virtualhosts:/etc/apache2/sites-enabled --name apache24php56 apache24php56 /bin/bash
опять же, мои веб-сайты хранятся в / home / website.com / www, и мои виртуальные хосты apache хранятся на хосте в /home/antoineb/Docker/images/apache24php56/virtualhosts
.
вы можете использовать маршрутизацию на основе хоста в Docker glue
https://github.com/muayyad-alsadi/docker-glue
это легкий демон, который генерирует haproxy
шаблоны на лету (вы можете определить шаблон nginx, если хотите), которые смотрят ярлыки контейнеров, как это
docker run -d --name wp1 -l glue_http_80_host='wp1.example.com' mywordpress/wordpress
docker run -d --name wp2 -l glue_http_80_host='wp2.example.com' mywordpress/wordpress
в этой настройке демон клея будет генерировать конфигурацию haproxy, чтобы трафик wp1.example.com переходит в контейнер wp1