আর্কাইভ | openstack RSS for this section

An (not so big) intro to DOCKER

Docker

Docker is a platform to develop, ship, and run applications. According to the Wikipedia, Docker is an open-source project that automates the deployment of applications inside software containers, by providing an additional layer of abstraction and automation of operating system–level virtualization on Linux. Docker mainly facilitates to run almost any application inside a securely isolated container in multi-tenant (or simply, multi-container) environments. Since there is no hypervisor like the traditional approach, this lightweight containers can really get better performance.

Docker uses resource isolation features of the Linux kernel such as cgroups and kernel namespaces to allow independent “containers” to run within a single Linux instance, avoiding the overhead of starting virtual machines. Linux kernel’s namespaces completely isolate an application’s view of the operating environment, including process trees, network, user IDs and mounted file systems, while cgroups provide resource isolation, including the CPU, memory, block I/O and network. Docker includes the libcontainer library as a reference implementation for containers, and builds on top of libvirt, LXC (Linux containers) and systemdnspawn, which provide interfaces to the facilities provided by the Linux kernel.

With just enough of the definition, lets get our hand dirty with a first run in the docker.
You can just go to the Try DOCKER and run the below commands:

Docker prompt and Version:

you@tutorial:~$ docker
Usage: Docker [OPTIONS] COMMAND [arg...]
-H="127.0.0.1:4243": Host:port to bind/connect to

A self-sufficient runtime for linux containers.

Commands:

attach    Attach to a running container
build     Build a container from a Dockerfile
commit    Create a new image from a container's changes
diff      Inspect changes on a container's filesystem
export    Stream the contents of a container as a tar archive
history   Show the history of an image
images    List images
import    Create a new filesystem image from the contents of a tarball
info      Display system-wide information
insert    Insert a file in an image
inspect   Return low-level information on a container
kill      Kill a running container
login     Register or Login to the Docker registry server
logs      Fetch the logs of a container
port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps        List containers
pull      Pull an image or a repository from the Docker registry server
push      Push an image or a repository to the Docker registry server
restart   Restart a running container
rm        Remove a container
rmi       Remove an image
run       Run a command in a new container
search    Search for an image in the Docker index
start     Start a stopped container
stop      Stop a running container
tag       Tag an image into a repository
version   Show the Docker version information
wait      Block until a container stops, then print its exit code

Pulling from Repository:

Lets search for a image called tutorial in the repository and pull it into our environment.

you@tutorial:~$ docker search tutorial
Found 1 results matching your query ("tutorial")
NAME                      DESCRIPTION
learn/tutorial            An image for the interactive tutorial
you@tutorial:~$ docker pull learn/tutorial
Pulling repository learn/tutorial from https://index.docker.io/v1
Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu
Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (12.10) from ubuntu
Pulling image 27cf784147099545 () from tutorial

Running the Helloworld:

Lets run the very first helloworld thing with echo command:

you@tutorial:~$ docker run learn/tutorial echo "My Worderful HelloWorld in Docker"
My Worderful HelloWorld in Docker

Install package and commit:

