Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

My websites running in docker containers, how to implement virtual host?

I am running two websites in two docker containers respectively in a vps. e.g. www.myblog.com and www.mybusiness.com

How can I implement virtualhost in the vps so that the two websites can both use port 80.

I asked this question somewhere else, and was suggested to take a look at: https://github.com/hipache/hipache and https://www.tutum.co/ They look a bit curving. I am trying to find if there is a straightforward way to achieve that. Thanks!

In addition, forgot to mention my vps is a Ubuntu 14.04 box.

like image 713
Rob L Avatar asked Apr 08 '15 15:04

Rob L


2 Answers

Take a look at jwilder/nginx-proxy project.

Automated nginx proxy for Docker containers using docker-gen

It's the easiest way to proxy your docker containers. You don't need to edit the proxy config file every time you restart a container or start a new one. It all happens automatically for you by docker-gen which generates reverse proxy configs for nginx and reloads nginx when containers are started and stopped.

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.

like image 185
krebernisak Avatar answered Oct 25 '22 23:10

krebernisak


You need a reverse proxy. We use nginx and haproxy. They both work well, and are easy to run from a docker container. A nice way to run the entire setup would be to use docker-compose (formerly fig) to create the two website containers with no externally visible ports, and use a, say, haproxy container with links to both website containers. Then the entire combination exposes exactly one port (80) to the network, and the haproxy container forwards traffic to one or the other container based on the hostname of the request.

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

blog:
  build: blog

work:
  build: work

Then a haproxy config such as,

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
like image 39
seanmcl Avatar answered Oct 25 '22 22:10

seanmcl