Develop and deploy an app with Fig and Orchard
Fig makes development environments easy and repeatable. In this post we’re going to demonstrate how, with minimal changes to your configuration, you can deploy the same environment to Orchard.
First of all, get your app running on your local machine with Fig. If you don’t have an app to hand, try the Django example.
You’ll also need to sign up for Orchard and install the command-line-client.
Configuring for deployment
A few things need to change when using Fig with a remote Docker daemon. Create a separate copy of your fig.yml
called something like fig-production.yml
. Here’s what it should look like for the Django example:
db:
image: orchardup/postgresql
web:
build: .
command: gunicorn -b 0.0.0.0:8000 figexample.wsgi:application
ports:
- "80:8000"
links:
- db
You’ll also need to add gunicorn
to requirements.txt
.
If you’re deploying your own app, here are the important changes:
- You can’t mount directories on your local machine inside containers—for example, if you’re mounting your code into a volume so you can change it without rebuilding the image. Remove any volumes entries like
.:/code
. - You shouldn’t be opening up sensitive services like your database to the world. Use expose instead of ports for services that only need to be visible to linked containers—or, if the image for the service has already exposed the port, you can remove the ports entry entirely.
- If you’re deploying a web app, remember to map port 80 to the appropriate container.
Start a host
With Orchard, getting a remote host is ridiculously simple:
$ orchard hosts create
Default host running at 123.45.67.8
The Docker daemon running on that host isn’t accessible to just anyone. You can communicate it with it via orchard docker
, or by opening up a persistent tunnel with orchard proxy
, which we’ll start in the background:
$ orchard proxy &; sleep 2
[1] 15344
Started proxy. Use it by setting your Docker host:
export DOCKER_HOST=unix:///tmp/orchard-358146677/orchard.sock
Point Fig at Orchard
Now we just need to tell Fig to use your Orchard host and production fig file:
$ export FIG_FILE=fig-production.yml
$ export DOCKER_HOST=unix:///tmp/orchard-358146677/orchard.sock
And we’re ready to go.
$ fig up -d
Fig will use the Orchard host to build and start each of your services. When it’s all done, you should be able to access your app at the host’s IP address.
$ orchard hosts
NAME SIZE IP
default 512M 123.45.67.8
$ curl 123.45.67.8
...HTTP response...
If it worked, your services will be running:
$ fig ps
Name Command State Ports
-----------------------------------------------------------------------
figdjango_db_1 /usr/local/bin/run Up
figdjango_web_1 python manage.py runserver ... Up 80->8000/tcp
If anything goes wrong, you can tail the logs of your containers:
$ fig logs
Deploying changes
When you make changes to your app, you can redeploy thus:
$ fig build
$ fig up -d
To save time, you can specify the service(s) that have changed:
$ fig build web
$ fig up -d web
If a service you redeploy has dependent services linked to it, you’ll need to restart them too:
$ fig build db
$ fig up -d db web
When you’re done, shut down the proxy:
$ kill %1
Going further
As we’ve seen, Fig gives you enough to get a simple app running remotely. Taking it a step beyond, CenturyLink Labs have written some great posts on running and orchestrating more complex applications with Fig.
Auto-Loadbalancing Docker with Fig, HAProxy and Serf: Uses a Fig file and a container running Serf to load-balance multiple web containers behind an HAProxy container.
Building Complex Apps for Docker on CoreOS and Fig: Here, they use a tool called fig2coreos to convert a fig.yml
into systemd config files, suitable for deployment to a CoreOS cluster.
Exciting stuff, and there’s lots more to explore.