Lets install the ping tools from apt-get repo. Once that is done, lets save this image with a new name "ping"
Once the commit is done, we can push it back to the [docker-hub] (https://hub.docker.com)

you@tutorial:~$ docker run learn/tutorial apt-get install -y ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
  iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 1s (50.3 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...
you@tutorial:~$ docker run learn/ping ping www.google.com
PING www.google.com (74.125.239.129) 56(84) bytes of data.
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=1 ttl=55 time=2.23 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=2 ttl=55 time=2.30 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=3 ttl=55 time=2.27 ms
64 bytes from nuq05s02-in-f20.1e100.net (74.125.239.148): icmp_req=4 ttl=55 time=2.30 ms

you@tutorial:~$ docker ps -l
ID                  IMAGE               COMMAND                CREATED             STATUS              PORTS
6982a9948422        ubuntu:12.04        apt-get install ping   1 minute ago        Exit 0

you@tutorial:~$ docker commit 698 learn/ping
effb66b31edb

you@tutorial:~$ docker push learn/ping

Detail about a container:

We can easily inspect the details of a running container by using the inspect command. We don’t need to write the whole ID, just first 3~4 characters will suffice.

you@tutorial:~$ docker ps
ID                  IMAGE               COMMAND               CREATED             STATUS              PORTS
efefdc74a1d5        learn/ping:latest   ping www.google.com   37 seconds ago      Up 36 seconds
you@tutorial:~$ docker inspect efe
[2013/07/30 01:52:26 GET /v1.3/containers/efef/json
{
  "ID": "efefdc74a1d5900d7d7a74740e5261c09f5f42b6dae58ded6a1fde1cde7f4ac5",
  "Created": "2013-07-30T00:54:12.417119736Z",
  "Path": "ping",
  "Args": [
      "www.google.com"
  ],
  "Config": {
      "Hostname": "efefdc74a1d5",
      "User": "",
      "Memory": 0,
      "MemorySwap": 0,
      "CpuShares": 0,
      "AttachStdin": false,
      "AttachStdout": true,
      "AttachStderr": true,
      "PortSpecs": null,
      "Tty": false,
      "OpenStdin": false,
      "StdinOnce": false,
      "Env": null,
      "Cmd": [
          "ping",
          "www.google.com"
      ],
      "Dns": null,
      "Image": "learn/ping",
      "Volumes": null,
      "VolumesFrom": "",
      "Entrypoint": null
  },
  "State": {
      "Running": true,
      "Pid": 22249,
      "ExitCode": 0,
      "StartedAt": "2013-07-30T00:54:12.424817715Z",
      "Ghost": false
  },
  "Image": "a1dbb48ce764c6651f5af98b46ed052a5f751233d731b645a6c57f91a4cb7158",
  "NetworkSettings": {
      "IPAddress": "172.16.42.6",
      "IPPrefixLen": 24,
      "Gateway": "172.16.42.1",
      "Bridge": "docker0",
      "PortMapping": {
          "Tcp": {},
          "Udp": {}
      }
  },
  "SysInitPath": "/usr/bin/docker",
  "ResolvConfPath": "/etc/resolv.conf",
  "Volumes": {},
  "VolumesRW": {}

Reference:
1. [Docker Documentation] (https://docs.docker.com/)
2. [Understanding Docker] (https://docs.docker.com/introduction/understanding-docker/)

pdb – The Python Debugger

Debugging with pdb

Very first thing, read this blog by Steve Ferg’s which explains pdb in details.

Here are the summary of the necessary commands:

import pdb
setting up break points by pdb.set_trace()

in-debug keys:

- n (next)
- ENTER (repeat previous)
- q (quit)
- p <variable> (print value)
- c (continue) 
- l (list where you are)
- s (step into subroutine)
- r (continue till the end of the subroutine)
- ! <python command>

Bulk Renaming Python Script

During a map reduce job, i was in need of bulk renaming input files to a specific pattern. Hence, wrote the below simple python script that can just do the job.

import os
import sys

run_ok = False
if len(sys.argv) == 5:
    directory_name = sys.argv[1]
    old_extension = sys.argv[2]
    name_pattern  = sys.argv[3]
    new_extension = sys.argv[4]
    print "Running jobs on directory: {} having extensions {}".format(directory_name, old_extension)
    run_ok = True

else:
    print "SYNTAX : python file_rename.py directory_name matching_extension new_name_pattern new_extension"
    pass

if (run_ok):
    list = os.listdir( directory_name )
    counter = 1
    for old_file in list:
        if old_extension in old_file:
            new_file = name_pattern + str( counter ) + "." + new_extension
            os.rename( directory_name + "/"+ old_file, directory_name + "/" + new_file )
            print "file renamed from {} to {}".format( old_file, new_file )
            counter += 1

stopping swift services using python script

import sys
import shutil
import os
import subprocess, signal 

'''
    format : python stop_service {proxy|object}
    List the process and find server pid to kill
'''
service = 'swift-'+sys.argv[1]+'-server'
print service
proc_list = subprocess.Popen(['ps','-ef'],stdout = subprocess.PIPE)
out,err = proc_list.communicate()
for line in out.splitlines():
    #print line
    if (service in line):
        pid = int (line.split(None,2)[1])
	os.kill(pid,signal.SIGKILL)

print 'please run the {} service  manually'.format(service)