26 Comandaments Docker amb exemples

Full de tramesa de comandaments Docker per a sysadmin i desenvolupadors …


Docker és un sistema de containerització que envia i executa l’aplicació amb les seves dependències dins d’un contenidor. Hi ha diverses comandes docker que has de conèixer quan treballis amb Docker. Aquest article tracta sobre tot.

Si no sabeu què és Docker, potser ho podeu prendre Curs d’iniciació Udemy.

Trobar la versió

Una de les primeres coses que voleu saber és trobar la versió instal·lada del docker.

[correu electrònic protegit]: / home / geekflare $ docker –version

Versió de Docker 18.09.6, creació 481bc77

Baixant imatge

Diguem que cal extreure la imatge del docker dockerhub (repositori docker). El següent exemple d’estirar la imatge del servidor HTTP d’Apache.

[correu electrònic protegit]: / home / geekflare $ docker pull httpd

Ús de l’etiqueta predeterminada: més recent

més recent: Tirant de biblioteca / httpd

f5d23c7fed46: Estira complet

b083c5fd185b: Estira complet

bf5100a89e78: Estira complet

98f47fcaa52f: Estira complet

622a9dd8cfed: Estireu completats

Digest: sha256: 8bd76c050761610773b484e411612a31f299dbf7273763103edbda82acd73642

Estat: S’ha descarregat la imatge més recent per a httpd: més recent

[correu electrònic protegit]: / home / geekflare $

Imatges

Llista totes les imatges del docker tirades al sistema amb detalls d’imatge com TAG / ID IMAGE / SIZE, etc..

[correu electrònic protegit]: / home / geekflare $ imatges de docker

TALLA DE REPOSITORI MITJÀ CREAT D’ID

httpd més recent ee39f68eb241 fa 2 dies 154MB

hola-world latest fce289e99eb9 fa 6 mesos 1.84kB

sekuqq / hadoop-docker 2.7.0 789fa0a3b911 fa 4 anys 1.76GB

Correr

Executeu la imatge del docker esmentada a la comanda. Aquesta ordre crearà un contenidor docker en el qual s’executarà el servidor HTTP d’Apache.

[correu electrònic protegit]: / home / geekflare $ docker executat -it -d httpd

09ca6feb6efc0578951a3e2557ed5855b2edda39a795d9703eb54d975930fe6e

Què funciona??

ps enumera tots els contenidors del docker que funcionen amb detalls del contenidor.

[correu electrònic protegit]: / home / geekflare $ docker ps

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

09ca6feb6efc httpd               "httpd-primer pla"   Fa 36 segons Fins 33 segons 80 / tcp suspicious_bell

Com podeu veure, el servidor Apache s’està executant en aquest contenidor docker.

ps -a

Llista tots els contenidors de l’emmagatzematge en marxa / sortits / parats amb detalls del contenidor.

[correu electrònic protegit]: / home / geekflare $ docker ps -a

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

09ca6feb6efc httpd                            "httpd-primer pla"       Fa 51 segons Pujar 49 segons 80 / tcp suspicious_bell

2f6fb3381078 sequènciaq / hadoop-docker: 2.7.0   "/etc/bootstrap.sh -d"   Fa 2 setmanes Exit (137) fa 9 dies quizzical_raman

9f397feb3a46 sequençaq / hadoop-docker: 2.7.0   "/etc/bootstrap.sh – …"   Fa 2 setmanes Exit (255) fa 2 setmanes 2122 / tcp, 8030-8033 / tcp, 8040 / tcp, 8042 / tcp, 8088 / tcp, 19888 / tcp, 49707 / tcp, 50010 / tcp, 50020 / tcp, 50070 / tcp, 50075 / tcp, 50090 / tcp determinat_ritchie

9b6343d3b5a0 hola-món                      "/Hola"                 Fa 2 setmanes Exit (0) fa 2 setmanes Peace_mclean

executar

Accediu al contenidor del docker i executeu les ordres dins del contenidor. Accedeixo al contenidor del servidor apache en aquest exemple.

[correu electrònic protegit]: / home / geekflare $ docker exec -it 09ca6feb6efc bash

[correu electrònic protegit]: / usr / local / apache2 # ls

Error de configuració bin cgi-bin conf icones htdocs inclouen mòduls de registre

[correu electrònic protegit]: / usr / local / apache2 #

Escriviu exit i premeu Enter per sortir del contenidor.

Eliminació del contenidor

Traieu el contenidor del docker amb l’identificador del contenidor esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker rm 9b6343d3b5a0

