Jacc - Just Another Cloud in the Cloud
Jacc targets the following user case:
- web applications running behind a load balancing proxy
- efficient hosting of several compentents, typically a cluser of application server, caching servers etc. A database cluster can also be hosted or use a DBaaS with backups etc. pre-configured
- ready for production use with the redundance and reliability this requires
Jacc is NOT a Heroku type architeture with support for remote deployment. You are required to login to the server that hosts the web applications.
Jacc is a private cloud built from standard components such as docker.io, hipache and redis-dns. Docker is a linux containers architecture and hipache a high perforamnce web proxy. redis-dns provides an internal DNS between containers. Docker and hipache are provided by the team behind the dotCloud service.
The goal is to provide an architecture suitable for hosting a variety of components on a limited amount of server. Examples of components could be web applications build in PHP/Java/NodeJS/Ruby/Python etc. It could also include databases, caching systems, queue management etc. The limit is really only what's runs on the Linux flavours that docker supports.
Installation
Pre-requiresites:
- docker version 0.7.1
- redis
- NodeJS (preferabley managed with nvm)
- Python
- make - for development only
Installation:
- Install with
sudo npm install jacc -g
- Install redis:
sudo apt-get install -y redis-server
- Then install supervisord, either using a linux package manager or simply with python package manager:
sudo apt-get install -y supervisor
(or withsudo pip install supervisor
but then you need to setup supervisor as a service yourself) - Locate the jacc installation in node_modules (typically in /usr/lib/node_modules/jacc)
- Update the IP adress in the file
JACC_HOME/etc/redis-dns-config.json
with the IP adress of the docker bridge (doifconfig|grep -A 1 docker
). - Update the
command
section in the filesJACC_HOME/etc/supervisor/*.conf
with the path to the jacc installation - Copy the hipache and redis-dns config files for supervisor and restart
sudo cp JACC_HOME/etc/supervisor/*.conf /etc/supervisor/conf.d/ && sudo supervisorctl reload
- Check that hipache and redis-dns started with
sudo supervisorctl status
Setup containers:
- Do
jacc add <IMAGE_ID> <URL> <internal port> <DNS>
followed by./jacc.sh update
to add an image and start a container. hipache and redis-dns configuration will be updated at the same time
- STARTING CONTAINERS HAVE NOT BEEN IMPLEMENTED YET, START MANUALLY WITH
docker run -d -dns=IP IMAGE_ID
jacc list
shows the configuration andjacc status
the running containers
docker configuration:
docker need to be configured to open up the HTTP API. The start script needs to include this flag DOCKER_OPTS=-H 127.0.0.1:4243
.
For ubuntu, this is changed in /etc/init/docker.conf
. Now the docker command line tool needs the flag -H=tcp://127.0.0.1:4243
. Create
an alias for simplcity: alias docker='docker -H=tcp://127.0.0.1:4243'
. Place this in your .profile
etc.
Development
NOTE: The overall design principle for Jacc is to re-use what's already out there. Don't re-invent the wheel.
An easy way to get started quickly is to create a virtual machine using Vagrant. This repo has everything you need: https://github.com/colmsjo/docker. You can of course setup docker and the other required modules yourself.
Run make install
to install everything in the current directory.
Jacc comes with a test suite. The first step when developing is to make sure that the test runs without any erros.
A number of environment variables needs to be set. You can for instance use the ./test/setenv.template
file showed below:
export JACC_TEST_CONTAINERID=$abcdefghijkl
export JACC_TEST_URL="app1.jacc.local"
export JACC_TEST_PORT="80"
export JACC_TEST_DNS="app1.local"
Then do source ./test/setenv
followed by make
to kickoff the test suite.
Troubleshooting
- 'No running containers with ID: XXX' - This is most likely caused by a problem connecting to docker. Does
docker ps
andcurl http://localhost:4243/containers/json
show containers?