Docker - 在不同网站的主机和容器上运行Apache

Ant*_*neB 13 php mysql apache docker

我想使用Docker,以便能够运行需要PHP 5.3的旧应用程序,同时仍然在我的主机服务器上运行其他网站,在主机Apache上运行.

所以我在主机上运行了siteA.com,siteB.com,siteC.com,使用主机Apache/PHP/MySQL服务器,我有一个安装在Docker容器中的siteZ.com,它应该使用容器的Apache/PHP但主机MySQL服务器.

这是我想要获得的架构的表示:

代表我的建筑

我的问题是,似乎我无法在容器中运行Apache,因为端口80已经在主机上使用.

我的目标是人们可以访问siteA.com,siteB.com,siteC.com和siteZ.com,而无需为任何这些网站指定不同的端口.

我设法通过端口8080运行siteZ.com,但显然不是一个选项.

谢谢

PS:请注意我对Docker完全不熟悉.

编辑:您可以在这里找到我的工作解决方案.感谢VonC 向我展示了要走的路 :)

Ant*_*neB 11

感谢VonC的回答,我设法让它工作但我稍微改变了我的架构,导致3个容器而不是1个.

我有一个容器用于每个Apache/PHP版本,一个容器用Nginx作为反向代理.我想你可以很容易地调整它来在主机上安装Nginx并改变它的配置以匹配我在我的问题中描述的架构.

请注意,由于我是Docker的新手,以及关于Linux系统管理的noob,可能会出现一些错误和在下面的脚本中没有任何意义的事情,但它对我有用.随意改善它:)


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"]
Run Code Online (Sandbox Code Playgroud)

这是引用的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;
Run Code Online (Sandbox Code Playgroud)

我使用以下bash脚本运行它:

docker run -ti -d -p 80:80 -v /home/antoineb/Docker/images/nginxproxy/virtualhosts:/etc/nginx/sites-enabled --name nginxproxy nginxproxy /bin/bash
Run Code Online (Sandbox Code Playgroud)

/home/antoineb/Docker/images/nginxproxy/virtualhosts我的主机上有一个文件夹,其中包含以下default文件:

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;
       }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我正在使用以下脚本启动它:

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
Run Code Online (Sandbox Code Playgroud)

我的网站存储在/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
Run Code Online (Sandbox Code Playgroud)

我的运行脚本:

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
Run Code Online (Sandbox Code Playgroud)

同样,我的网站存储在/home/website.com/www中,我的apache虚拟主机存储在主机中/home/antoineb/Docker/images/apache24php56/virtualhosts.


Von*_*onC 9

我无法在容器中运行Apache,因为端口80已在主机上使用.

当然可以:在容器中,您可以在任何所需的端口上运行Apache.

但是,当你这样做docker run,那么你需要映射这个容器端口主机端口(该不会是80,因为它已被使用,但比如8080

docker run -d -p 8080:80 yourImage
Run Code Online (Sandbox Code Playgroud)

我的目标是人们可以访问siteA.com,siteB.com,siteC.com和siteZ.com

这被称为反向代理,您可以在端口80上运行NGiNX(在容器中或不在容器中),然后将代理反向回到站点A,B或C(每个都在不同的端口上运行,在容器中或不在容器中).
例如,参见" 具有多个ssl域的Nginx反向代理 ".

您的主Apache不再直接在端口80上运行(或者如果您将它放在容器中,它可以!)

将所有东西放在自己的容器中的目标是隔离.
不仅仅是chroot的文件系统隔离,或内存隔离,还有配置隔离:在容器中,Apache始终在80/443中运行(如果需要),无论运行多少个Apache容器.
您只需使用正确的主机端口映射启动它们,但在容器内,配置保持固定且相同.