9b6343d3b5a0

Executeu la comanda següent per comprovar si el contenidor s’ha tret o no.

[correu electrònic protegit]: / home / geekflare $ docker ps -a

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

09ca6feb6efc httpd                            "httpd-primer pla"       Fa aproximadament un minut Pujar Aproximadament un minut 80 / tcp suspicious_bell

2f6fb3381078 sequènciaq / hadoop-docker: 2.7.0   "/etc/bootstrap.sh -d"   Fa 2 setmanes Exit (137) fa 9 dies quizzical_raman

9f397feb3a46 sequençaq / hadoop-docker: 2.7.0   "/etc/bootstrap.sh – …"   Fa 2 setmanes Exit (255) fa 2 setmanes 2122 / tcp, 8030-8033 / tcp, 8040 / tcp, 8042 / tcp, 8088 / tcp, 19888 / tcp, 49707 / tcp, 50010 / tcp, 50020 / tcp, 50070 / tcp, 50075 / tcp, 50090 / tcp determinat_ritchie

Eliminació de la imatge

Elimineu la imatge del docker amb l’identificador de la imatge docker esmentada a la comanda

[correu electrònic protegit]: / home / geekflare $ docker rmi fce289e99eb9

Sense lletra: hola-món: més recent

Sense etiquetar: [correu electrònic protegit]: 41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8

Eliminat: sha256: fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e

Esborrat: sha256: af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3

[correu electrònic protegit]: / home / geekflare $

Reinicieu Docker

Reinicieu el contenidor del docker amb l’identificador del contenidor esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker reinicia 09ca6feb6efc

09ca6feb6efc

Executeu la comanda següent i comproveu el paràmetre STATUS per verificar si el contenidor ha començat recentment.

[correu electrònic protegit]: / home / geekflare $ docker ps

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

09ca6feb6efc httpd               "httpd-primer pla"   Fa 6 minuts Pujar 9 segons 80 / tcp suspicious_bell

Aturar Docker

Atureu un contenidor amb l’identificador de contenidor esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker stop 09ca6feb6efc

09ca6feb6efc

Executeu la comanda següent per comprovar si el contenidor encara funciona o s’ha aturat.

[correu electrònic protegit]: / home / geekflare $ docker ps

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

Iniciar Docker

Aquesta ordre a docker inicia el contenidor docker amb l’identificador de contenidor esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker start 09ca6feb6efc

09ca6feb6efc

Executeu la comanda següent per comprovar si el contenidor ha estat engegat o no.

[correu electrònic protegit]: / home / geekflare $ docker ps

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

09ca6feb6efc httpd               "httpd-primer pla"   Fa 8 minuts Pujar 3 segons 80 / tcp suspicious_bell

Mata

Atureu el contenidor de l’embarcament immediatament. La comanda d’aturada de Docker deté el contenidor amb gràcia, aquesta és la diferència entre les ordres de mort i de parada.

[correu electrònic protegit]: / home / geekflare $ docker kill 09ca6feb6efc

09ca6feb6efc

Executeu la comanda següent per veure si el contenidor ha estat assassinat o no.

[correu electrònic protegit]: / home / geekflare $ docker ps

Identificador de contenidor IMATGE DE COMANDAMENT ESTATS CREATS PORTS NOMS

Compromís

Deseu una imatge nova del docker amb l’identificador de contenidor esmentat a la comanda del sistema local. A l’exemple següent, geekflare és el nom d’usuari i httpd_image és el nom de la imatge.

[correu electrònic protegit]: / home / geekflare $ docker commit 09ca6feb6efc geekflare / httpd_image

sha256: d1933506f4c1686ab1a1ec601b1a03a17b41decbc21d8acd893db090a09bb31c

iniciar Sessió

Inicieu la sessió al hub de docker. Se us demanarà les vostres credencials del centre de docker per iniciar la sessió.

[correu electrònic protegit]: / home / geekflare $ inici de sessió docker

Inicieu la sessió amb el vostre Docker ID per empènyer i treure imatges des del centre de Docker. Si no teniu un identificador de Docker, dirigiu-vos a https://hub.docker.com per crear-ne un.

Nom d’usuari: geekflare

Contrasenya:

Configura un assistent de credencials per eliminar aquest avís. Veure

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

S’ha iniciat la sessió

Empenta

Carregueu una imatge docker amb el nom de la imatge esmentat a la comanda del dockerhub.

[correu electrònic protegit]: / home / geekflare $ docker push geekflare / httpd_image

