Web 我的网站运行在docker容器中,如何实现虚拟主机?

Web 我的网站运行在docker容器中,如何实现虚拟主机?,web,docker,virtualhost,Web,Docker,Virtualhost,我在vps中的两个docker容器中运行两个网站。 e、 g.www.myblog.com和www.mybusiness.com 如何在vps中实现virtualhost,以便两个网站都可以使用端口80 我在别的地方问了这个问题,有人建议我看一下:和 它们看起来有点弯曲。我正在努力寻找是否有一种直接的方法来实现这一目标。谢谢 另外,忘了提到我的vps是一个Ubuntu 14.04的盒子。你需要一个反向代理。我们使用nginx和haproxy。它们都工作得很好,并且很容易从docker容器中运行。

我在vps中的两个docker容器中运行两个网站。 e、 g.www.myblog.com和www.mybusiness.com

如何在vps中实现virtualhost,以便两个网站都可以使用端口80

我在别的地方问了这个问题,有人建议我看一下:和 它们看起来有点弯曲。我正在努力寻找是否有一种直接的方法来实现这一目标。谢谢


另外,忘了提到我的vps是一个Ubuntu 14.04的盒子。

你需要一个反向代理。我们使用nginx和haproxy。它们都工作得很好,并且很容易从docker容器中运行。运行整个设置的一个好方法是使用docker compose(以前的fig)创建两个没有外部可见端口的网站容器,并使用一个haproxy容器,其中包含指向两个网站容器的链接。然后,整个组合只向网络公开一个端口(80),haproxy容器根据请求的主机名将流量转发给一个或另一个容器

---
proxy:
  build: proxy
  ports:
    - "80:80"
  links:
    - blog
    - work

blog:
  build: blog

work:
  build: work
然后是haproxy配置,例如

global
    log         127.0.0.1 local0
    maxconn     2000
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    log                     global
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout connect         5000s
    timeout client          1200000s
    timeout server          1200000s

### HTTP frontend

frontend http_proxy
    mode http
    bind *:80
    option forwardfor except 127.0.0.0/8
    option httplog
    option http-server-close

    acl blog_url hdr_beg(host) myblog
    use_backend blog if blog_url

    acl work_url hdr_beg(host) mybusiness
    use_backend work if work_url

### HTTP backends

backend blog
    mode http
    server blog1 blog:80 check

backend work
    mode http
    server work1 work:80 check
看看这个项目

使用Docker gen的Docker容器的自动nginx代理

这是代理docker容器的最简单方法。无需在每次重新启动容器或启动新容器时编辑代理配置文件。所有这些都会自动为您生成nginx的反向代理配置,并在启动和停止容器时重新加载nginx

用法 要运行它,请执行以下操作:

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock \
jwilder/nginx-proxy
然后启动您希望使用env var VIRTUAL_HOST=subdomain.youdomain.com代理的任何容器

$ docker run -e VIRTUAL_HOST=foo.bar.com  ...
如果您的DNS设置为将foo.bar.com转发到运行nginx代理的主机,则请求将路由到设置了VIRTUAL_host env var的容器

多端口 如果容器公开多个端口,nginx proxy将默认为在端口80上运行的服务。如果需要指定不同的端口,可以设置虚拟端口env var以选择不同的端口。如果您的容器仅公开一个端口,并且它具有虚拟主机环境变量集,则将选择该端口


棘手的我想你可以看看haproxy。您可以将其设置为80,并根据url模式匹配将后端流量转发给您的web服务器。我不认为虚拟主机是apache意义上的。如果您想简单地创建一个ApacheWeb服务器,您可以将2个URL重定向到您的web服务器。无论哪种方式,您都需要创建第三个docker容器来执行代理/重定向。docker-gen非常棒,Kristijan!我用它写了一篇关于这个主题的教程,有两个应用程序需要通信,但app1无法到达app2(在容器内)。docker compose的虚拟主机配置您能否考虑TLS(https)扩展答案,可能是使用?