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.