https://www.udemy.com/curso-docker/learn/v4/overview "No curso você aprenderá os principais conceitos do Docker com vários exercícios práticos, todos descritos detalhadamente na apostila que será disponibilizada no curso. Tudo que for
ministrado no curso estará disponível na apostila, e ter esse suporte a mais, será um diferencial fantástico." Mateiral do Curso/Instrutor PDF do curso Voltar ao Índice É uma ferramenta que se apoia
em recursos existentes no kernel, inicialmente Linux, para isolar a execução de processos. As ferramentas que o Docker traz são basicamente uma camada de administração de containers, baseado originalmente no LXC. Alguns isolamentos possíveis: Podemos concluir dizendo que estes recursos já existiam no kernel a um certo tempo, o que o Docker nos trouxe foi uma maneira simples e efetiva de utiliza-los. Containers Docker empacotam componentes de software em um sistema de arquivos completo, que contêm
tudo necessário para a execução: código, runtime, ferramentas de sistema - qualquer coisa que possa ser instalada em um servidor. Isto garante que o software sempre irá executar da mesma forma, independente do seu ambiente. O Docker tende a utilizar menos recursos que uma VM tradicional, um dos motivos é não precisar de uma pilha completa como vemos em Comparação VMs × Containers. O Docker utiliza o mesmo kernel do
host, e ainda pode compartilhar bibliotecas. Mesmo utilizando o mesmo kernel é possível utilizar outra distribuição com versões diferentes das bibliotecas e aplicativos. Figura 1. Comparação VMs × Containers Virtual Machine (máquina virtual), recurso extremamente usado atualmente para isolamento de serviços, replicação e melhor aproveitamento do poder de processamente de uma máquina física. Devo trocar então minha VM por um container? Nem sempre, os containers Docker possuem algumas limitações em relação as VMs:
1.3. O que são containers?Container é o nome dado para a segregação de processos no mesmo kernel, de forma que o processo seja isolado o máximo possível de todo o resto do ambiente. Em termos práticos são File Systems, criados a partir de uma "imagem" e que podem possuir também algumas características próprias.
1.4. O que são imagens Docker?Uma imagem Docker é a materialização de um modelo de um sistema de arquivos, modelo este produzido através de um processo chamado build. Esta imagem é representada por um ou mais arquivos e pode ser armazenada em um repositório. Docker File Systems O Docker utiliza file systems especiais para otimizar o uso, transferência e armazenamento das imagens, containers e volumes. O principal é o AUFS, que armazena os dados em camadas sobrepostas, e somente a camada mais recente é gravável.
1.5. ArquiteturaDe maneira simplificada podemos dizer que o uso mais básico do Docker consiste em:
Figura 2. Arquitetura do Docker 1.6. Crescimento do DockerA primeira versão do Docker é de 13 de março de 2013, tendo um pouco mais de 4 anos (na epóca que este curso foi escrito). Nestes 4 anos ele tem se tornado cada vez mais popular e uma solução real para desenvolvedores (manter o seu ambiente mais simples e próximo à produção), administradores de sistema e ultimamente para uso enterprise, sendo avaliado pelos principais players do mercado uma alternativa mais econômica em relação as soluções atuais. Em sua maioria virtualização. Voltar ao Índice Seção: 3 - Instalação (4)2.1. Docker Engine e Docker Machine
Voltar ao Índice Seção: 4 - Uso Básico do Docker (14)
3.1. Introdução ao Docker ClientConforme vimos em Arquitetura, o Docker Engine expõe uma API Rest que pode ser consumida pelas mais diversas ferramentas. A ferramenta inicial fornecida com a própria engine é o Docker Client, utilitário de linha de comando. 3.2. Hello World: Meu Docker funciona !Vamos confirmar o funcionamento do nosso Docker.
Na documentação oficial, o passo para verificação da instalação é este Hello World, porém até a publicação deste curso a documentação ainda utilizava a sintaxe antiga: docker run hello-world
Testar correto funcionamento do Docker, incluindo a recuperação de imagens e execução de containers. 3.3. Meu querido amigo runO comando run é a nossa porta de entrada no Docker, agrupando diversas funcionalidades básicas, como:
A partir da versão 1.13, o Docker reestruturou toda a interface da linha de comando, para agrupar melhor os comandos por contexto. Apesar dos comandos antigos continuarem válidos, o conselho geral é adotar a nova sintaxe.
Até a versão 17.03 (corrente na publicação do curso), ainda é possível utilizarmos a sintaxe antiga, porém precisamos pensar nela como atalhos:
3.4. Modo interativoPodemos usar containers em modo interativo, isto é extremamente útil para processos experimentais, estudo dinâmico de ferramentas e de desenvolvimento. Exemplos de Uso
Principais opções do Docker para este fim
Exercício 2 - Ferramentas diferentes
Confirmar que o conjunto de ferramentas disponíveis em um container são diferentes das disponíveis no host. Exercício 3 - run cria sempre novos containers
Demonstrar que o run sempre irá instanciar um novo container. Como vimos em Docker File Systems, o container e a imagem são armazenados em camadas, o processo de instanciar um container basicamente cria uma nova camada sobre a imagem existente, para que nessa camada as alterações sejam aplicadas. Assim sendo o consumo de espaço em disco para instanciar novos containers é relativamente muito baixo. Exercício 4 - Containers devem ter nomes únicos
Exercício 5 - Reutilizar containers
Demonstrar o uso do start em modo interativo, reutilizando um container previamente criado, além de confirmar que o mesmo consegue reter modificações em seu file system. Remover depois que executar (não salav na lista de containers) -> --rm
3.5. Cego, surdo e mudo, só que não !Um container normalmente roda com o máximo de isolamento possível do host, este isolamento é possível através do Docker Engine e diversas características provídas pelo kernel. Mas normalmente não queremos um isolamento total, e sim um isolamento controlado, em que os recursos que o container terá acesso são explicitamente indicados. Principais recursos de controle do isolamento
3.5.1. Mapeamento de portasÉ possível mapear tanto portas TCP como UDP diretamente para o host, permitindo acesso através de toda a rede, não necessitando ser a mesma porta do container. O método mais comum para este fim é o parâmetro -p no comando docker container run, o -p recebe um parâmetro que normalmente é composto por dois números separados por : (dois pontos). O primeiro é no host e o segundo é no container
Mapeamento de portas
3.5.2. Mapeamento de volumesÉ possível mapear tanto diretórios no host como entidades especiais conhecidas como volumes para diretórios no container. Por enquanto vamos nos concentrar no mapeamento mais simples, uma diretório no host para um diretório no container. O método mais comum para este fim é o parâmetro -v no comando docker container run, o -v recebe um parâmetro que normalmente é composto por dois caminhos absolutos separados por : (dois pontos). Assim como diversos outros parâmetros, o primeiro é no host e o segundo é no container. Exercício 7 - Mapear diretórios para o container
*(:Z dá permissão de escrita a pasta) 👈 Mapeamento de volumes
3.6. Modo daemonAgora sim, aonde o Docker começa a brilhar! Antes de conhecer opções mais avançadas de compartilhamento de recursos, isolamento, etc, precisamos entender como rodar os containers em background. O parâmetro -d do docker container run indica ao Docker para iniciar o container em background (modo daemon). Para entender melhor estes containers precisaremos conhecer um novo comando: docker container ps, que lista containers em execução. Exercício 8 - Rodar um servidor web em background
Execução em background
Exercício 9 - Gerenciar o container em background
Reiniciar, parar e iniciar
3.7. Manipulação de containers em modo daemonExistem diversos comandos que nos ajuda a acompanhar a execução dos containers, entre eles:
Vários comandos Docker possuem aliases, por exemplo o container ls tem os seguintes apelidos:
3.8. Nova sintaxe do Docker ClientAgora que já vimos diversos comandos, incluindo tanto a sintaxe nova quanto a velha, podemos entender os principais motivos para esta mudança e a preferência pela nova sintaxe:
Voltar ao Índice Seção: 5 - Deixando de Ser Apenas um Usuário (11)4.1. IntroduçãoAgora vamos ao conceitos necessários para deixar de apenas utilizar imagens prontas e começar a produzir nossas próprias imagens. Exemplos de uso
4.2. Diferenças entre container e imagemUtilizando uma analogia com OOP, podemos comparar um container a um objeto (instância), enquanto a imagem seria uma classe (modelo). Todos os subcomandos relativos ao container podem ser listados através do parâmetro --help, bem como imagens:
4.3. Entendendo melhor as imagensToda imagem (bem como os containers) possuem um identificador único em formato hash usando sha256. Porém seu uso não é muito prático, então para simplificar isto o docker utiliza uma tag para identificar imagens. A tag normalmente é formada por um nome, seguido de : dois pontos e depois uma versão. É extremamente comum utilizar uma versão chamada latest para representar a versão mais atual. Exemplos de tags de imagens:
Na prática uma tag é apenas um ponteiro para o hash da imagem, e várias tags podem apontar para o mesmo hash. Com isto é comum o uso de alguns apelidos nas tags, tomando como exemplo as imagens oficiais do redis. Existem 10 imagens e 30 tags. Tags do redis
fonte: https://hub.docker.com/_/redis/
4.4. Comandos básicos no gerenciamento de imagensJá usamos de maneira implícita o recurso de download de imagens docker, agora vamos entender melhor o gerenciamento de imagens. docker image pull docker image ls docker image rm docker image inspect docker image tag
docker image build -t docker image push 4.5. Docker Hub × Docker RegistryDocker Registry Docker Hub
A linha de comando possui o comando docker search para procurar imagens no Docker Hub. 4.6. Construção de uma imagemProcesso para gerar uma nova imagem a partir de um arquivo de instruções. O comando docker build é o responsável por ler um Dockerfile e produzir uma nova imagem Docker. Dockerfile
Exemplo básico de um build e sua execução. O comando build exige a informação do diretório aonde o build será executado bem como aonde o arquivo de instruções se encontra 4.7. Instruções para a preparação da imagemFROM LABEL ENV ARG
4.8. Instruções para povoamento da imagemCOPY ADD RUN Exercício 12 - Uso das instruções de povoamento
4.9. Instruções com configuração para execução do containerEXPOSE WORKDIR ENTRYPOINT CMD USER VOLUME Exercício 13 - Uso das instruções para execução do container
Neste exemplo temos um pequeno servidor web atendendo na porta 8000 e exposta via instrução EXPOSE. Também temos o uso do ENTRYPOINT e CMD definindo exatamente que processo será executado ao subir o container, podemos notar que o container consegue encontrar o run.py, por conta da instrução WORKDIR que define o diretório aonde o processo principal será executado. Ao executar o container, uma das informações colocados no log (stdout e arquivo em disco) é o usuário corrente, e podemos notar que o processo não está rodando como root e sim www, conforme foi definido pela instrução USER. Por último temos o comando VOLUME que instrui o docker a expor o diretório /log como um volume, que pode ser facilmente mapeado por outro container. Podemos verificar isto seguindo os seguintes passos:
11. Enviar Imagens para o Docker Hub (video)
Voltar ao Índice Seção: 6 - Redes (4)6.1. Visão Geral e Tipos de Redes (somente vídeo)
6.2. Rede Tipo None (Sem Rede)
6.3. Rede Tipo Bridge
6.4. Rede Tipo HostModo mais inseguro.
Voltar ao Índice Seção: 7 - Coordenando Múltiplos Containers (2)5.1. IntroduçãoComo já foi discutido um bom container Docker roda apenas um serviço, tendo um único processo principal, aplicações em geral são compostos por diversos processos específicos, como por exemplo:
Estes serviços devem rodar cada qual em seu container. Porém carrega-los um a um, não só é enfadonho como propenso a erros, sejam eles:
Para sanar este problema temos a disposição o docker-compose. 5.2. Gerenciamento de micro serviceAntes de mergulharmos nos exemplos e comandos do docker-compose, vamos entender melhor o que são microsserviços. A definition of this new architectural term The term "Microservice Architecture" has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services. While there is no precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data. — Martin Fowler, Microservices: https://martinfowler.com/articles/microservices.html Segundo Martin Fowler, microsserviços ou arquitetura de microsserviços é uma forma de design de aplicações de serviços independentes distribuíveis. Entre suas principais características:
5.3. Docker composeO Docker Compose é uma ferramenta para definir e gerenciar aplicações docker com múltiplos containers. Neste contexto os containers são chamados de serviços. Voltar ao Índice Seção: 8 - Projeto Cadastro Simples (3)1. Estrutura Inicial
2. Configurando Ambiente com Compose
3. Finalizando o CadastroVoltar ao Índice Seção: 9 - Projeto para Envio de E-mails com Workers (11)9.1. Visão GeralExemplo completo de uma aplicação com múltiplos serviços em docker. Componentes
9.2. Banco de dados
9.3. Volumes
9.4. Front-end
9.5. Filas
9.6. Proxy reverso9.7. Redes9.8. Workers9.9. Múltiplas instâncias9.10. Boas práticas — Variáveis de ambiente9.11. OverrideVoltar ao Índice |