Baixe o app para aproveitar ainda mais
Prévia do material em texto
Tópicos Especiais em Redes de Computadores Material Teórico Responsável pelo Conteúdo: Prof. Dr. Vagner da Silva Revisão Textual: Prof.ª Me. Natalia Conti Containers – Docker • Docker; • O que é um Container? • O que são Imagens? • Arquitetura Docker. • Conhecer a tecnologia docker aprofundando-se nos conceitos para esclarecer as diferen- ças entre ela e o uso de máquina virtual, bem como demonstrar como é feita sua instala- ção e uso; • Estabelecer os principais conceitos de um docker para que seja possível dar continuidade ao estudo dessa tecnologia considerada emergente. OBJETIVOS DE APRENDIZADO Containers – Docker Orientações de estudo Para que o conteúdo desta Disciplina seja bem aproveitado e haja maior aplicabilidade na sua formação acadêmica e atuação profissional, siga algumas recomendações básicas: Assim: Organize seus estudos de maneira que passem a fazer parte da sua rotina. Por exemplo, você poderá determinar um dia e horário fixos como seu “momento do estudo”; Procure se alimentar e se hidratar quando for estudar; lembre-se de que uma alimentação saudável pode proporcionar melhor aproveitamento do estudo; No material de cada Unidade, há leituras indicadas e, entre elas, artigos científicos, livros, vídeos e sites para aprofundar os conhecimentos adquiridos ao longo da Unidade. Além disso, você tam- bém encontrará sugestões de conteúdo extra no item Material Complementar, que ampliarão sua interpretação e auxiliarão no pleno entendimento dos temas abordados; Após o contato com o conteúdo proposto, participe dos debates mediados em fóruns de discus- são, pois irão auxiliar a verificar o quanto você absorveu de conhecimento, além de propiciar o contato com seus colegas e tutores, o que se apresenta como rico espaço de troca de ideias e de aprendizagem. Organize seus estudos de maneira que passem a fazer parte Mantenha o foco! Evite se distrair com as redes sociais. Mantenha o foco! Evite se distrair com as redes sociais. Determine um horário fixo para estudar. Aproveite as indicações de Material Complementar. Procure se alimentar e se hidratar quando for estudar; lembre-se de que uma Não se esqueça de se alimentar e de se manter hidratado. Aproveite as Conserve seu material e local de estudos sempre organizados. Procure manter contato com seus colegas e tutores para trocar ideias! Isso amplia a aprendizagem. Seja original! Nunca plagie trabalhos. UNIDADE Containers – Docker Docker O docker é uma tecnologia de virtualização, porém não é uma virtualização como conhecemos das plataformas de forma tradicional. Ao virtualizar um siste- ma operacional utilizando um aplicativo como o VMWare, VirtualBox ou outros middlewares, permitimos que cada sistema operacional instalado nessa máquina virtual utilize o hardware de forma isolada. Ao instalar um sistema operacional Linux como máquina virtual, proporciona- mos que ele tenha a utilização do hardware única e exclusivamente durante um de- terminado tempo. Nessa virtualização ele considera que tem um processador, uma memória e os dispositivos de entrada e saída somente para ele. Portanto, ele tem suas próprias bibliotecas, seus arquivos binários e seu próprio sistema de arquivo para executar as aplicações de cada máquina virtualizada. Quanto mais virtualizamos mais desacoplados estaremos, isso significa que tere- mos mais flexibilidade no uso dos recursos físicos da máquina, como elasticidade no uso de memória, processamento e armazenamento. Essa característica já é obtida pela utilização da máquina virtual. O docker não trabalha com esse tipo de virtualização a qual estamos acostuma- dos a ver e usar, ele é uma engine que administra os containers criados e, além de fornecer todos os recursos que a virtualização tradicional oferece, utiliza menos recursos que a virtualização de plataformas. Para entender qual o objetivo de um docker devemos primeiro entender o que é um container. Um container é um processo isolado e a partir dele podem-se executar as aplica- ções de forma isolada. Ele é associado a um sistema de arquivo isolado e precisa de vários recursos da máquina host, ou seja, da máquina na qual esse container está sendo executado. Ele não é executado totalmente independente da máquina host como é o caso da virtualização de plataformas. É considerado um host a máquina com um sistema operacional para gerenciá-la, ou seja, esse sistema operacional tem todos os recursos para fazer o gerenciamento da máquina. Ex: computador com um sistema operacional Windows instalado. Ex pl or Um container compartilha algumas bibliotecas da máquina host, ele usa alguns binários e bibliotecas que já estão na máquina e essa característica faz com que um container necessite de pouco espaço de memória. Além disso, ele inicializa mais rápido se considerarmos uma máquina virtual que tem suas próprias bibliotecas e binários. What’s LXC? Disponível em: http://bit.ly/2M7DjdD Ex pl or 8 9 O docker utiliza as características do serviço LXC (Linux Containers), isso sig- nifica que os containers deverão ser baseados na plataforma Linux. Considerando que o container usa alguns recursos da máquina host, então eles deverão ser exe- cutados em sistemas operacionais Linux. Sendo assim, pode-se executar container baseados em Debian, Ubuntu ou outras distribuições em que o kernel é Linux. É possível ter controle sobre a quantidade de memória ou CPU que um container possa utilizar; ele tem um endereço IP próprio e permite acesso utilizando-se desse endereço ou de uma porta, além de ser possível definir a quantidade de tráfego de pacotes que ele poderá usar. Pelo isolamento que oferece os processos criados só poderão atuar dentro desse container; no entanto é possível criar vários containers e estabelecer comunicação entre eles. Server Máquina Física Sistema Operacional Sistema Operacional DockerHypervisorApp1 App2 App3 VM1 App + SO App + SO App + SO App App App VM2 VM3 Sistema Operacional Máquinas Virtuais Containers Server Server Figura 1 – Host, Máquina virtual e Docker Fonte: Adaptado de VITALINO, 2016 Conforme pode ser observado na figura 1, temos um exemplo de máquina nativa ou host (Máquina Física), uma máquina virtualizada com alguns sistemas operacio- nais e, por último, um container. Pela figura 1 é possível identificar que o modelo de máquina virtual possibilita que tenhamos vários sistemas operacionais sendo executados sobre a camada de virtualização (Hypervisor). No modelo de containers temos o docker sendo execu- tado sobre o sistema operacional Linux. No modelo de containers não temos a camada hypervisor e sim a engine que vai gerenciar os containers criados. Outra mudança de características entre container e Máquina virtual está na camada mais acima, perceba que há vários sistemas operacionais no modelo de máquina virtual; essas máquinas são inicializadas isola- damente cada qual utilizando uma quantidade de memória para gerenciar os pro- cessos de cada aplicação que estiver sendo executada. 9 UNIDADE Containers – Docker Ao utilizar máquina virtual, todo sistema operacional inicializado de forma virtualizado deverá fazer toda a sua carga contendo o seu núcleo para gerencia- mento de todos os recursos físicos da máquina. Para cada sistema operacional virtualizado, ao ser inicializado, deverá fazer toda sua carga, isso exige bastante memória principal e cada sistema operacional criará processos para as aplicações que foram inicializadas. No modelo container não há vários sistemas operacionais e sim a aplicação que é executada sobre um container, podendo cada uma delas ser executada em um container diferente, cada uma com seu sistema de arquivo isolado compartilhando o mesmo núcleo da máquina host. Você pode ter o host baseado na distribuição Linux Red Hat e iniciar um container baseado na distribuição Linux Ubuntu. Perceba que você terá um container baseado na distribuição que escolheu para quesuas aplicações (container) sejam executadas, no entanto ela compartilhará o núcleo (bibliotecas e binários) da máquina host com outros containers criados. Se torna muito mais rápido inicializar processos para serem executados nos containers em relação a ter que inicializar o sistema operacional inteiro como acon- tece nas máquinas virtuais. A tecnologia docker não é considerada nova, antigamente era possível utilizá-la, no entanto sua manipulação era muito complexa por não existirem ferramentas que facilitassem o seu uso. Atualmente já existem ferramentas que ajudam o administra- dor no uso dessa tecnologia, há uma interface de linha de comando (CLI) para que se possa comunicar com o docker daemon. Outra forma está no uso de uma API REST para que o administrador possa manipular e consumir os serviços do docker. Há dois principais conceitos vinculados ao docker, um deles refere-se ao container e o outro refere-se à imagem, vamos ver cada um deles. O que é um Container? Segundo Vitalino, 2016 container é, em português claro, o agrupamento de uma aplicação com suas dependências, que compartilham o kernel do sistema operacional host, ou seja, da máquina (seja ela virtual ou física) onde está rodando. Ele tem processos segregados, tem um sistema de arquivo isolado e tem um sistema de arquivo criado a partir de uma imagem. Os processos criados em um container podem criar processos filhos, e cada pro- cesso pode ser criado por uma aplicação que pode ser um banco de dados, um servi- dor HTTP ou outras aplicações que sejam de necessidade do usuário. É interessante criar um container por aplicação, assim você terá cada um deles isolado mantendo uma organização maior e podendo escalar cada um deles de forma independente. Dentro desse ambiente isolado que sua aplicação executa, todas as suas depen- dências como biblioteca e binários estarão nesse container. Essa característica nos 10 11 dá um processo isolado com o seu sistema de arquivo também isolado usando o mesmo núcleo do host. Segundo Vitalino, 2016 o propósito da máquina virtual é emular um novo siste- ma operacional dentro do sistema operacional do host. Já o propósito do container é emular somente as aplicações e suas dependências e torná-las portáteis. O que são Imagens? Uma imagem é um modelo de sistema de arquivo criado para criar um container. Conforme já descrito, um container tem processos que são usados para executar uma aplicação e eles estão na memória principal. A imagem é um arquivo que contém a descrição sobre um modelo de sistema de arquivo somente leitura para execução de uma aplicação que pode ser um servidor apache ou qualquer outra aplicação necessária para o usuário. Um dos itens interessantes é a possibilidade de usar imagens criadas por outras pessoas ao redor do mundo. Você pode criar e armazenar sua imagem na internet, o principal repositório chama-se Docker Hub. Ele é um repositório público e pri- vado que disponibiliza diversos recursos. Além de armazenar, você pode usar os containers que foram disponibilizados, isso agiliza muito a configuração e o uso de determinadas aplicações. Repositório de containers, disponível em: https://dockr.ly/2KAeFzm Ex pl or A figura 2 apresenta a página em que são apresentados alguns containers. Figura 2 – Página docker hub Fonte: Reprodução Como pode ser observado na figura 2, há containers que podem ser baixados, embora na figura 2 tenham apenas duas imagens, há outras várias delas que po- dem ser exploradas e baixadas. 11 UNIDADE Containers – Docker Arquitetura Docker O Docker utiliza uma arquitetura cliente/servidor, o cliente do docker solicita ao docker daemon uma ação que pode construir, executar ou distribuir os containers. A figura 3 apresenta a arquitetura. Figura 3 – Arquitetura Docker Fonte: Adaptado de Wikimedia Commons O cliente e o docker daemon podem ser executados no mesmo sistema ope- racional ou então o cliente pode conectar a um docker daemon usando linha de comando (CLI), API REST, sockets ou uma interface de rede. Como pode ser observado na figura 3 uma das possibilidades de comunicação pode ser feita pelo cliente ao docker daemon que solicitará a imagem ao registry na internet. Nesse caso é feito o download dessa imagem para a máquina host e a partir dessa imagem será construído o container. Outra forma para a comunicação com o docker daemon é a utilização de fer- ramentas gráficas como o kitematic, ele é open source e por ser uma ferramenta gráfica ele facilita o processo de instalação e configuração do Docker, além de for- necer algumas interfaces intuitivas para execução e criação de containers. Ferramenta gráfica, disponível em: http://bit.ly/2Kvcjle Ex pl or Instalação A instalação do docker pode ser feita em sistema operacional Windows, Mac ou Linux. Para fazer a instalação no Windows é necessário baixar o instalador disponível no site, no entanto essa instalação somente irá funcionar se o sistema 12 13 operacional for o Windows 10 com a versão “Windows subsytem for Linux”, essa versão possibilita executar programas nativos do sistema Linux no Windows sem a necessidade de instalar o Linux. Caso seu sistema operacional não tenha essa atualização, você poderá fazê-la ou então instalar o docker em uma máquina virtual Linux ou em um host Linux, ou seja, em uma máquina que o sistema operacional seja o Linux. Nessa simulação iremos instalar o docker em um sistema operacional Linux instalado como máquina virtual. Usaremos a distribuição Ubuntu 19.04 instalada como máquina virtual no aplicativo VirtualBox. A instalação do docker será feita usando o terminal para digitação dos comandos. O primeiro comando que será executado fará a atualização do Linux. A figura 4 apresenta este comando. Figura 4 – Atualização do Linux Vamos executar os comandos da figura 5 para que sejam instalados alguns pacotes. Figura 5 – Instalação de pacotes O próximo passo está em adicionar o repositório do docker utilizando o coman- do da figura 6. Figura 6 – Adicionando repositório do Docker Vamos adicionar ao apt-repository o caminho para baixar atualizações e paco- tes do docker. A figura 7 apresenta o comando. Figura 7 – Adicionando caminho para atualizações Na sequência faremos novamente uma atualização executando o comando apre- sentado na figura 8. Figura 8 – Executando atualização 13 UNIDADE Containers – Docker Agora sim vamos executar o comando para instalar o docker, a figura 9 apre- senta o comando para instalação. Figura 9 – Executando a instalação do Docker Para verificar se o docker está instalado você pode executar o comando “docker --help” e será apresentado os comandos utilizados para manipulação do docker. Vamos executar o comando da figura 10 para verificar se tudo foi instalado de forma correta. Ao aplicar o comando será apresentada uma resposta descrevendo que a instalação foi bem-sucedida. Conforme pode ser observado na figura 10 foram executados alguns passos como: o cliente enviou uma solicitação ao docker daemon; o docker daemon bai- xou o “hello-world” do docker hub; o docker daemon criou um novo container e; o docker daemon enviou uma resposta para o cliente. Figura 10 – Hello World Detalhes da instalação no Ubuntu 19.04, disponível em: http://bit.ly/2Ky2HpX Ex pl or O comando “run” tem vinculado a ele quatro operações, a primeira refere-se a baixar a imagem do repositório (registry) para a máquina; criar o container; inicia- lizar o container e fazer a execução dele. Vamos fazer mais alguns testes utilizando o comando “run”, vamos baixar duas imagens do bash, a primeira refere-se ao bash da distribuição Ubuntu e a segunda ao bash da distribuição debian. Primeiramente execute o comando apresentado na figura 11, esse comando irá criar um container a partir de uma imagem relacionada ao bash Ubuntu. Figura 11 – Container para o bash Ubuntu 14 15 Agora utilizando o comando da figura 12 verifique a versão do bash da imagem que foi baixada. A opção«-i» é utilizada para o modo interativo e a «-t» faz você entrar no modo terminal do container, observe que o prompt é alterado após esse comando, indicando que você está usando o bash do container criado. Figura 12 – Versão para o bash Ubuntu Observe que a imagem do bash Ubuntu baixada tem a versão 4.4.19. Vamos agora baixar e executar a imagem do bash debian, para isso execute o comando apresentado na figura 13. Figura 13 – Versão para o bash debian Na figura 13 pode-se observar a versão do bash debian 4.4.12 e logo após o comando “bash –version” a versão 5.0.3(1) que está sendo executada no host. Resumindo, nos testes executados anteriormente baixamos duas imagens do registry, uma Ubuntu e outra Debian, verificamos a versão do bash das duas imagens e ainda verificamos a versão do bash do host, cada uma apresentando uma versão diferente. Esse teste que foi feito conceitua o que foi descrito como container, pois ao bai- xarmos as imagens do bash utilizando o comando “run” foi criado um container para o bash Ubuntu e um container para o bash debian, cada qual com sua versão. Ao executar novamente o mesmo comando “run”, a resposta é instantânea, pois não será mais necessário baixar a imagem, ela já estará na cache local. É essa a ca- racterística que faz do container uma solução mais leve que utiliza menos recursos que a máquina virtual. Os comandos utilizados para manipulação do docker têm semelhanças aos utili- zados no terminal bash do host, vamos fazer uma listagem dos containers que foram manipulados até agora, para isso execute o comando apresentado na figura 14. 15 UNIDADE Containers – Docker Figura 14 – Processos relacionados aos containers O comando “ps” apresenta os processos ativos, a opção “-a” apresenta os pro- cessos que foram baixados. Sem a opção “-a” não aparecerão os processos, pois os processos relacionados aos containers foram executados e encerrados. Um ponto importante que deve ser esclarecido sobre o comando “run” é que cada vez que ele é executado um novo container é criado mesmo que seja execu- tado o mesmo comando. Veja o exemplo a seguir, na figura 15 há a execução do comando “run” com a opção “-t” para ele entrar no terminal do container criado. Figura 15 – Exemplo do comando “run” container f1710da9ea11 Observe na figura 15 que o cursor foi alterado indicando que estamos no container criado. Nesse container foi criado o arquivo com o nome “arq”, ele é apresentado como primeiro item após a execução do comando “ls -s”. Vamos executar o mesmo comando “run” utilizado anteriormente, a figura 16 apresenta a execução do comando. Figura 16 – Exemplo do comando “run” container c403d7155edb Observe que executando o mesmo comando o arquivo criado “arq” não apa- rece nesse container após a execução do comando “ls -l”, indicando que são containers diferentes. 16 17 Como você deve ter observado é importante definir um nome para o container para que este tenha nomes sugestivos e possa ser reaproveitado. A figura 16 apre- senta o comando. Figura 17 – Criação de um container defi nindo um nome Observe na figura 16 que aplicando o comando pela primeira vez não é apre- sentado erro e o cursor se altera indicando que estamos dentro do container criado. Ao sair do container e tentar criar outro com o mesmo nome há uma mensagem de erro retornando que não é possível criar, pois já tem um container com o nome escolhido. Você deve estar se perguntando: “Como faço então para reutilizar um container?”. É exatamente isso que iremos fazer, já criamos um container com o nome “bashdebian” e vamos iniciá-lo. A figura 17 apresenta o comando. Figura 18 – Iniciando o container Como pode ser observado na figura 17, além de iniciar o container “bashdebian” foi criado um arquivo chamado “arquivo_debian.txt” e ao listar os arquivos e dire- tórios com o comando “ls” ele é o primeiro da lista. Saia do container conforme comando apresentado na figura 18. Figura 19 – Iniciando o container Observe que ao sair do container e executar o comando novamente você con- segue entrar nele e ao listar pode-se ver o arquivo criado. Cada container criado, conforme conceito já definido, tem seu isolamento tanto em relação ao núcleo do sistema operacional como também de outros containers, embora ainda use recursos do núcleo do host. Em muitos casos os containers devem se comunicar. Imagine que você inicie um banco de dados em um container e em outro você inicie um cliente para consumir os recursos desse banco de dados. Os containers devem oferecer formas de se comunicar. O isolamento que os containers oferecem devem ser controlados, ou seja, deve ser possível o acesso a serviços que estão sendo executados em outros containers. Vamos avaliar como pode ser feito esse compartilhamento, para isso vamos baixar 17 UNIDADE Containers – Docker um servidor http conhecido como nginx. A figura 19 apresenta o comando para baixar a imagem. Figura 20 – Container executando um servidor http O comando apresentado na figura 19 define que o servidor nginx será exposto para fora do container pela porta 8080, ou seja, o servidor http que foi inicializado em container será acessado por clientes externos ao container pela porta 8080 e a porta 80 é a porta na qual nginx será inicializado internamente, por padrão ele já é inicializado nessa porta. Após a execução do comando o servidor será inicializado. Abra outro terminal para fazer um teste e execute o comando da figura 20. Figura 21 – Verificando informações do servidor nginx Conforme pode ser observado na figura 20, as informações do ngnix são apresen- tadas com as tags HTML. Outra forma de verificar essas informações é pela “url” de um browser, a figura 21 apresenta o endereço da “url” e a resposta do servidor http. Figura 22 – Verificando informações do servidor nginx pelo browser Já que temos um processo sendo executado (o do servidor HTTP) vamos aplicar o comando para verificar os processos que estão ativos. A figura 22 apresenta o comando e a resposta. 18 19 Figura 23 – listando os processos ativos Observe que as informações do processo são apresentadas após a execução do comando. Como pode ter notado, ao executar o comando para ativar o servidor http tivemos que abrir outro terminal para executar os comandos, pois o terminal ficou “preso”. Há outra forma de executar o comando para ativar o servidor ou qualquer outro serviço em background e continuar usando o terminal normalmente sem ter que abrir outro. A figura 23 apresenta o comando e o resultado da execução dele. Figura 24 – Executando servidor http em background Conforme pode ser observado na figura 23 a opção “-d” define que a execução do servidor será na forma de daemon, ou seja, em background. Para esse container foi também vinculado um nome “serv_http”. Perceba também pela figura 23 que o prompt aparece normalmente para digitação dos comandos. Para parar o serviço basta executar o comando “stop” associado ao nome do serviço que deseja parar. A figura 24 apresenta o comando. Figura 25 – Parando serviço Ao executar o comando “stop”, conforme apresentado na figura 24, o serviço irá pa- rar. Ao listar os processos que estão ativos, verá que não será listado nenhum processo. O docker oferece uma série de comandos que foram reformatados para melhor definir a execução de comandos containers, de imagens e volume. Essa organiza- ção atual de aplicação de comandos, embora seja mais longa, define bem cada um deles. A figura 25 apresenta os comandos para o help de “volume” e “image”. Figura 26 – Comando help para volumes e imagens 19 UNIDADE Containers – Docker Vimos que utilizando o comando “run” as imagens são baixadas antes de serem inicializadas e executadas. Ao baixar as imagens elas ficam na cache, para verificar quais imagens foram baixadas utilize o comando da figura 26. Figura 27 – Listando as imagens Há outros comandos aplicados às imagens que podem ser usados para manipu- lá-las. A tabela 1 apresenta alguns deles.Tabela 1 Comando Descrição docker image ls Usado para listar as imagens que estão na cache. docker image inspect Apresenta informações da imagem semelhante ao formato apresentado no JSON. docker image rm Usado para remover imagens que estão inseridas na cache. docker image build Usado para gerar uma imagem do container. docker image push Usado para publicar a imagem no repositório local ou externo. docker image pull Usado para baixar a imagem diretamente do repository. Esse comando apenas carrega a imagem para a cache, ele não inicializa e nem executa. Como observado nos exemplos descritos anteriormente, os containers executam processos referente a uma aplicação e tem o isolamento necessário para manter a segurança. Ao se criar um container para uso em servidores, eles devem estar em background com todas as definições já feitas em relação a compartilhamento e uso de recursos. Vários outros recursos estão disponíveis para manipulação de containers ima- gens e volumes e devem ser pesquisados de acordo com a necessidade. 20 21 Material Complementar Indicações para saber mais sobre os assuntos abordados nesta Unidade: Leitura Como Instalar e Configurar o Docker no Ubuntu 18.04 Veja como instalar docker linux ubuntu 18.04. http://bit.ly/2Mact4z O que é Docker? No link abaixo você tem mais detalhes sobre Docker. https://red.ht/2MacxkP Porque apostar em docker e containers Veja uma opinião sobre o assunto. http://bit.ly/2KMBS1t Implante contêineres do Docker Passo a passo para usar o container da Amazon. https://amzn.to/2KsQe6E 21 UNIDADE Containers – Docker Referências NEMETH, E.; SNYDER, G.; HEIN, T.; FORESTI, N. Manual completo do Linux: guia do administrador. 2. ed.-. São Paulo: Pearson Education do Brasil, 2007. VITALINO, J. F. N.; CASTRO M. A. N. Descomplicando o Docker. Brasport Li- vros e multimídia Ltda, Rio de Janeiro, 2016. Sites visitados <https://www.docker.com/>. 22
Compartilhar