Thursday, 25 September 2014

Managing container - Docker command line #Redhat 7 / CentOS 7

In previous article I had written about the Linux Container archtecture and hereby, I am letting you know on how docker as a management interface could be used as a command line.

Ensure that the docker package is installed on your system else install.

#yum install docker


After you successfully installed the application, use the usual system ctl commands to start docker and to make it run automatically at boot time.

# systemctl start docker.service
# systemctl enable docker.service

Search for an existing image which you are looking for, the command searches the Docker.io Index which is currently the main public registry for sharing repository images where few of them are marked as trusted which means officially checked.

# docker search centos
NAME                                            DESCRIPTION                                     STARS     OFFICIAL   TRUSTED
centos                                          The official build of CentOS.                   463            [OK]       
#

To download a selected image from the remote registry to your local machine pull repository_name/image_name

# docker pull centos

Pulling repository centos
70214e5d0a90: Download complete 
5a1ebaa356ff: Download complete 
68eb857ffb51: Download complete 
511136ea3c5a: Download complete 
34e94e67e63a: Download complete 

Listing the images 

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos5             5a1ebaa356ff        2 weeks ago         484 MB
centos              centos7             70214e5d0a90        2 weeks ago         224 MB
centos              latest              70214e5d0a90        2 weeks ago         224 MB
centos              centos6             68eb857ffb51        2 weeks ago         212.7 MB

To remove one or more images from your system, 
#docker rmi image_name

Managing Containers

To creating a new container, replace the given container name and specify the image on top of which will the container run. The docker run command lets you say which command to run in a container. Once the container is running, you can manage [ start/stop/restart] accordingly. you could also remove if no longer needed. 

The command that you pass on the docker run will see to it that the command runs inside the container as its running environment, hence very little can be seen from the host system. 

# docker run --rm --name=dockertest centos ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
7: eth0: <NO-CARRIER,BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 4a:69:d0:e6:b7:2e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4869:d0ff:fee6:b72e/64 scope link tentative 
       valid_lft forever preferred_lft forever

If you want to make a directory from the host available to the container, map network ports from the container to the host which can be done by docker run command line.

# mkdir -p /docker/centos7
# echo "Docker testing" >/docker/centos7/dockertest.txt
#
# docker run -d -p 8080:6000 --name="dockerwebserver" -w /docker -v /docker/centos7:/docker centos /bin/python -m SimpleHTTPServer 6000
acbc99f8b64b8f3472a6740a2d22ba10ab42ff2615c6adda08ca52236293e136
#
where,

Detach (-d) the container so it runs in the background
Map (-p) TCP port 6000 on the container to port 8080 on the host
Map Working directory(-w /docker) in the container when the command runs.
Map directory from the host (-v /docker/centos7) to the container
HTTPserver module(-m) with /bin/python command.
  
# netstat -tupln | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      2006/docker         

To execute commands inside of a running container, you need to connect to it through a command-line interface. T he docker attach command is not suitable for this, since it only lets you observe the standard output of the application currently running in the container. Instead, use the nsenter command to enter the container namespace. T his command requires the ID of the container as it appears on the host system.

# docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
acbc99f8b64b        centos:centos7      /bin/python -m Simpl   11 minutes ago      Up 11 minutes       0.0.0.0:8080->6000/tcp   dockerwebserver     
#

# docker inspect -f {{.State.Pid}} acbc99f8b64b
4526
#


# nsenter -m -u -n -i -p -t 4526 /bin/sh
sh-4.2# cat /etc/centos-release 
CentOS Linux release 7.0.1406 (Core) 
sh-4.2# 

sh-4.2# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:35 ?        00:00:00 /bin/python -m SimpleHTTPServer 6000
root         6     0  0 13:49 ?        00:00:00 /bin/sh
root         9     6  0 13:50 ?        00:00:00 ps -ef
sh-4.2#
sh-4.2# uptime
13:50:33 up  2:16,  0 users,  load average: 0.00, 0.01, 0.05
sh-4.2# 
sh-4.2# 

sh-4.2# free -m
             total       used       free     shared    buffers     cached
