Reverse proxying with dockerized nginx

I’m building a multi-container application with Docker. The full environment is on github should you wish to recreate it, but I include what I believe to be the relevant parts below for convenience. My nginx Dockerfile is like so:

FROM ubuntu:14.04
MAINTAINER Garry Cairns
ENV REFRESHED_AT 2015-02-11

# get the nginx package and set it up
RUN ["apt-get", "update"]
RUN ["apt-get", "-y", "install", "nginx"]

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
VOLUME ["/var/cache/nginx"]
EXPOSE 80 443

# load nginx conf
ADD ./site.conf /etc/nginx/sites-available/correspondence
RUN ["ln", "-s", "/etc/nginx/sites-available/correspondence", "/etc/nginx/sites-enabled/correspondence"]

CMD ["nginx", "-g", "daemon off;"]

And the site.conf file being added to sites-enabled looks like this:

  • kali linux docker image build script failed - syntax error near unexpected token `;&' [closed]
  • How to bind a port when using docker-py to create a service? [duplicate]
  • Invalid Message Format on Postgresql using Docker
  • Escaping Docker attach one started from bash script
  • empty PATH returned when entering new Docker image
  • Docker inside Docker (without command line) [duplicate]
  • # see http://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf#comment730384_577370
    upstream api {
        server api_1:8000;
    }
    
    server {
        location / {
            proxy_pass       http://api;
        }
    }
    

    The nginx configuration there seems similar enough to that found in this answer that I feel the approach should be okay. But when I visit localhost (no port) on my machine or my domain in production I just get the nginx welcome page, no forwarding is going on.

    I can connect to the running nginx container and wget correct results from the app container using http://api_1:8000 so I’m pretty sure the problem is in my nginx setup rather than my Docker one, but I can’t puzzle this one out. Has anyone else solved this problem in the past?

  • chef-container + chef-vault
  • How to sandbox Ansible playbooks for high availability Glassfish application on AWS
  • Why doesn't docker run support using --rm and -d at the same time?
  • Codeception web driver (Selenium on Docker) tests not working as unable to see other containers (works on my dev machine though?!)
  • Getting custom workitem handlers into jBPM 6 docker images
  • Gitlab CI Artifacts Permanently Moved Error 301?
  • One Solution collect form web for “Reverse proxying with dockerized nginx”

    Finally figured this out. I needed to delete the default enabled site installed with nginx. My Dockerfile now reads:

    FROM ubuntu:14.04
    MAINTAINER Garry Cairns
    ENV REFRESHED_AT 2015-02-11
    
    # get the nginx package and set it up
    RUN ["apt-get", "update"]
    RUN ["apt-get", "-y", "install", "nginx"]
    
    # forward request and error logs to docker log collector
    RUN ln -sf /dev/stdout /var/log/nginx/access.log
    RUN ln -sf /dev/stderr /var/log/nginx/error.log
    VOLUME ["/var/cache/nginx"]
    EXPOSE 80 443
    
    # load nginx conf
    ADD ./site.conf /etc/nginx/sites-available/correspondence
    RUN ["ln", "-s", "/etc/nginx/sites-available/correspondence", "/etc/nginx/sites-enabled/correspondence"]
    RUN ["rm", "-rf", "/etc/nginx/sites-available/default"]
    CMD ["nginx", "-g", "daemon off;"]
    

    And all is well in the world.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.