我的网站 运行 在 docker 容器中,如何实现虚拟主机?
My websites running in docker containers, how to implement virtual host?
我 运行 两个网站在两个 docker 容器中,分别在一个 vps 中。
例如www.myblog.com 和 www.mybusiness.com
如何在 vps 中实现 virtualhost,使两个网站都可以使用端口 80。
我在别处问过这个问题,有人建议看一下:https://github.com/hipache/hipache and https://www.tutum.co/
它们看起来有点弯曲。我正在尝试寻找是否有一种直接的方法来实现这一目标。谢谢!
另外,忘了说我的vps是一个Ubuntu14.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
看看 jwilder/nginx-proxy 项目。
Automated nginx proxy for Docker containers using docker-gen
这是代理 docker 容器的最简单方法。您不需要在每次重新启动容器或启动新容器时都编辑代理配置文件。这一切都是由 docker-gen 自动为你发生的,它为 nginx 生成反向代理配置,并在容器启动和停止时重新加载 nginx。
Usage
To run it:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock \
jwilder/nginx-proxy
Then start any containers you want proxied with an env var VIRTUAL_HOST=subdomain.youdomain.com
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
Provided your DNS is setup to forward foo.bar.com to the a host running nginx-proxy, the request will be routed to a container with the VIRTUAL_HOST env var set.
Multiple Ports
If your container exposes multiple ports, nginx-proxy will default to the service running on port 80. If you need to specify a different port, you can set a VIRTUAL_PORT env var to select a different one. If your container only exposes one port and it has a VIRTUAL_HOST env var set, that port will be selected.
我 运行 两个网站在两个 docker 容器中,分别在一个 vps 中。 例如www.myblog.com 和 www.mybusiness.com
如何在 vps 中实现 virtualhost,使两个网站都可以使用端口 80。
我在别处问过这个问题,有人建议看一下:https://github.com/hipache/hipache and https://www.tutum.co/ 它们看起来有点弯曲。我正在尝试寻找是否有一种直接的方法来实现这一目标。谢谢!
另外,忘了说我的vps是一个Ubuntu14.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
看看 jwilder/nginx-proxy 项目。
Automated nginx proxy for Docker containers using docker-gen
这是代理 docker 容器的最简单方法。您不需要在每次重新启动容器或启动新容器时都编辑代理配置文件。这一切都是由 docker-gen 自动为你发生的,它为 nginx 生成反向代理配置,并在容器启动和停止时重新加载 nginx。
Usage
To run it:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock \ jwilder/nginx-proxy
Then start any containers you want proxied with an env var VIRTUAL_HOST=subdomain.youdomain.com
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
Provided your DNS is setup to forward foo.bar.com to the a host running nginx-proxy, the request will be routed to a container with the VIRTUAL_HOST env var set.
Multiple Ports
If your container exposes multiple ports, nginx-proxy will default to the service running on port 80. If you need to specify a different port, you can set a VIRTUAL_PORT env var to select a different one. If your container only exposes one port and it has a VIRTUAL_HOST env var set, that port will be selected.