The world of on-premise private PaaSes is changing rapidly. A few years ago, we were building on on-premise private PaaSes based upon the existing infrastructure and using Puppet as an automation tool to quickly provision new application servers. We provided a self-service portal where development teams could get any type of server in any type of environment running within minutes. We created a virtual server for each application to keep it manageable, which of course is quite resource intensive.
Since June 9th, Docker has been declared production ready, so this opens the option of provisioning light weight containers to the teams instead of full virtual machine. This will increase the speed of provisioning even further while reducing the cost of creating a platform and minimising resource consumption.
To illustrate how easy life is becoming, we are going to deploy an original CloudFoundry node.js application to Docker on a CoreOS cluster. This hands-on experiment is based on MacOS, Vagrant and VirtualBox.
Step 1. Installing etcdctl and fleetctl
Before you start, you need to install etcdctl and fleetctl on your host. etcd is a nifty distributed key-value store while fleet manages the deployment of (Docker) services to a CoreOS cluster.
$ brew install go etcdctl
$ git clone <a href="https://github.com/coreos/fleet.git">https://github.com/coreos/fleet.git</a>
$ cd fleet && ./build && mv bin/fleetctl /usr/local/bin
Step 2. Install the Deis Command Line Client
To control the PaaS you need to install the Deis command line client:
$ brew install python
$ sudo pip install deis
Step 3. Build the platform
Deis provides all the facilities for building, deployment and managing applications.
$ git clone <a href="https://github.com/deis/deis.git">https://github.com/deis/deis.git</a>
$ cd deis
$ vagrant up
$ ssh-add ~/.vagrant.d/insecure_private_key
$ export DOCKER_HOST=tcp://172.17.8.100:4243
$ export FLEETCTL_TUNNEL=172.17.8.100
$ make pull
Step 4. Start the platform
Now all is set to start the platform:
$ make run
After this run has completed, you can see that the 7 components in the Deis Architecture have been started using the list-units command: The builder, the cache, the controller, the database, the logger, the registry and the router. This architecture looks quite similar to the architecture of CloudFoundry.
$ fleetctl list-units
UNIT | STATE | LOAD | ACTIVE | SUB | DESC | MACHINE |
deis-builder.service | launched | loaded | active | running | deis-builder | 79874bde…/172.17.8.100 |
deis-cache.service | launched | loaded | active | running | deis-cache | 79874bde…/172.17.8.100 |
deis-controller.service | launched | loaded | active | running | deis-controller | 79874bde…/172.17.8.100 |
deis-database.service | launched | loaded | active | running | deis-database | 79874bde…/172.17.8.100 |
deis-logger.service | launched | loaded | active | running | deis-logger | 79874bde…/172.17.8.100 |
deis-registry.service | launched | loaded | active | running | deis-registry | 79874bde…/172.17.8.100 |
deis-router.1.service | launched | loaded | active | running | deis-router | 79874bde…/172.17.8.100 |
Alternatively, you can inspect the result by looking inside the virtual machine:
$ vagrant ssh -c "docker ps"
Now we have our platform running, we can start using it!
Step 5. Register a new user to Deis and add the public ssh key
$ deis register 172.17.8.100:8000 \
--username=mark \
--password=goddesses \
--email=mark.van.holsteijn@..com
$ deis keys:add ~/.ssh/id_rsa.pub
Step 6. Create a Cluster
Create a application cluster under the domain ‘dev.172.17.8.100.xip.io’. The –hosts specifies all hosts in the cluster: the only available host at this moment in the cluster is 172.17.8.100.
$ deis clusters:create dev dev.172.17.8.100.xip.io \
--hosts=172.17.8.100 \
--auth=~/.vagrant.d/insecure_private_key
Step 7. Get the app
We created a simple but effective node.js application that show you what happens when you scale or push a new version of the application.
$ git clone git@github.com:mvanholsteijn/sample_nodejs_cf.git
$ deis apps:create appmon --cluster=dev
$ deis config:set RELEASE=deis-v1
$ git push deis master
Step 8. open your application
Voila! Your application is running. Now click on start monitoring.
$ deis apps:open
you should see something like this:
Step 9. scaling your application
To see scaling in action, type the following command:
$ deis ps:scale web=4
It will start 3 new containers which will show up in the list.
Step 10. upgrading your application
Now make a change to the application, for instance change the message to ‘Greetings from Deis release’ and push your change:
$ git commit -a -m "Message changed"
$ git push deis master
After a while you will see the following on your monitor!
Step 11. Looking on CoreOS
You can use fleetctl again to look at the new services that have been added to the platform!
$ fleetctl list-units
UNIT | STATE | LOAD | ACTIVE | SUB | DESC | MACHINE |
app-mon_v7.web.1-announce.service | launched | loaded | active | running | app-mon_v7.web.1 announce | 79874bde…/172.17.8.100 |
app-mon_v7.web.1-log.service | launched | loaded | active | running | app-mon_v7.web.1 log | 79874bde…/172.17.8.100 |
app-mon_v7.web.1.service | launched | loaded | active | running | app-mon_v7.web.1 | 79874bde…/172.17.8.100 |
app-mon_v7.web.2-announce.service | launched | loaded | active | running | app-mon_v7.web.2 announce | 79874bde…/172.17.8.100 |
app-mon_v7.web.2-log.service | launched | loaded | active | running | app-mon_v7.web.2 log | 79874bde…/172.17.8.100 |
app-mon_v7.web.2.service | launched | loaded | active | running | app-mon_v7.web.2 | 79874bde…/172.17.8.100 |
app-mon_v7.web.3-announce.service | launched | loaded | active | running | app-mon_v7.web.3 announce | 79874bde…/172.17.8.100 |
app-mon_v7.web.3-log.service | launched | loaded | active | running | app-mon_v7.web.3 log | 79874bde…/172.17.8.100 |
app-mon_v7.web.3.service | launched | loaded | active | running | app-mon_v7.web.3 | 79874bde…/172.17.8.100 |
app-mon_v7.web.4-announce.service | launched | loaded | active | running | app-mon_v7.web.4 announce | 79874bde…/172.17.8.100 |
app-mon_v7.web.4-log.service | launched | loaded | active | running | app-mon_v7.web.4 log | 79874bde…/172.17.8.100 |
app-mon_v7.web.4.service | launched | loaded | active | running | app-mon_v7.web.4 | 79874bde…/172.17.8.100 |
deis-builder.service | launched | loaded | active | running | deis-builder | 79874bde…/172.17.8.100 |
deis-cache.service | launched | loaded | active | running | deis-cache | 79874bde…/172.17.8.100 |
deis-controller.service | launched | loaded | active | running | deis-controller | 79874bde…/172.17.8.100 |
deis-database.service | launched | loaded | active | running | deis-database | 79874bde…/172.17.8.100 |
deis-logger.service | launched | loaded | active | running | deis-logger | 79874bde…/172.17.8.100 |
deis-registry.service | launched | loaded | active | running | deis-registry | 79874bde…/172.17.8.100 |
deis-router.1.service | launched | loaded | active | running | deis-router | 79874bde…/172.17.8.100 |
Conclusion
Deis is a very simple and easy to use way to create a PaaS using Docker and CoreOS. The node.js application we created, could be deployed using Deis without a single modification. We will be diving into Deis and CoreOS in more details in following posts!