La polsada es refereix al repositori [docker.io/geekflare/httpd_image]

734d9104a6a2: Empès

635721fc6973: Muntat des de biblioteca / httpd

bea448567d6c: Muntat des de biblioteca / httpd

bfaa5f9c3b51: Muntat des de biblioteca / httpd

9d542ac296cc: Muntat des de biblioteca / httpd

d8a33133e477: Muntat des de biblioteca / httpd

més recent: digest: sha256: 3904662761df9d76ef04ddfa5cfab764b85e3eedaf10071cfbe2bf77254679ac mida: 1574

Xarxa docker

La següent comanda a docker mostra els detalls de tota la xarxa del clúster.

[correu electrònic protegit]: / home / geekflare $ docker network ls

NOM D’INDICACIÓ DE XARXES ÀREA DE CONDUCTOR

85083e766f04 local bridge bridge

host local amfitrió f51d1f3379e0

5e5d9a192c00 cap local nul

Hi ha diverses altres comandes de xarxa de docker.

[correu electrònic protegit]: / home / geekflare $ docker

Ús: xarxa de docker COMMAND

Gestiona xarxes

Ordres:

connect Connecta un contenidor a una xarxa

crear Crea una xarxa

desconnectar Desconnectar un contenidor d’una xarxa

inspeccionar Mostra informació detallada en una o més xarxes

ls Llista de xarxes

poda Eliminar totes les xarxes no utilitzades

rm Elimina una o més xarxes

Executeu “docker network COMMAND –help” per obtenir més informació sobre un ordre.

Informació del port

Obteniu informació detallada sobre el docker instal·lat al sistema incloent la versió del nucli, el nombre de contenidors i les imatges, etc.

[correu electrònic protegit]: / home / geekflare $ docker info

Contenidors: 3

Funcionament: 1

Pausa: 0

Aturat: 2

Imatges: 3

Versió del servidor: 18.09.6

Controlador d’emmagatzematge: superposició2

Còpia de seguretat del fitxer: extfs

Admet tipus d_type: true

Diferent de superposició nativa: cert

Controlador de registre: json-file

Controlador de Cgroup: cgroupfs

Complements:

Volum: local

Xarxa: pont host macvlan null overlay

Registre: awslogs fluentd gcplogs gelf journald json-file logentries locals spls syslog

Eixam: inactiu

Runtimes: runc

Per defecte Runtime: runc

Inicial binari: docker-init

contenidor versió: bb71b10fd8f58240ca47fbb579b9d1028eea7c84

versió runc: 2b18fe1d885ee5083ef9f0838fee39b62d653e30

versió init: fec3683

Opcions de seguretat:

apparmor

seccomp

Perfil: per defecte

Versió del nucli: 4.18.0-25-genèric

Sistema operatiu: Ubuntu 18.10

OSType: linux

Arquitectura: x86_64

CPU: 1

Memòria total: 4.982GiB

Nom: geekflare

ID: RBCP: YGAP: QG6H: B6XH: JCT2: DTI5: AYJA: M44Z: ETRP: 6TO6: OPAY: KLNJ

Docker Root Dir: / var / lib / docker

Mode de depuració (client): fals

Mode de depuració (servidor): fals

Nom d’usuari: geekflare

Registre: https://index.docker.io/v1/

Etiquetes:

Experimental: fals

Registres insegurs:

127.0.0.0/8

Activat Restauració en viu: fals

Llicència del producte: Motor comunitari

Còpia del fitxer

Copieu un fitxer d’un contenidor del docker al sistema local.

En aquest exemple, copio el fitxer httpd.pid dins d’un contenidor docker amb l’identificador 09ca6feb6efc a / home / geekflare /

[correu electrònic protegit]: / home / geekflare $ sudo docker cp 09ca6feb6efc: /usr/local/apache2/logs/httpd.pid / home / geekflare /

Contrasenya [sudo] de geekflare:

Executeu la comanda següent per comprovar si el fitxer s’ha copiat o no.

[correu electrònic protegit]: / home / geekflare $ ls

Exemples de documents d’escriptori exemples.desktop httpd.pid nginx_new.yml nginx.yml

Comprovació de l’historial

Mostra l’historial d’una imatge docker amb el nom de la imatge esmentat a la comanda.

g[correu electrònic protegit]: / home / geekflare $ historial de docker httpd

IMATGE CREAT CREAT PER COMENTARI DE TALLA

