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

时间:2015-04-08 15:40:20

标签: web docker virtualhost

我在vps中分别在两个docker容器中运行两个网站。 例如www.myblog.com和www.mybusiness.com

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

我在其他地方问过这个问题,并建议您查看:https://github.com/hipache/hipachehttps://www.tutum.co/ 他们看起来有点弯曲。我试图找到是否有一种直接的方法来实现这一点。谢谢!

另外,忘了提及我的vps是Ubuntu 14.04盒子。

2 个答案:

答案 0 :(得分:28)

看看jwilder/nginx-proxy项目。

  

使用docker-gen

为Docker容器自动化nginx代理

这是代理Docker容器的最简单方法。每次重新启动容器或启动新容器时,您都不需要编辑代理配置文件。这一切都由docker-gen自动发生,它为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-proxy的主机,则该请求将路由到具有VIRTUAL_HOST env var set的容器​​。

     

多个端口

     

如果您的容器公开多个端口,则nginx-proxy将默认为在端口80上运行的服务。如果您需要指定其他端口,则可以设置VIRTUAL_PORT env var以选择其他端口。如果您的容器只暴露一个端口并且它具有VIRTUAL_HOST env var set,则将选择该端口。

答案 1 :(得分:2)

您需要一个反向代理。我们使用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