Tuesday, February 6, 2018

Drooling Over Docker #4 — Installing Docker CE on Linux

Choosing the right product

Docker engine comes in 2 avatars — Docker Community Edition (CE) and Docker Enterprise Edition (EE). While the CE product is free to experiment with, the EE comes for a fee (1-month free trial available).
Docker CE — Docker Community Edition (CE) webpage informs that it is a good platform for developers or small teams to learn about containerized applications.
Docker CE is made available via two update channels –
1. Stable — Updates are released quarterly (Check the available RPM packages)
2. Edge — Updates are released monthly (Check the available RPM packages)
Since 2017, Docker has moved to YY.MM style of versioning. So if you explore a Docker CE Edge repository, if you will find monthly releases there e.g. last few versions as 17.11, 17.12, and 18.01; however, the Stable repository would have the last few versions as 17.06, 17.09, and 17.12.

Installing Docker CE using repositories

As I collect details from Docker CE installation page today, amongst Linux distributions, Docker CE is available for CentOS, Fedora, Debian and Ubuntu Linux only. Let us see how to intall it on CentOS & Ubuntu -
1. Prerequisites
  • For CentOS — to have CentOS 7; centos-extras repository enabled (remains enabled by default)
  • For Ubuntuto have any of the following 64-bit Ubuntu versions — Artful 17.10(Docker CE 17.11 Edge and higher only); Zesty 17.04Xenial 16.04(LTS);Trusty 14.04(LTS)
2. Installing Necessary Packages
  • For CentOS#yum install -y yum-utils device-mapper-persistent-data lvm2
  • For Ubuntu# apt-get update ; # apt-get install apt-transport-https ca-certificates curl software-properties-common;
3. Adding Docker GPG Key
4. Adding Docker CE Repository
5. Installing Docker CE From The Repositories
Installing the latest update from the repository
  • For CentOS# yum install docker-ce;
  • For Ubuntu# apt-get update ; # apt-get install docker-ce
Installing the chosen version from the repository
  • For CentOS#yum list docker-ce — showduplicates; #yum install docker-ce-.ce;
  • For Ubuntu# apt-cache madison docker-ce; #apt-get install docker-ce=
Contd…
— — — — — — — — — — — — — — — — — — — — — — — — — — — — 
Resources:
  1. https://blog.docker.com/2017/03/docker-enterprise-edition/ — Docker Versioning
  2. https://docs.docker.com/install/linux/docker-ce/centos/ — Docker CE on CentOS
  3. https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker CE on Ubuntu

Saturday, January 20, 2018

Using templates in 'docker service create'

Let us take a quick look at some useful commands here before using and 'inspecting' a template -

Node ID / Host Name:

A docker node
$ docker node ls
ID                                            HOSTNAME      STATUS     AVAILABILITY   MANAGER STATUS
s5id2jv8uofjfmbbiqiqe6nnx *   ubuntu              Ready               Active                           Leader

Note that the above-mentioned ID is the node id.


Each host that participates in a docker swarm is called a node. A node (a host) has a NODE ID (a swarm given identity) and a hostname (an independent name that has always been there with the host even before joining a swarm). I have highlighted the NODE ID (the swarm thing) and the hostname in the above image.

Service ID / Service Name:

Creating a single replica of a service

When we create a service - we are actually creating a running instance from the image that we call a task (a container) in swarm mode. Since we are creating just one replica here, we are creating just one task.

$ docker service create --name django httpd

Now we want to check the the service(s) running on this swarm -

$ docker service ls
ID                          NAME                MODE                REPLICAS            IMAGE               PORTS
ep9luuvn21y2        django              replicated                  1/1                     httpd:latest

Note that that above mentioned ID is the service ID


Task ID / Task Name:

$ docker service ps django  OR
 $ docker service ps ep9luuvn21y2
ID                      NAME      IMAGE      NODE     DESIRED St   CURRENT St        ERROR   PORTS

