[@PR1V8] Docker - Containers em Linux
@pr1v8 - admÍndice:
1. O que é um Container
2. Pré requisitos / Instalação / Administração
O que é um container?
Fazendo o paralelo com uma VM, que é um recurso de virtualização bastante utilizado hoje em dia, normalmente, quando precisamos fazer um teste em um servidor web nós subimos uma VM e junto a ela são virtualizados uma memória, uma CPU, um HD, uma interface de rede e toda uma máquina por completo.
Precisamos ainda sobre isso, adicionar um sistema operacional, que com ele, traz o kernel e todos os serviços e processos que vêm juntos com o sistema operacional. Lembrando que ainda nem adicionamos o Apache ou Nginx para iniciarmos nossos testes.
Agora, tendo em vista que nosso objetivo final é fazer teste em servidor web, não seria muito mais lógico e rápido, virtualizar apenas o serviço de servidor web?
É claro que a resposta dessa pergunta é sim, e um dos "caras" que faz isso é o Docker. Existem outros serviços de containers no mundo NIX, porém o que mais vem se destacando é o Docker.
Sendo assim, resumindo bem todos os "textões" explicando containers, a função dele é virtualizar a sua aplicação, economizando tempo, recursos e também, tornar a lenda do "na minha máquina não funciona" praticamente extinto. Ficou claro?
Então abre o shell e vamos iniciar.
Pré requisitos / Instalação / Administração
Pré requisitos:
- CPU 64bits
- Kernel acima do 3.8
Obs.: no meu caso, estou utilizando o Debian 8. Isso não é pré requisito, apenas os dois itens acima.
Instalação:
Instalando o Docker:
curl -fsSl https://get.docker.com/ | sh
Aguarde o download e após a instalação, rode o comando:
docker --version
Docker version 1.11.1, build 5604cbe
Obs.: o comando docker é apenas uma CLI (Command-line), que é utilizado para interagir/intermediar com o daemon Docker.
Administrando Containers:
Vamos começar nossa administração de containers, porém, vamos adotar desde o início a seguinte nomenclatura "DockerHost". Toda vez que for citado DockerHost, eu estou me referindo a máquina Host, máquina matriz por assim dizer. Então, guarde isso.
Rode o comando abaixo para visualizar containers em execução:
docker ps
Neste exemplo não mostra nenhum container rodando, obviamente, pois acabamos de instalar o Docker. Porém, é importante entendermos a saída desse comando antes de iniciar nosso primeiro container.
A seguir, vou detalhar essas opções:
- CONTAINER ID => ID de identificação do container em execução (você vai entender melhor ao decorrer, apenas grave isso)
- IMAGE => Imagem utilizada pelo container.
- COMMAND => Comando em execução.
- CREATED => Data de criação do container
- STATUS => Por quanto tempo esta UP.
- PORTS => Porta e protocolo em que o container esta executando.
- NAMES => Nome do container em execução.
Agora vamos subir nosso primeiro container:
docker run -ti debian /bin/bash
Entendendo o comando:
- docker => CLI;
- run => executar um container;
- -ti => terminal interativo;
- debian => imagem utilizada pelo container.
Note que, ao executar esse comando, o docker vai buscar a imagem especificada lá no DockerHub (depois veremos quem é esse cara), no caso "debian", poderia ser qualquer outra distro, Ubuntu, CentOS, enfim...
Baixe essa imagem para o seu DockerHost e execute um container com essa imagem. Ao fim do comando, você deve estar em um terminal com alguns caracteres embaralhados, mais ou menos como no exemplo abaixo:
root@623424074d6e:/#
Isso significa que você já está dentro do container. Rode comandos como:
ip addr show
Ou:
apt-get update
... e veja que a saída de IP não corresponde ao IP utilizado pelo seu DockerHost, pois esse é o IP utilizado pelo container.
Agora vamos sair do container. Para isso utilize a seguinte combinação de teclas: Ctrl+p+q
Pronto, agora você voltou para o seu DockerHost. Não saia do container com "logout", "exit", "Crtl+c"... Isso vai fazer com que o container "morra". Para sair do container e ele permanecer ativo, rodando, utilize a combinação de teclas acima.
Para saber se o container está mesmo executando, rode o comando:
docker ps
A saída vai ser a mesma utilizada anteriormente, porém, com as informações que detalhei no inicio preenchidas, veja no meu caso como ficou:
Agora vamos imaginar que por algum motivo, eu preciso voltar para o meu container:
docker attach container-id
docker attach 623424074d6e
Após rodar o comando, veja que você voltou para o container, seu terminal voltou a ficar com os caracteres embaralhados, que geralmente corresponde ao seu container-id.
Observe que, se você instalou algum pacote ou simplesmente testou o ping contra algum site, a internet funcionou normalmente. Para entender isso, saia do seu container sem matar ele (Crtl+p+q).
Agora, no seu DockerHost, rode o comando:
ifconfig
... e verifique se na saída do comando apareceu uma interface chamada: docker0
Com certeza apareceu e é essa interface que faz um bridge entre o seu DockerHost e os containers, e vice-versa. Por isso, você consegue pingar do seu DockerHost no IP do seu container, e do seu container consegue pingar no IP do seu DockerHost.
Seguindo com a administração de containers, não é preciso estar dentro de um container para rodar alguns comandos, você consegue executar comandos sem entrar no container através do "docker exec".
Veja um exemplo:
docker exec container-id ip addr show
É possível também parar um container sem entrar nele e rodar um "exit". Por exemplo, para isso utilize o "docker stop":
docker stop container-id
Após parar o container rode o comando:
docker ps
... e veja que não há mais nenhum container em execução.
Mas, e se você precisa ou quer subir o container novamente, por algum motivo você se apegou a ele e após para-lo se arrependeu, e pra completar, não lembra mais o container-id do container?
Para isso, rode o comando abaixo, esse comando vai mostrar todos os container que você tem na sua máquina DockerHost. Segue exemplo:
docker ps -a
Veja a saída, pegue o seu container-id novamente e o reinicie, o container, e entre nele:
docker start container-id
docker attach container-id
Caso você tenha instalado o vim, veja que ao iniciar o container novamente, ele inicia de onde você parou, rode um history e veja os comandos que você tinha rodado. Instale outros pacotes, enfim.
Agora, saia do container, mas deixe ele executando. Após voltar para o seu DockerHost, vamos verificar o quanto esse container está consumindo da minha máquina.
docker stats container-id
A saída do comando é bem intuitiva, mostrando quanto esse container utiliza de CPU, quantidade de memória utilizada, volume de tráfego, mensura consumo de I/O e quantos processos existem executando dentro do container. Esse comando é bem importante para mensurar o consumo de seu container no seu DockerHost.
Agora, vamos ver dois comandos, o "pause" e o "unpause":
docker pause container-id
docker unpause container-id
Neste caso, acredito que nem preciso especificar o que cada um faz. Rode novamente o comando "docker ps" e veja que na saida "NAMES", vem algum nome pré-definido pelo próprio docker. Porém, caso você queira especificar o nome de um container, utilize o "--name".
Exemplo:
docker run -ti --name bob debian
Saia do container sem fechá-lo e no seu DockerHost, rode o comando "docker ps", veja que no campo "NAMES", do novo container o nome "bob", especificado no comando anterior aparece:
docker ps
Agora, imagine que você não gostou do container, esse nome "bob" não te agradou ou simplesmente você quer remover um container da sua máquina. Para isso, use:
docker rm container-id
Rode o comando "docker ps" e veja se o container continua na sua máquina. Se continua, provavelmente é porque você executou o comando com o container em execução. Para forçar a remoção de um container, mesmo com ele em execução, rode o comando:
docker rm -f container-id
Para levantar mais informações sobre o seu container utilize o inspect;
docker inspect container-id
Obs.: um detalhe interessante, é que no segundo container que executamos, utilizamos a mesma imagem, porém, ao entrar no novo container e rodar o comando "vim", você vai ver que apesar de usar a mesma imagem, não temos as mesmas coisas que já configuramos no container anterior, para isso devemos salvar a imagem do primeiro container de forma que possa ser utilizada por futuros containers.
Assim, poderíamos continuar de onde paramos (se essa for sua intenção). Mas isso é uma tarefa para gerenciamento de imagens em Docker e essa tarefa vai ficar para um próximo artigo.
Por hora, se você, ainda não conhece o serviço, pratique com esses comandos para ir se familiarizando com o essa ferramenta que certamente facilitará muito seu dia a dia.
No mínimo, seus lab's vão ficar mais interessantes pois, compare o consumo de um container comparado com o de uma VM e tire suas próprias conclusões.
####
Artigo retirado de: https://www.vivaolinux.com.br/artigo/-Docker-Containers-em-Linux/ ; todos os créditos ao autor
Telegra.ph version por: https://t.me/pr1v8
####