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

Posted

技术标签:

【中文标题】我的网站在 docker 容器中运行,如何实现虚拟主机?【英文标题】:My websites running in docker containers, how to implement virtual host? 【发布时间】:2015-06-13 16:20:04 【问题描述】:

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

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

我在其他地方问过这个问题,并被建议看一下:https://github.com/hipache/hipache 和 https://www.tutum.co/ 它们看起来有点弯曲。我正在尝试寻找是否有一种直接的方法来实现这一目标。谢谢!

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

【问题讨论】:

棘手。我想你可能会看看 haproxy。您可以将其放在 80 上,并根据 url 模式匹配将后端流量转发到您的 Web 服务器。我不认为 apache 意义上的虚拟主机。如果您想简单地创建一个 apache Web 服务器,您可以将 2 个 url 重定向到您的 Web 服务器。无论哪种方式,您都需要创建第三个 docker 容器来执行代理/重定向。 【参考方案1】:

看看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

然后使用环境变量 VIRTUAL_HOST=subdomain.youdomain.com 启动您想要代理的任何容器

$ docker run -e VIRTUAL_HOST=foo.bar.com  ...

如果您的 DNS 设置为将 foo.bar.com 转发到运行 nginx-proxy 的主机,则请求将被路由到设置了 VIRTUAL_HOST env var 的容器。

多个端口

如果你的容器暴露了多个端口,nginx-proxy 将默认运行在端口 80 上的服务。如果你需要指定不同的端口,你可以设置一个 VIRTUAL_PORT 环境变量来选择不同的端口。如果您的容器仅公开一个端口并且它设置了 VIRTUAL_HOST 环境变量,则将选择该端口。

【讨论】:

Docker-gen 很棒 Kristijan !我用它写了一篇关于这个主题的教程tech.mybuilder.com/virtual-hosts-with-docker 有两个app需要通信,但是app1无法到达app2(容器内)。 docker-compose 的虚拟主机配置github.com/jwilder/nginx-proxy/issues/253 能否请您考虑 TLS (https) 来扩展答案,也许是 Let's encrypt?【参考方案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

【讨论】:

以上是关于我的网站在 docker 容器中运行,如何实现虚拟主机?的主要内容,如果未能解决你的问题,请参考以下文章

如何在生产中扩展Docker容器

如何将WebLogic服务器运行于Docker容器中

Docker 介绍

docker容器中运行windows虚拟机

Proxmox VE LXC容器上运行Docker

docker 怎么把宿主机的文件拷贝到运行的容器中