Pressione enter para ver os resultados ou esc para cancelar.

Introdução ao Docker

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.

docker

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.

docker-filesystems-multilayer

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/