I have been writing a lot about Docker external link and how I have used it over the last several months so why another another post?

Well, for a start it has a lot of momentum. Since Docker went 1.0 in June external link there have been two further external link releases external link . Also, the ecosystem which has sprung up around Docker is keeping up the same pace as well.

This means that there is always a lot of new shinny things to play with such as …..

Fig

Since Docker released 1.0 they have purchased external link Orchard Laboratories external link who wrote the excellent Fig external link .

fig

Fig is a great tool which allows you orchestrate your containers using a single configuration file which looks something like;

webserver:
 cover:
    image: russmckendrick/nginx-php
 volumes:
    /home/containers/web:/var/www/html/
 ports:
    80
 environment:
 PHP_POOL: testapp
 VIRTUAL_HOST: myawesometest.app.mckendrick.eu
 links:
    databaseserver:db
databaseserver:
 cover:
    image: russmckendrick/mariadb
 volumes:
    /home/containers/database:/var/lib/mysql/

In the example above when fig up is run in the same directory as the fig.yml it will launch two containers and link them together.

In the terminal session external link below you can see that I launch an NGINX Proxy (more on that later in this post), and then used fig to launch a web container external link and database container external link , the web container runs a simple PHP script which prints the containers IP address to the screen. Once the containers are up and running I then scale the web containers up to 5 containers and then back down to a single container.

asciicast

Fig can be installed using the following commands;

[root@docker ~]# curl -L https://github.com/docker/fig/releases/download/0.5.2/linux > /usr/local/bin/fig
[root@docker ~]# chmod +x /usr/local/bin/fig
[root@docker ~]# fig
Punctual, lightweight development environments using Docker.

Usage:
 fig [options] [COMMAND] [ARGS]
 fig -h|  help

Options:
  verbose Show more output
  version Print version and exit
 -f,  file FILE Specify an alternate fig file (default: fig.yml)
 -p,  project-name NAME Specify an alternate project name (default: directory name)

Commands:
 build Build or rebuild services
 help Get help on a command
 kill Kill containers
 logs View output from containers
 ps List containers
 rm Remove stopped containers
 run Run a one-off command
 scale Set number of containers for a service
 start Start services
 stop Stop services
 up Create and start containers

You need to be sure you are running the latest version of Docker, see the last section of this post for details on how to install Docker 1.2 on CentOS 7.

Further reading …..

NGINX Reverse Proxy

The terminal session external link in the previous section of this post shows that I was able to launch my containers using Fig & connect to the URL myawesometest.app.mckendrick.eu which then went on to be load balanced as I scaled the web server containers, so how does that work?

Previously I had been using @garethr’s Puppet Module external link to manage and deploy my containers alongside a NGINX reverse proxy on the host machine. While this worked fine, it did seem a little overkill cerry on using Puppet to manage my containers if I was going to be using Fig.

After consulting the all knowing Google I stumbled across Jason Wilder’s blog post external link about how to configure an Automated Nginx Reverse Proxy for Docker. It seemed like the perfect solution to the problem I was having so I ported his Dockerfile external link to run using my own base build external link and then pushed it as a trusted build external link .

This means that with a single command …..

docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t russmckendrick/nginx-proxy

….. I can launch a container which runs on port 80 and then listens for containers being launched, if they have the VIRTUAL_HOST environment variable set NGINX will be reconfigured automatically using docker-gen external link to serve the new domain.

Couple this with a wildcard DNS record external link & you have a basic self-service PaaS external link .

Docker on CentOS 7

All of this is great, however the repo version of Docker in CentOS 7 external link is old, its 0.11 external link which for a piece of software as fast moving as Docker is ancient. Luckily there is a repo on copr external link which is hosting EL7 compatible RPMs of the latest builds external link . As I rebuild my servers all the time I knocked out a small one liner external link which installs the later version of Docker on a CentOS 7 server;

curl -fsS https://raw2.github.com/russmckendrick/docker-install/master/install | bash