I'm glad there has been a movement in software engineering to write small things. I've seen this in the languages I code in: ruby, angularJS and now docker.
I liken Docker to LEGOS® of the Internet, because I can write small building blocks with Dockerfiles; being able to layer these images on top of one other opens so much possibility!
I can write simple language images to provide a base for running processes in those languages.
My ruby Dockerfile (with Docker I never have to worry about gemsets again!)
FROM debian:jessie MAINTAINER Nicholas Shook, email@example.com # install ruby dependencies RUN apt-get update && apt-get install -y \ build-essential \ zlib1g-dev \ libssl-dev \ libreadline6-dev \ libyaml-dev # install ruby from source and cleanup afterward (from murielsalvan/ruby) ADD http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz /tmp/ RUN cd /tmp && \ tar -xzf ruby-2.1.1.tar.gz && \ cd ruby-2.1.1 && \ ./configure && \ make && \ make install && \ cd .. && \ rm -rf ruby-2.1.1 && \ rm -f ruby-2.1.1.tar.gz
Now I can run a command like
docker run shicholas/ruby ruby -v # ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
Similarly, installing go is pretty straightforward
FROM debian:jessie MAINTAINER Nicholas Shook, firstname.lastname@example.org RUN apt-get update && apt-get install -y \ golang \ git ENV GOPATH /usr/lib/go/bin RUN mkdir -p "$GOPATH" ENV PATH $GOPATH:$PATH
I can use this image as a base for another image that executes go commands.
Databases are also something I can use layering to write small Dockerfiles. Take for example redis, here is my base image:
FROM debian:jessie MAINTAINER Nicholas Shook, email@example.com RUN apt-get update && apt-get install -y \ wget \ build-essential RUN wget http://download.redis.io/redis-stable.tar.gz RUN tar xvzf redis-stable.tar.gz
And now I can build two images on top of that, one for the server and one for the client.
FROM shicholas/redis MAINTAINER Nicholas Shook, firstname.lastname@example.org EXPOSE 6379 CMD cd redis-stable && src/redis-server
FROM shicholas/redis MAINTAINER Nicholas Shook, email@example.com EXPOSE 6380 CMD cd redis-stable && src/redis-cli -h $REDIS_PORT_6379_TCP_ADDR
Now I can run these commands to set up a redis-cli talking to a redis-server
docker run -d --name=redis shicholas/redis-server docker run --name=redis-cli --link=redis:redis -i -t shicholas/redis-cli
I've never have gotten into dev-ops, until I met Docker. Being able to write small components, that I can track in source control, to handle all of my server processes is just really damn exciting.