Mem:           994        318        676          6          2        123
-/+ buffers/cache:        192        802
Swap:         1023          0       1023
sh-4.2#
sh-4.2# df -h
Filesystem                                                                                         Size  Used Avail Use% Mounted on
/dev/mapper/docker-253:3-3148627-acbc99f8b64b8f3472a6740a2d22ba10ab42ff2615c6adda08ca52236293e136  9.8G  280M  9.0G   3% /
tmpfs                                                                                              498M     0  498M   0% /dev
shm                                                                                                 64M     0   64M   0% /dev/shm
/dev/mapper/VolGroup-varlv                                                                         6.0G  1.5G  4.6G  25% /etc/hosts
/dev/mapper/VolGroup-rootlv                                                                        4.9G  102M  4.8G   3% /docker
tmpfs                                                                                              498M     0  498M   0% /proc/kcore
sh-4.2#
sh-4.2#
sh-4.2#exit

List/stop/start/restart/Monitoring the containers

# docker ps
CONTAINER ID        IMAGE               COMMAND                     CREATED             STATUS              PORTS               NAMES
acbc99f8b64b        centos:centos7      /bin/python -m Simpl   20 minutes ago      Up 20 minutes       0.0.0.0:8080->6000/tcp   dockerwebserver     
#

# docker stop dockerwebserver
dockerwebserver
#

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# docker start dockerwebserver
dockerwebserver

# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
acbc99f8b64b        centos:centos7      /bin/python -m Simpl   22 minutes ago      Up 2 seconds        0.0.0.0:8080->6000/tcp   dockerwebserver     

# docker restart dockerwebserver
dockerwebserver

# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
acbc99f8b64b        centos:centos7      /bin/python -m Simpl   22 minutes ago      Up 3 seconds        0.0.0.0:8080->6000/tcp   dockerwebserver     

Commit containers

To create a new image from changes made in the running container,syntax as below 
docker commit container_name [repository_name:tag] 


# docker commit dockerwebserver centos:dockerwebserver_V1.0
f7c53eac787979bccc347e08c1f7a6da96daf6a829c5f35165b2675763943cbc
#

# docker images
REPOSITORY          TAG                    IMAGE ID            CREATED             VIRTUAL SIZE
centos              dockerwebserver_V1.0   f7c53eac7879        10 seconds ago      224 MB
centos              centos5                5a1ebaa356ff        2 weeks ago         484 MB
centos              centos7                70214e5d0a90        2 weeks ago         224 MB
centos              latest                 70214e5d0a90        2 weeks ago         224 MB
centos              centos6                68eb857ffb51        2 weeks ago         212.7 MB

View containers

To view an overall information on how Docker is configured on your system


# docker info
Containers: 1
Images: 6
Storage Driver: devicemapper
 Pool Name: docker-253:3-3148627-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1365.8 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 1.4 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.10.0-123.el7.x86_64
#

To display a detailed information about an image or a container
# docker inspect acbc99f8b64b
[{
    "ID": "acbc99f8b64b8f3472a6740a2d22ba10ab42ff2615c6adda08ca52236293e136",
    "Created": "2014-09-25T12:35:20.804560542Z",
    "Path": "/bin/python",

Archive containers/images

Archive files are useful for backing up or restoring containers and images. Note that you can not backup 
data volumes this way since they are external to containers. 
To export the contents of a container file system as an archive in tar compress format.

# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
acbc99f8b64b        centos:centos7      /bin/python -m Simpl   46 minutes ago      Up 23 minutes       0.0.0.0:8080->6000/tcp   dockerwebserver     
#

# docker export dockerwebserver > centos-webserver-docker-7.0-x86_68
# tar -cvf centos-webserver-docker-7.0-x86_68.tar centos-webserver-docker-7.0-x86_68
# gzip centos-webserver-docker-7.0-x86_68.tar
# du -sh rhel-server-docker-7.0-21.4-x86_64.tar.gz 

Conversely, you can import an content from an URL or an tar archive as below
#docker import <source>

On conclusion, summarizing the docker command reference.

Docker commands Descriptions
docker version Find the version number currently installed
docker search <name> Search for existing images
docker pull repository_name/image_name Download a selected image from remote to your local machine
docker images Lists all locally installed image
docker push Copy image or repository to a remote location
docker rmi image_name Remove one or more images from your system
docker commit container_name create a new image from changes made in the running container
docker stop container_name stop the running container gracefully
docker kill container_name stop a container that is not responding
docker start container_name start a previously stopped container
docker restart container_name Restart a running container
docker rm container_name remove a container
docker ps Listing containers
docker info overall information on how Docker is configured on your system
docker top container_name dynamic view of processes currently running inside of a certain container
docker export container_name export the contents of a container file system as an archive in tar compress format