ee39f68eb241 fa 2 dies / bin / sh -c # (nop) CMD ["httpd-primer pla"] 0B

           Fa 2 dies / bin / sh -c # (nop) EXPOSE 80 0B

           Fa 2 dies / bin / sh -c # (nop) Fitxer COPY: c432ff61c4993ecd … 138B

           Fa 4 dies / bin / sh -c set -eux; desarAptMark ="$ (apt-m … 49,1 MB

           Fa 4 dies / bin / sh -c # (nop) ENV HTTPD_PATCHES = 0B

           Fa 4 dies / bin / sh -c # (nop) ENV HTTPD_SHA256 = b4ca9d05 … 0B

           Fa 4 dies / bin / sh -c # (nop) ENV HTTPD_VERSION = 2.4.39 0B

           Fa 4 dies / bin / sh -c set -eux; actualització apt-get; apte-g … 35,4 MB

           Fa 4 dies / bin / sh -c # (nop) WORKDIR / usr / local / apache2 0B

           Fa 4 dies / bin / sh -c mkdir -p "$ HTTPD_PREFIX"  && chow … 0B

           Fa 4 dies / bin / sh -c # (nop) ENV PATH = / usr / local / apach … 0B

           Fa 4 dies / bin / sh -c # (nop) ENV HTTPD_PREFIX = / usr / loc … 0B

           Fa 5 dies / bin / sh -c # (nop) CMD ["bash"] 0B

           Fa 5 dies / bin / sh -c # (nop) Fitxer AFD: 71ac26257198ecf6a … 69.2MB

Comprovació dels registres

Mostra els registres del contenidor del docker amb l’identificador contingut esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker registres 09ca6feb6efc

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

[Dill. 15 jul. 14: 01: 55.400472 2019] [mpm_event: notice] [pid 1: tid 140299791516800] AH00489: Apache / 2.4.39 (Unix) configurat: reprèn les operacions normals

[Dill 15 jul 14: 01: 55.400615 2019] [core: notice] [pid 1: tid 140299791516800] AH00094: Línia de comandaments: ‘httpd -D FOREGROUND’

[Dill. 15 jul. 14: 08: 36.798229 2019] [mpm_event: notice] [pid 1: tid 140299791516800] AH00491: capturat SIGTERM, apagat

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

[Dill. 15 jul. 14: 08: 38.259870 2019] [mpm_event: aviso] [pid 1: tid 139974087980160] AH00489: Apache / 2.4.39 (Unix) configurat: reprèn les operacions normals

[Dilluns 15 jul 14: 08: 38.260007 2019] [core: notice] [pid 1: tid 139974087980160] AH00094: Línia de comandaments: ‘httpd -D FOREGROUND’

[Dill. 15 jul. 14: 09: 01.540647 2019] [mpm_event: notice] [pid 1: tid 139974087980160] AH00491: SIGTERM atrapat, apagat

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

[Dilluns, 15 de juliol 14: 10: 43.782606 2019] [mpm_event: notice] [pid 1: tid 140281554879616] AH00489: Apache / 2.4.39 (Unix) configurat: reprèn les operacions normals

[Dilluns 15 jul 14: 10: 43.782737 2019] [nucli: avís] [pid 1: tid 140281554879616] AH00094: Línia de comandaments: ‘httpd -D FOREGROUND’

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

AH00558: httpd: No s’ha pogut determinar amb fiabilitat el nom de domini completament qualificat del servidor amb 172.17.0.2. Definiu la directiva “Nom del servidor” a nivell mundial per suprimir aquest missatge

[Dill. 15 jul. 14: 14: 08.270906 2019] [mpm_event: notice] [pid 1: tid 140595254346880] AH00489: Apache / 2.4.39 (Unix) configurat: reprèn les operacions normals

[Dill. 15 jul. 14: 14: 08.272628 2019] [core: notice] [pid 1: tid 140595254346880] AH00094: Línia de comandaments: ‘httpd -D FOREGROUND’

Cercant imatge

Cerqueu una imatge de docker a dockerhub amb el nom esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker cerca hadoop

NOM DESCRIPCIÓ ESTRELLES OFICIALS AUTOMATITZADES

sequenzaq / hadoop-docker Una manera senzilla de provar Hadoop 611 [D’acord]

Imatge Hadoop de uhopper / hadoop amb configuració dinàmica … 98 [D’acord]

harisekhon / hadoop Apache Hadoop (HDFS + Fil, etiquetes 2.2 – 2.8) 54 [D’acord]

bde2020 / hadoop-namenode Hadoop namenode d’un cluster hadoop 22 [D’acord]

kiwenlau / hadoop Run Hadoop Cluster en contenidors Docker 19

