Docker + Nginx

_images/image_nginx.png

Date: 2016-06-24

This is a repository for hosting a configurable docker + nginx container running on CentOS 7. I use this container for hosting my blog with the sphinx-bootstrap container:

https://jaypjohnson.com

Docker Hub Image: jayjohnson/nginx

Overview

I built this container so I could have an extensible nginx container that could utilize a mounted volume for static files and ssl certs. By default this container will start by installing the necessary configuration files, install a robots.txt file, and then start a backgrounded nginx process.

Environment Variables

Here are the available environment variables that are used by the start_container.sh script as the container starts up. By using environment variables to drive one-time install/configuration behaviors this container can be used with docker compose for other technologies that I want to use with nginx. I wrote this blog post if you want to learn more.

Variable Name Purpose Default Value
ENV_BASE_NGINX_CONFIG Provide a path to a base nginx.conf /root/containerfiles/base_nginx.conf
ENV_DERIVED_NGINX_CONFIG Provide a path to a derived nginx.conf /root/containerfiles/derived_nginx.conf
ENV_DEFAULT_ROOT_VOLUME Path to shared volume for static html, js, css, images, and assets /usr/share/nginx/html

Getting Started

By default this container exposes ports: 80 and 443 from the container to the host OS. For development purposes, I usually have this container using host ports 82 and 444 to prevent collisions with existing apache or nginx services.

Building

To build the container you can run build.sh that automatically sources the properties.sh file:

$ ./build.sh
Building new Docker image(docker.io/jayjohnson/nginx)
Sending build context to Docker daemon 37.38 kB
Step 1 : FROM centos:7
 ---> 904d6c400333

...

---> 8bfb9d8ca828
Successfully built 8bfb9d8ca828
$

Here is the full the command:

docker build --rm -t <your name>/nginx --build-arg registry=docker.io --build-arg maintainer=<your name> --build-arg imagename=nginx .

Start the Container

To start the container run:

$ ./start.sh
Starting new Docker image(docker.io/jayjohnson/nginx)
ad836abf4f30eb629d501b4c1cf5b9709001293dab4e3e6b886639bd00ab4d33
$

Looking into the start.sh you can see that there are quite a few defaults taken from the properties.sh file:

$ cat start.sh
#!/bin/bash

source ./properties.sh .

echo "Starting new Docker image($registry/$maintainer/$imagename)"
docker run --name=$imagename \
            -e ENV_BASE_NGINX_CONFIG=$ENV_BASE_NGINX_CONFIG \
            -e ENV_DERIVED_NGINX_CONFIG=$ENV_DERIVED_NGINX_CONFIG \
            -e ENV_DEFAULT_ROOT_VOLUME=$ENV_DEFAULT_ROOT_VOLUME \
            -v $EXT_MOUNTED_VOLUME:$INT_MOUNTED_VOLUME \
            -p 82:80 \
            -p 444:443 \
            -d $maintainer/$imagename

exit 0
$

Test the Container

To test the container is working try wget-ting the index.html file and confirm there is a returned 200 response status code:

$ wget http://localhost:82/
--2016-06-24 13:29:38--  http://localhost:82/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:82... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13534 (13K) [text/html]
Saving to: ‘index.html’

index.html               100%[====================================>]  13.22K  --.-KB/s   in 0s

2016-06-24 13:29:38 (264 MB/s) - ‘index.html’ saved [13534/13534]
$

Note

The example above is using port 82 for development and documentation purposes instead of port 80

Stop the Container

To stop the container run:

$ ./stop.sh
Stopping Docker image(docker.io/jayjohnson/nginx)
nginx
$

Or run the command:

$ docker stop nginx

Licenses

This repository is licensed under the MIT License.

The nginx license: http://nginx.org/LICENSE

Thanks for reading,

Jay

Want to learn more?