y2n63eaa1ln3   django.1    httpd:latest   ubuntu     Running     Running 17 minutes ago

When you want to list the tasks of one or more services, use service ps command.
The list of tasks informs task id as well as the task name (servicename.#) and the node name (hostname) is it running on.

docker node ps OR docker service ps SERVICENAME show information from node (all services) and service (all nodes) perspective 

Note -

$docker service ps SERVICES_NAMES  <--- div="" list="" more="" nbsp="" of="" one="" or="" services="" tasks="" the="">
$docker node ps [NODES] <--- i="" nbsp="">List tasks running on one or more nodes, defaults to current node

So by now, we are familiar with NODE ID / NODE NAME (hostname), SERVICE ID / SERVICE NAME, TASK ID / TASK NAME and the commands to list them. The commands are 'docker node ls', 'docker service ls', 'docker service ps SERVICE_NAME or SERVICE_ID' OR 'docker node ps NODE_NAME or NODE_ID'.

Let us make it easier to understand through the following image - 


Task ID & Task Name Vs. Container ID & Container Name:


From the following commands, also notice that the task name and task id form the underlying container name while container id happens to be something else.



Putting everything together - Using Templates:

 Using a template we can pass a customized hostname, mount, or env values to a container at the time of service creation.

Now let us try to understand the Templates through this sequence of commands - 


Here first we create a service with --hostname variable set go GO Language styled variable it will set the hostname within the going-to-be created container under this service. In the example here, the hostname recorded within the container is composed of node's hostname, node's id and the service name.
The last command in the sequence is trying to paste that hostname recorded within the container back to screen (re-pasted below) - 

docker container inspect --format="{{.Config.Hostname}}" hosttempl.1.xudl0i6soylcnhep47nvog4nn
ubuntu-s5id2jv8uofjfmbbiqiqe6nnx-hosttempl





Some useful docker orchestration commands

Listed below are the commands that are available in the 17.11 version of Docker CE. Listing them here together is good to compare and see when to use them - 

docker swarm (working with the cluster)

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

docker node (working with nodes - individual hosts that make us a swarm cluster)

Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


docker service (the service that runs instances aka containers aka tasks on nodes)
Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Friday, January 5, 2018

Drooling Over Docker #3 - Docker CLI Structure & Management Commands

Prior to Docker 1.13 release (January 2017), docker commands were logically grouped around the purpose e.g. build, ship, or run commands; however this list of commands was quite unstructured and often confusing for the lack of context they would operate inside of e.g. for a certain command, it was difficult to determine whether it would run on an image or on the container spawned from that image. A detailed list for few such challenges in using earlier Docker CLI can be seen here.
With Docker 1.13 release, the Docker commands are given a structure where a command has three parts (with a few exceptions) in addition to other options or arguments as needed -
docker
The command "$ docker image ls" has the following components:
  • The docker client command - docker
  • To provide a context, management command e.g. image
  • The sub-command to inform of the specific action required e.g. ls to list the downloaded docker images
Let us see how these commands look like at the terminal:
Listing downloaded Docker images
Removing one of the downloaded images
The following list presents all management commands available in the current docker version:
Each of the above listed management commands has a set of sub-commands to initiate a specific action; the following screen-shot shows the sub-commands under management command image :
The following table shows all available docker image commands:
Though the earlier Docker commands are compatible with the newer Docker versions, the new commands are easier to remember and invoke. The following table shows a comparison between earlier (still working) vs. newly structured commands -
Contd...
---------------------------------------------------------------------------------------------
Resources:
  1. Docker 1.13 Management Commands
  2. Docker Management Commands by Romin Irani
  3. Working with Docker v1.13 CLI -Management commands
  4. Docker CLI documentation

Drooling Over Docker #4 — Installing Docker CE on Linux

Choosing the right product Docker engine comes in 2 avatars — Docker Community Edition (CE) and Docker Enterprise Edition (EE). While the...