I am a software platform builder. I joined Docker last week, to help Solomon and the Docker team build the distributed computing platform we need for the next decade, as software eats the world and is assembled in systems composed of high number of devices collaborating with even higher numbers of cloud services: a future where the paint covering the walls of your house will host thousands of units of computing, some of them getting power from the Sun, others collaborating with millions of cloud services.
I am a software developer and storyteller, but above all, a platform guy. I spent 10 years building platforms at Netscape & Sun, then 10 years evangelizing platforms at Google, VMware & Microsoft. My main professional interest is in building and kickstarting the network effect for these wondrous two-sided markets called Platforms.
I have worked on platforms for Portals, Ads, Commerce, Social, Web, Distributed Apps, Cloud. In the past few years I specialized on Cloud. I helped create the Platform as a Service (PaaS) category with Google App Engine, established Cloud Foundry as a leading open source multi-cloud PaaS, then helped Microsoft move towards Devops and Open Source with Azure. In the past 6 months at Microsoft, I specialized in getting the Docker ecosystem on Azure.
Why Did I Join Docker? The Lizard and the Whale
Because of Netscape: in 1995, I was in a startup building a client/server IDE and started playing with Netscape Navigator. After a few months using it, I realized that the concepts introduced by Tim Berners-Lee with the web, delivered to the user in the easy to use implementation of the Netscape browser, would change the way we built and consumed applications. I joined Netscape a few years later, and the rest of my career was spent building platforms in the context of this new web paradigm.
In the past 5 years, I have specialized in cloud platforms, which I describe as a commoditization of distributed computing. I have experienced many approaches to building, packaging and operating distributed apps.
When I started using Docker in 2014, I had the same epiphany I had twenty years ago with Netscape. Docker is a platform for building the next generation of distributed applications, defining elegant and extensible abstractions, implemented in a user-friendly tool for developers and sysadmins – a command line interface is friendly to these users. Tools affect the way we think about, perceive and act upon the world, and Docker, like the browser before it, is one of these tools that grows on you. The more I used it, the more it changed the way I thought about problems.
One example of this happened a few months ago when I trained a team at Microsoft about Docker and its ecosystem. I wanted to go over examples from my azure-linux set of tutorials, explaining how to setup a Linux cluster on Azure and use different Docker orchestration tools. The tutorial required a recent version of docker, building docker-machine yourself, Python, pip, NodeJS, npm, and the Azure client SDK. Most of my colleagues had Windows laptops. Two years ago, I would have provided them a hand crafted Hyper-V VM. One year ago, I would have given them a Vagrant box with everything pre-installed. This time, I had them provision a Docker on Ubuntu VM from the Azure portal, SSH to it using either Putty or Cygwin, then use the chanezon/azure-linux container where all the tools were installed. The realization here was: once you have Docker on a Linux box, you can run anything that has been packaged as an image. Ahmet Alp Balkan and many teams at Microsoft are working on making it true for Windows as well. During the tutorial, this led to something like this, to provision new Docker machines in Azure, and list containers running on them.
$ docker run -v ~/.ssh:/usr/data \ -v ~/.dockerindocker:/root/.docker \ chanezon/azure-linux machine create -d azure \ --azure-subscription-id="9b5910a1...-8e79d5ea2841" \ --azure-subscription-cert="/usr/data/azure-cert.pem" pat $ MACHINE=$(docker run -v ~/.ssh:/usr/data -v ~/.dockerindocker:/root/.docker chanezon/azure-linux machine config pat) $ docker run -v ~/.ssh:/usr/data \ -v ~/.dockerindocker:/root/.docker \ chanezon/azure-linux docker $MACHINE ps
After running containers for applications in Go, Python, Node and Java, and setting up various Docker orchestration systems, I became convinced that Docker will become an indispensable tool for developers and operations as they inject some software magic in every part of our lives.
In 2 years, Docker revolutionized the cloud market. I am not as a sophisticated mapper as Simon Wardley, but here’s my rough map of the cloud market: by introducing that new container category, and the portability that containers allow for hybrid and multi-cloud scenarios, Docker will play a central role for every player in that market. It affects both developers and IT Professionals, and provides them the right set of interfaces and abstractions to implement a Devops approach.
What will I be doing?
My main role has been evangelism for the past 10 years. At Docker, I will go back to building and spend more time coding, with Solomon Hykes, on platform aspects. I will also do a bit of evangelism and storytelling, because I love it so much. In the next few months, come chat with me if you’re at Devoxx France, Cloud Foundry Summit or Devoxx UK.
How to Docker?
So how do you Dockerize your application? I will describe a simple example, with the Dockerfile for the use case I described above.
I extend the official Python image from Docker Hub, specify I want a flavor of Python 2, this will default to 2.7.9, and that I want to use the onbuild tag, that will install the packages specified in requirements.txt with pip automatically. My requirements.txt lists one dependency, the Azure Python SDK. Right there, in one declaration, I already accomplished a lot! Dockerfiles replace long README files.
# docker machine RUN curl -L https://github.com/docker/machine/releases/download/v0.1.0-rc2/docker-machine_linux-386 -o /usr/bin/machine && chmod a+x /usr/bin/machine # docker RUN curl -sSL https://get.docker.com/ubuntu/ | sh #Node RUN curl -sL https://deb.nodesource.com/setup | bash - RUN apt-get install -y nodejs #Azure cli RUN npm install azure-cli -g
I then install docker-machine, docker itself, NodeJS and npm, and the Azure cross platform cli.
VOLUME /usr/data VOLUME /root/.docker CMD ["bash"]
Then I specify two volumes, that the user of this container can mount: /usr/data where you would typically mount the directory where you keep your ssh keys, ~/.ssh, and /root/.docker where you would mount either ~/.docker, or another directory where you want to keep the certs and meta data that docker-machine will create so that they can be reused over several container invocations.
This flexible setup allows you to decouple the versions docker-machine, azure sdk, azure cross platform cli, or docker client that you use from what you have installed on your machine. All you need installed locally is a recent version of docker.
My new colleague John Willis, aka @botchagalupe started a series of tutorials to get started with Docker, and if you want something more advanced, Mary Anthony, aka @moxiegirl wrote a tutorial on Docker inception, as used by members of Docker’s core team to develop and build Docker itself.
Who is Dockerized?
Explaining the title:
docker run -ti chanezon/dockerized Chanezon -v
I spent a few hours in my first week at Docker creating a reusable container that can be used as a command line: chanezon/dockerized. It lets you know who started at Docker recently and why, from the comfort of your terminal, without going to a browser. You could run it as a cron job as well, piping the output to an email notification.
docker run -ti chanezon/dockerized
will list people who started recently, a link and title of their starting blog post
docker run -ti chanezon/dockerized Chanezon -v
will output the text of the complete blog post for a specific person.
It is a Python script looking at the Docker blog feed and content.
This example may seem trivial, but it illustrates how, once you start to think in terms of containers, building, shipping and running your software creations, from the simplest of the command lines, to the most complex microservice architecture, becomes much easier.
Happy 2nd birthday Docker!
I feel very lucky to start right in time for Docker’s second birthday. This week we are hosting an open-source-a-thon, with over a dozen open-source-a-thon parties around the world: this is a good opportunity to learn about Docker, contribute to the project, help save blue whales, and boldly go where no open source contributor has gone before!
Learn More about Docker
- New to Docker? Try our 10 min online tutorial
- Share images, automate builds, and more with a free Docker Hub account
- Read the Docker Engine 1.5 Release Notes
- Subscribe to Docker Weekly
- Attend upcoming Docker Meetups
- Celebrate the Docker Project’s 2nd Birthday
- Register for DockerCon 2015
- Start contributing to Docker