E aí, pessoal! Tenho a oportunidade de escrever este post pra fazer uma introdução ao Docker. Ao final, espero conseguir que vocês sejam capazes de entender os conceitos de: Docker, Images, Containers, DockerHub e Dockerfile.
Introdução ao Docker
Docker é um framework de conteinerização que nos permite criar ambientes de desenvolvimento comuns para nossos times de desenvolvimento e infraestrutura, de maneira que possamos fazer o deploy das nossas aplicações com maior facilidade de forma automatizada.
As ferramentas que o Docker fornece nos permite ter agilidade, controle e portabilidade na gestão de ambientes, sendo possível simular ambientes com vários serviços (Ex. MySQL, PHP, Solr, etc) onde cada serviço é representado por um container.
O Docker utiliza funcionalidades de isolamento de recursos do Kernel de Linux, como cgroups e namespaces para que os containers possam ser executados isoladamente no SO. Isso significa que cada container é executado em um processo separado. O benefício do container ser um processo é que esse processo consome os recursos nativos do hardware sem virtualização. O processo é virtualizado, mas o processamento não é virtualizado.
O suporte no Windows e Mac do Docker atualmente é nativo, sendo que no Windows usa-se Hyper-V e no Mac xhyve para virtualizar o ambiente de Docker Engine e as características do kernel de Linux para o Docker daemon.
Imagem e Container
Uma imagem refere-se a uma lista de camadas, que são empilhadas uma acima da outra, as quais formam a base do container. Note que a imagem é imutável, mas facilmente estendida.
O container, por outro lado, é uma instância no tempo de execução de uma imagem. Quando um novo container é criado, uma nova camada de escrita é criada no topo das camadas adjacentes. Todas as alterações feitas no container em execução são feitas na mesma.
Uma vantagem dos containers Docker é a portabilidade, pois nos permite utilizar a mesma imagem em diferentes distribuições Linux com configurações distintas de hardware sem alterar as imagens.
Docker Hub
O lugar ideal para encontrar imagens atualizadas e com suporte oficial é o DockerHub, devido à popularidade do Docker. Esta plataforma tem repositórios oficiais de MongoDB, Redis, Nginx, WordPress entre outros, prontos para serem utilizados. Além disso, nesta plataforma, você poderá criar repositórios para suas imagens, se assemelhando ao GitHub, onde você pode criar múltiplos repositórios públicos, mas apenas um repositório privado. No caso de você precisar de mais, existe a possibilidade de pagar uma assinatura.
Comandos básicos de Docker
Listar imagens
docker images
Baixar uma imagem
docker pull image_name
* Pode-se utilizar dois pontos para definir uma versão específica da imagem.
docker pull image_name:version
Apagar imagens
docker rmi image_name
Criar e iniciar um container, executar um comando
docker run -it --name container_name image_name command
Exem.:
docker run -it --name my-container node bash
Criar e iniciar um container, executar comando e destruir o container
docker run --rm -it --name my-container node bash
* É recomendável utilizar o parâmetro —rm , desta forma o container é removido automaticamente quando você sai dele, evitando ter containers zumbis.
Listar containers
Para listar os containers em execução
docker ps
No caso de precisar ver todos os containers existentes só adicionar -a
docker ps -a
Apagar um container
docker rm container_name
Matar todos os containers em execução
docker kill $(docker ps -q)
Eliminar todos os containers suspensos
docker rm $(docker ps -a -q)
Obter o IP de um container
docker inspect container_name
Dockerfile
Agora é o momento de criar nossas imagens custom e, para isso, utilizaremos Dockerfile, um arquivo de texto que contém todos os comandos que escrevemos manualmente quando criamos nossos ambientes, só que agora vamos utiliza-lo para construir uma imagem. O Docker cria as imagens lendo as instruções definidas nos arquivos Dockerfile.
Alguns comandos do Dockerfile, para mais detalhes podem ser consultados na documentação de Dockerfile.
FROM
MAINTAINER
ADD
COPY
ENV
EXPOSE
LABEL
USER
WORKDIR
VOLUME
STOPSIGNAL
ENTRYPOINT
Todo Dockerfile começa definindo qual é a imagem que vai ser utilizada como base.
Exemplo de um Dockerfile:
#file: Dockerfile
FROM node:5.2 RUN npm install bower -g RUN npm cache clear ADD ./docker-entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh CMD [ “bash” ] ENTRYPOINT [ “/entrypoint.sh” ]
O entrypoint define ações que serão executadas sempre que um container novo for criado, sendo muito utilizado para criar usuários, grupos e permissões via variáveis de ambiente.
Ao levantar o container, se declara as variáveis –env, e o entrypoint faz o resto. Ambientes como MYSQL o utilizam para criar bancos de dados, definir senhas e etc.
entrypoint.sh #!/bin/bash echo “” echo “———————————“ echo “Virtual machine ready to work.” echo “———————————“ exec “$@”
Para construir a imagem a partir de um Dockerfile é só executar o seguinte comando:
docker build -t image_name .
Bom isso é tudo por hoje, nos próximos posts nos aprofundaremos na utilização de Dockerfile e Docker Compose.
Referências
http://stackoverflow.com/questions/23735149/docker-image-vs-container
https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
https://denibertovic.com/talks/supercharge-development-env-using-docker/#/2
https://docs.docker.com/engine/reference/glossary/#container
https://docs.docker.com/engine/getstarted/step_four/
https://docs.docker.com/engine/getstarted/step_six/
https://docs.docker.com/opensource/project/set-up-dev-env/
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
https://www.upguard.com/articles/docker-vs-lxc
https://docs.docker.com/engine/reference/builder/
https://www.digitalocean.com/community/tutorials/docker-explicado-como-crear-contenedores-de-docker-corriendo-en-memcached-es
http://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-normal-virtual-machine
https://openwebinars.net/docker-que-es-sus-principales-caracteristicas/