Close modal

Blog Post

Docker I - Serving a simple static site from NGINX

Thu 27 October 2016

The Basics

For this document we'll run through creating a docker image by specifying our Dockerfile and then buolding it. Our starting point is a minimal docker image for Debian Jessie by monsantoco. (Perhaps later we'll cover Alpine, but Debian is definitely more compatible (as it is based on glibc rather than musl), and I find apt easier to work & demonstrate with.


Make sure docker is installed, configuration of it is outside the scope of this article but usually easy from APT or YUM sources.

Create your directory and files

First create the basic structure.

[root@syd2 ~]# mkdir mydockerbuild
[root@syd2 ~]# cd mydockerbuild
[root@syd2 mydockerbuild]# touch Dockerfile
[root@syd2 mydockerbuild]# mkdir test_site
vim test_site/index.html

Enter the following sample text if you like:

<!DOCTYPE html>
<html lang="en">
        <meta charset="utf-8">
        <title>Hello World</title>
        <h1>Hello World</h1>
            We're a Docker guest..

You now have the basics of what you need.

[root@syd2 mydockerbuild]# ls -R
Dockerfile  MY_SITE

[root@syd2 mydockerbuild]# ls -lRh
total 8.0K
-rw-r--r-- 1 root root  793 Oct 27 02:19 Dockerfile
drwxr-xr-x 2 root root 4.0K Oct 27 02:24 MY_SITE

total 4.0K
-rw-r--r-- 1 root root 242 Oct 27 02:24 index.html

The Docker File

Getting a minimal NGINX container (for static sites)

Here we use dotdeb to get the latest and also greatest version of NGINX easily for apt/deb.

::: dockerfile
FROM monsantoco/min-jessie:latest
RUN apt-get update && \
    apt-get install -y --no-install-recommends wget && \
    echo "deb jessie all" >> /etc/apt/sources.list && \
    echo "deb-src jessie all" >> /etc/apt/sources.list && \
    wget && \
    apt-key add dotdeb.gpg && \
    apt-get update && \
    apt-get install -y --no-install-recommends nginx && \
    rm -rf /var/lib/apt/lists/* && \
    echo "daemon off;" >> /etc/nginx/nginx.conf && \
    apt-get autoclean -y && \
    apt-get autoremove -y && \
    rm -rf /usr/share/locale/* && \
    rm -rf /var/cache/debconf/*-old && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /usr/share/doc/*

ADD MY_SITE /var/www/html/
Now we can build the image
[root@syd2 mydockerbuild]# docker build -no-cache -t MY_SERVER .
Successfully built 109945347e1d
[root@syd2 mydockerbuild]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
MY_SERVER                           latest              109945347e1d        27 minutes ago      144.3 MB

Running Your Image

Now let's run the image.

[root@syd2 mydockerbuild]# docker run -d -p 80:80 MY_SERVER nginx

Verify that it's running successfully.

[root@syd2 mydockerbuild]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
65fd3c6f5356        MY_SERVER       "nginx"             4 minutes ago      Up 1 minute>80/tcp   stupefied_lumiere

If you wish to connect to it, attach a bash as so.

[root@syd2 mydockerbuild]# docker exec -it 65fd3c6f5356eeb3c734781983c367e739b56678c12b6a87c7602200ed9cb409 /bin/bash
root@65fd3c6f5356:/# ps -x
    1 ?        Ss     0:00 nginx: master process nginx
   11 ?        Ss     0:00 /bin/bash
   20 ?        R+     0:00 ps -x

So you can see that indeed nginx is running. We haven't done any fancy-pants routing and reverse-proxy with nginx yet but if you connect to the IP address of your docker host (on port 80) you can see that it's serving up the content!.

[root@syd2 mydockerbuild]# lynx localhost:80

Low and behold:

                                                           Hello World
                             Hello World

   We're a Docker guest..

Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to
  Arrow keys: Up and Down to move.  Right to follow a link; Left to go
 H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=histo

Comments !