当前位置: 首页 > 知识库问答 >
问题:

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

叶俊郎
2023-03-14

我想使用Docker,以便能够运行一个需要PHP5.3的旧应用程序,同时在我的主机服务器上还有我的其他网站,在主机Apache上运行。

所以我有一个网站。com,siteB。com,siteC。com运行在主机上,使用主机Apache/PHP/MySQL服务器,我有siteZ。com,安装在Docker容器中,该容器应使用容器的Apache/PHP,而不是主机MySQL服务器。

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

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

我的目标是让人们能够访问siteA。com,siteB。com,siteC。com和siteZ。com,而无需为这些网站指定其他端口。

我设法使用8080端口运行siteZ. com,但显然这不是一个选项。

谢谢

PS:请注意,我对Docker完全是新手。

编辑:你可以在这里找到我的工作解决方案。感谢VonC为我指路:)

共有3个答案

曹浩淼
2023-03-14

您可以在docker glue中使用基于主机的路由

https://github.com/muayyad-alsadi/docker-glue

它是一个轻量级的守护进程,可以动态生成haagent模板(如果你愿意,你可以定义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 

在此设置中,glue守护进程将生成haproxy配置,以便将通信量发送到wp1。实例com转到wp1容器

谯灿
2023-03-14

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

当然可以:在容器中,您可以在任何想要的端口上运行Apache。

但是当您执行dockerrun操作时,您需要将此容器端口映射到主机端口(主机端口不是80,因为它已经被占用,但例如8080)

docker run -d -p 8080:80 yourImage

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

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

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

将所有东西放在自己的容器中的目的是隔离
不仅仅是使用chroot进行文件系统隔离,或者内存隔离,还包括配置隔离:在一个容器中,Apache总是以80/443运行(如果您愿意),而不管有多少Apache容器正在运行
您只需使用适当的主机端口映射启动它们,但在容器中,配置保持固定不变。

慕皓君
2023-03-14

多亏了VonC的回答,我成功地让它工作了,但我稍微改变了我的架构,结果是3个容器,而不是1个。

每个Apache/PHP版本都有一个容器,一个容器使用Nginx作为反向代理。我认为您可以很容易地对其进行调整,以便在主机上安装Nginx,并更改其配置以匹配我在问题中描述的体系结构。

请注意,由于我是Docker的新手,也是Linux系统管理方面的新手,在下面的脚本中可能会出现一些错误和没有任何意义的事情,但这对我来说是可行的。请随意改进:)

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脚本运行它:

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/nginx代理/虚拟主机文件夹,其中包含以下默认文件:

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;
       }
}

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

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

 类似资料:
  • 问题内容: 我在vps中分别在两个docker容器中运行两个网站。例如www.myblog.com和www.mybusiness.com 如何在vps中实现virtualhost,以便两个网站都可以使用端口80。 我在其他地方问了这个问题,建议您看看:https : //github.com/hipache/hipache和https://www.tutum.co/ 他们看起来有些弯曲。我试图找到

  • 问题内容: 我试图让一个docker容器运行来管理我的cronjobs 我使用centOS 6.5 base在docker容器中运行了一个非常简单的cron作为测试 如果容器在CoreOS主机上运行,​​则可以正常工作;但是,如果我在ubuntu 13.10主机上运行容器,则不会执行cron。(尽管主机没有影响容器中正在运行的内容) 两台主机都在运行docker 0.8 我是否缺少明显的东西,或者

  • 问题内容: 如何从Docker容器控制主机? 例如,如何执行复制到主机的bash脚本? 问题答案: 那真的取决于您需要该bash脚本执行的操作! 例如,如果bash脚本仅回显某些输出,则可以执行 另一种可能性是您希望bash脚本安装某些软件-例如要安装docker-compose的脚本。你可以做类似的事情 但是,此时,您真的必须深入了解脚本在做什么,以允许容器从容器内部对其主机授予特定权限。

  • 如何从docker容器控制主机? 例如,如何执行复制到主机的bash脚本?

  • 环境详细信息 Windows 10 Docker桌面 Spring Boot(在容器内使用) RabbitMQ(作为服务安装在我的windows机器上) 我想从Spring Boot Container访问RabbitMQ服务。我在里面提供了下面的属性application.properties 我正在运行我的Spring启动应用程序 docker run-p 8083:8083 dockerde

  • 问题内容: 我在CI和CD上创建了Jenkinsfile,Dockerfile,Dockerfile.test到CI和CD,在GitHub上构建了我的服务器API,我在Jenkins上构建了该构建,并且构建成功,并且我的docker在Jenkinsfile阶段也在容器上运行,我创建了用于测试和部署在服务器API上,并使用docker作为容器 我也使用docker-compose在docker上运行