Docker - 在不同网站的主机和容器上运行 Apache
我想使用 Docker 以便能够运行需要 PHP 5.3 的旧应用程序,同时我的主机服务器上仍有我的其他网站,在主机 Apache 上运行.
I want to use Docker in order to be able to run an old application that requires PHP 5.3, while still having my other websites on my host server, running on the host Apache.
所以我在主机上运行了 siteA.com、siteB.com、siteC.com,使用主机 Apache/PHP/MySQL 服务器,并且我在 Docker 容器中安装了 siteZ.com,它应该使用容器的 Apache/PHP 但主机 MySQL 服务器.
So I have siteA.com, siteB.com, siteC.com running on the host, using the host Apache / PHP / MySQL server, and I have siteZ.com that is installed in a Docker container, which should be using the container's Apache / PHP but the host MySQL server.
这是我想要获得的架构的表示:
Here's a representation of the architecture I'd like to obtain :
我的问题是我似乎无法在容器中运行 Apache,因为端口 80 已在主机上使用.
My issue is that it seems like I can't run Apache in the container, since the port 80 is already in use on the host.
我的目标是人们可以访问 siteA.com、siteB.com、siteC.com 和 siteZ.com,而无需为这些网站中的任何一个指定不同的端口.
My goal would be that the people could access siteA.com, siteB.com, siteC.com and siteZ.com, without having to specify a different port for any of those websites.
我设法通过使用端口 8080 来运行 siteZ.com,但这显然不是一个选项.
I managed to get siteZ.com running by using port 8080, but it's obviously not an option.
谢谢
PS:请注意,我对 Docker 完全陌生.
PS : Please note that I'm completly new to Docker.
您可以在此处找到我的工作解决方案.感谢 VonC 向我展示前进的道路 :)
Edit : You can find my working solution here. Thanks to VonC for showing me the way to go :)
感谢 VonC 的回答 我设法得到它工作,但我稍微改变了我的架构,产生了 3 个容器,而不是只有 1 个.
Thanks to VonC's answer I managed to get it working but I slightly changed my architecture, resulting in 3 containers instead of only 1.
我为每个 Apache/PHP 版本准备了一个容器,还有一个使用 Nginx 作为反向代理的容器.我认为您可以轻松调整它以在主机上安装 Nginx 并更改其配置以匹配我在问题中描述的架构.
I have one container for each Apache / PHP version, and one container with Nginx as reverse proxy. I think you can easily adapt this to install Nginx on the host and change it's configuration to match the architecture I described in my question.
请注意,由于我是 Docker 的新手,并且是 Linux 系统管理方面的新手,因此在以下脚本中可能存在一些错误和没有任何意义的内容,但它对我有用.随意改进它:)
Note that as I'm new to Docker, and a noob regarding Linux system administration, there's probably some mistakes and things that don't make any sense in the following scripts, but it's working for me. Feel free to improve it :)
Dockerfile:
The 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.conf
文件:
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 脚本运行它:
And I run it using the following bash script :
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
文件夹,其中包含以下 default
文件:
I have a /home/antoineb/Docker/images/nginxproxy/virtualhosts
folder on my host that contains the following default
file :
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:
Apache 2.2 + PHP 5.3 image
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
我正在使用以下脚本启动它:
I'm launching it using the following script :
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
中.
My websites are stored in /home/website.com/www, and my apache virtualhosts are stored on the host in /home/antoineb/Docker/images/apache22php53/virtualhosts
.
Dockerfile:
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
中的主机上.
Again, my websites are stored in /home/website.com/www, and my apache virtualhosts are stored on the host in /home/antoineb/Docker/images/apache24php56/virtualhosts
.