izone / hadoop Hadoop 2.8.5 Ecosistema completament distribuït … 14 [D’acord]

uhopper / hadoop-namenode Hadoop namenode 9 [D’acord]

bde2020 / hadoop-datanode Datanode de Hadoop d’un cluster de hadoop 9 [D’acord]

singularitats / hadoop Apache Hadoop 8 [D’acord]

uhopper / hadoop-datanode Hadoop datanode 7 [D’acord]

haacheekhon / hadoop-dev Apache Hadoop (HDFS + fil) + Dev Tools + Gi … 6 [D’acord]

Actualització de la configuració

Actualitzar la configuració del contenidor. Això mostra totes les opcions d’actualització.

[correu electrònic protegit]: / home / geekflare $ docker actualització –help

Ús: actualització del docker [OPCIONS] CONTENIDOR [CONTENIDOR …]

Actualitzar la configuració d’un o més contenidors

Opcions:

–blkio-weight uint16 Bloc IO (pes relatiu), entre 10 i 1000, o 0 per desactivar

(predeterminat 0)

–cpu-period int Limitar el període CFS de la CPU (completament just programador)

–cpu-quota int Limita la quota del CFS de CPU (completament just programador) de la CPU

–cpu-rt-period int Limita el període de temps real de la CPU en microsegons

–cpu-rt-runtime int Limita la durada del temps d’execució de la CPU en microsegons

-c, –cpu-comparteix accions de CPU int (pes relatiu)

–cpus decimal Nombre de CPU

–CPU de corda cpuset-cpus per permetre l’execució (0-3, 0,1)

–MEMs de la cadena de memòries cpuset per permetre l’execució (0-3, 0,1)

–nucli de memòria del nucli Límit de memòria del nucli

-m, –memory bytes Límite de memòria

–bytes de reserva de memòria Límite suau de memòria

–bytes de swap de memòria Límit de canvi igual a la memòria més swap: ‘-1’ per habilitar l’intercanvi il·limitat

–reinicia la cadena Restart policy que s’aplica quan un contenidor surti

Executeu l’ordre següent per actualitzar la configuració de la CPU del contenidor del docker amb l’identificador del contenidor esmentat a la comanda.

[correu electrònic protegit]: / home / geekflare $ docker actualització -c 1 2f6fb3381078

2f6fb3381078

Creació de volum

Creeu un volum que usarà el contenidor docker per emmagatzemar dades.

[correu electrònic protegit]: / home / geekflare $ docker volum crear

7e7bc886f69bb24dbdbf19402e31102a25db91bb29c56cca3ea8b0c611fd9ad0

Executeu la comanda següent si el volum s’ha creat o no.

[correu electrònic protegit]: / home / geekflare $ docker volum ls

NOM DEL VOLUM DEL CONDUCTOR

local 7e7bc886f69bb24dbdbf19402e31102a25db91bb29c56cca3ea8b0c611fd9ad0

Instal·lació del complement

Instal·leu un complement docker vieux / sshfs amb un entorn de depuració establert en 1.

[correu electrònic protegit]: / home / geekflare $ docker plugin instal vieux / sshfs DEBUG = 1

Connectar "vieux / sshfs" està sol·licitant els següents privilegis:

– xarxa: [host]

– mount: [/ var / lib / docker / plugins /]

– muntar: []

– dispositiu: [/ dev / fusible]

– capacitats: [CAP_SYS_ADMIN]

Teniu els permisos anteriors? [y / N] i

més recent: Tirant de vieux / sshfs

52d435ada6a4: descàrrega completa

Digest: sha256: 1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811

Estat: S’ha descarregat la imatge més recent de vieux / sshfs: més recent

Plugin instal·lat vieux / sshfs

Executeu la següent comanda per llistar els complements del docker.

[correu electrònic protegit]: / home / geekflare $ docker plugin ls

NOM D’ID Identificació DESCRIPCIÓ ACTIVADA

2a32d1fb95af vieux / sshfs: el darrer complement sshFS per a Docker true

Tancar sessió

Sortint de dockerhub.

[correu electrònic protegit]: / home / geekflare $ desconnectar del docker

Eliminació de les credencials d’inici de sessió de https://index.docker.io/v1/

Conclusió

Espero que ara entengueu una bona comprensió sobre les ordres del docker. Proveu aquestes ordres al vostre entorn de laboratori o per practicar i aprendre.

Si esteu interessats en aprendre Docker i Kubernetes, mireu-ho curs en línia.

Tags:

  • Atracador

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map