Docker – Comandos run,commit e exec.

O Docker executa processos isolados em containers. Um container é um processo rodando em um host, o que chamamos hoje de micro serviço. Quando o comando run é executado o processo desejado é isolado em um container. O processo é isolado do host hospedeiro e cria-se para ele seu próprio file system, sua rede e toda sua arquitetura separados do host.

run

Existem duas maneiras de executar o comando run, em primeiro plano (foreground) e desanexado (detached). No modo detached passamos a opção -d e o container irá rodar em background.

Para mais detalhes sobre o comando run:

[root@notebook ~]# docker run --help 

Vamos utilizar uma imagem de Debian:

[root@notebook ~]# docker images 
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
debian                    latest              978d85d02b87        3 weeks ago         123 MB

Para rodarmos uma máquina debian utilizamos o o seguinte comando:

[root@notebook ~]# docker run -it --name=debian_tadeu 978d85d02b87 bash

A opção -i mantém o STDIN aberto e podemos ver o que está acontecendo no container;
A opção -t ou –tty aloca um terminal para o processo rodar no container;
A opção –name atribui um nome ao container;
O ID da imagem que iremos utilizar para o container;
E o comando que passamos para o container, nesse caso atribuimos um shell bash para ele.

[root@notebook ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99152accea5c 978d85d02b87 "bash" 31 seconds ago Up 29 seconds debian_tadeu

Para verificarmos o que foi adicionado, modificado ou adicionado no container:

[root@notebook ~]# docker diff 99152accea5c
C /root
A /root/.bash_history

Para rodarmos container com redirecionamento de porta utilizamos a opção -p:

[root@notebook ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian latest 978d85d02b87 4 weeks ago 123 MB
ubuntu latest 0ef2e08ed3fa 4 weeks ago 130 MB
ansible/centos7-ansible latest 688353a31fde 3 months ago 447 MB
[root@notebook ~]# docker run -it --name tadeu_debian8 -p 8081:80 debian /bin/bash

Todo o trafégo da porta 8081 do meu host será redirecionado para a porta 80 do container. No container:

root@f97169a40367:/# apt-get install nginx
root@f97169a40367:/# /etc/init.d/nginx start

Obs: Importante sempre sair do container com ‘Ctrl+P+Q’ para não parar o container.

Agora no Browser da máquina host é só digitar o endereço IP e a porta 8081, e será apresentado a tela do Nginx.

commit

Para não perdemos as alterações feitas nos containers podemos utilizar o comando commit:

[root@notebook ~]# docker commit f97169a40367 debian8/nginx:1.0
sha256:2684fa9139806ce40e4d19b6f2a064787d2eb1f37fa1b5ae20af9f7cb9db5fcc

E podemos subir novamente com a imagem commitada:

[root@notebook ~]# docker run -it --name tadeu_debian debian8/nginx:1.0 /bin/bash

Assim o container irá startar com todas as alterações salvas.

exec

O comando exec, como o próprio nome diz executa um comando dentro do container.

Exemplos:

[root@notebook ~]# docker exec -it tadeu_debian ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=42 time=57.257 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=42 time=55.998 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=42 time=55.895 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=42 time=55.629 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 55.629/56.195/57.257/0.628 ms

Esse exec foi executado em foreground e a saída foi para a tela, para executarmos em background:

[root@notebook ~]# docker exec -it -d tadeu_debian ping 8.8.8.8

E com o outro exec visualizamos o “ping” rodando no container:

[root@notebook ~]# docker exec -it tadeu_debian ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 20248 2664 ? Ss+ Mar29 0:00 /bin/bash
root 49 0.0 0.0 91184 1244 ? Ss Mar29 0:00 nginx: master p
www-data 50 0.0 0.0 91548 1468 ? S Mar29 0:00 nginx: worker p
www-data 51 0.0 0.0 91548 1468 ? S Mar29 0:03 nginx: worker p
www-data 52 0.0 0.0 91548 1468 ? S Mar29 0:03 nginx: worker p
www-data 53 0.0 0.0 91548 1468 ? S Mar29 0:03 nginx: worker p
root 277 0.0 0.0 6372 1556 ? Ss+ 20:19 0:00 ping 8.8.8.8
root 295 0.0 0.0 17500 2080 ? Rs+ 20:21 0:00 ps aux

Para matarmos esse processo podemos combinar dois execs com um xargs:

[root@notebook ~]# docker exec -it tadeu_debian ps aux | grep ping | awk '{ print $2 }' | xargs -I{} docker exec -i tadeu_debian kill -9 '{}'

Para visualizarmos os processos rodando do docker podemos utilizar o top:

[root@notebook ~]# docker top tadeu_debian

Obs: Precisamos nos atentar para a saída desse comando pois os PID’s são do host e não do container.

Para matarmos um container que está rodando:

[root@notebook ~]# docker kill tadeu_debian
tadeu_debian

Referências:
https://docs.docker.com/engine/reference/run/https://docs.docker.com/engine/reference/commandline/commit/
https://docs.docker.com/engine/reference/commandline/exec/