我想使用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为我指路:)
您可以在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容器
我无法在容器中运行Apache,因为主机上已经在使用端口80。
当然可以:在容器中,您可以在任何想要的端口上运行Apache。
但是当您执行docker
run
操作时,您需要将此容器端口映射到主机端口(主机端口不是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容器正在运行
您只需使用适当的主机端口映射启动它们,但在容器中,配置保持固定不变。
多亏了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上运行