11 January, 2016

Starting with docker - tools and what they do

Last week I’ve been thrown into docker land head first and this post is just a few notes from my notes getting into it and figuring out the different concepts and tools.

Install

First of all it needs to be installed. I’m running on OS X and favor homebrew for that:

> brew install docker
> brew install docker-machine
> brew install docker-compose

It’s also a downloadable installer available and it’s installable on Windows.

Now to the tools and what they do.

docker-machine

Creates and manages the docker host(s).

Earlier knows as boot2docker and the image it boots still is named boot2docker.iso. There are different drivers, below I’ll use virtual box which is very common on Mac OS X.

So on OS X creating a virtualbox docker host can look like this:

$ docker-machine create --driver virtualbox docker-test
Running pre-create checks...
Creating machine...
(docker-test) Copying /Users/nippe/.docker/machine/cache/boot2docker.iso to /Users/nippe/.docker/machine/machines/docker-test/boot2docker.iso...
(docker-test) Creating VirtualBox VM...
(docker-test) Creating SSH key...
(docker-test) Starting VM...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env docker-test

Now we can see the machine exists:

> $ docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
default       -        virtual box   Running   tcp://192.168.99.100:2376           v1.9.1
docker-test   -        virtual box   Running   tcp://192.168.99.101:2376           v1.9.1

And we can check it’s status

> $ docker-machine status docker-test
Running

A common problem is not finding the docker-machine from your host (Mac OS X for example). You then need to expose the docker-machine config. First get it:

> $ docker-machine env docker-test
export DOCKER_TLS_VERIFY=“1”
export DOCKER_HOST=“tcp://192.168.99.101:2376”
export DOCKER_CERT_PATH=“/Users/nippe/.docker/machine/machines/docker-test”
export DOCKER_MACHINE_NAME=“docker-test”
 # Run this command to configure your shell:
 # eval $(docker-machine env docker-test)

Personally I’ve put an alias in my rc-file for running:
> eval $(docker-machine env docker-test)

docker-engine

“A lightweight runtime and robust tooling that builds and runs your Docker containers.”

So what that means, as I understand it, is that on a docker host (aka docker-machine) you can manage the separate docker images using the docker command.

Command: docker

docker command can be used to start, stop and manage individual docker containers. It can also run, pull and push images from/to the docker-registry.

If you get the error: “Cannot connect to the Docker daemon. Is the docker daemon running on this host?”

You can run (se more info below):
> eval $(docker-machine env docker-test)

To run an image:
> docker run hello-world

Remove docker images (don’t do this if you’re not sure):
> docker rmi $(docker images -q)

docker-registry

Is a repository for docker image files. The most common one is Docker Hub.

> docker run -i -p 3000:3000 grafana/grafana

docker-compose

Do docker or the docker engine enables us to run images in containers, which is great. Only thing is, usually our applications consist of more than one box. Here’s where docker compose comes in, it lets us specify entire environments.

Lets take an example: We want to spin up a solution with 3 boxes (web server with node.js, redis server and a mongo database). We might create a docker-compose.yml-file looking something like this:

node:
  build: .
  container_name: web_app
  ports:
    - “3000”
  links:
    - redis
    - mongo
redis:
  image: redis
  ports:
    - “6379:6379”
mongo:
  image: mongo:3.0.4

In this case I have a Dockerfile in the same folder as docker-compose.yml that defines my node environment.

Then we build it and start it:

> docker-compose build
> docker-compose up

And it spins up an entire environment with 3 containers. To check we can open another terminal (don’t forget the eval-trick mentioned earlier to set up docker environment variables, they are per terminal session) and run docker ps:

> $ docker ps
CONTAINER ID        IMAGE                   COMMAND
7847a9012f4c        dockercomposelab_node   “npm start”
a9182a623fc6        redis                   “/entrypoint.sh redis”
783370a485c1        mongo:3.0.4             “/entrypoint.sh mongo”

docker-swarm

Docker Swarm is still a bit above my head but if I understand it somewhat correctly it’s a tool for managing multiple docker hosts as a single unit / docker container.

Hope this helps!


Tags: