Docker

REDES DE COMPUTADORES I · 2024/1 · UFRJ

Alunos:
Anderson Costa - anderson.costa.20221@poli.ufrj.br
João Galetti - galetti.20221@poli.ufrj.br
Pedro Bolzan - pedrobolzan@poli.ufrj.br

description

Este trabalho foi totalmente produzido pelos autores que declaram não terem violado os direitos autorais de terceiros, sejam eles pessoas físicas ou jurídicas. Havendo textos, tabelas e figuras transcritos de obras de terceiros com direitos autorais protegidos ou de domínio público tal como idéias e conceitos de terceiros, mesmo que sejam encontrados na Internet, os mesmos estão com os devidos créditos aos autores originais e estão incluídas apenas com o intuito de deixar o trabalho autocontido. O(s) autor(es) tem(êm) ciência dos Artigos 297 a 299 do Código Penal Brasileiro e também que o uso do artifício de copiar/colar texto de outras fontes e outras formas de plágio é um ato ilícito, condenável e passível de punição severa. No contexto da Universidade a punição não precisa se restringir à reprovação na disciplina e pode gerar um processo disciplinar que pode levar o(s) aluno(s) à suspensão;


Introdução

O que é Docker?


Docker é um projeto open source lançado em 2013 pela DotCloud. Seu objetivo é facilitar o desenvolvimento de aplicações através do uso facilitado da tecnologia de contêineres e da virtualização a nível do sistema operacional, criando um ambiente isolado para a execução de softwares.

Motivações para o uso do Docker


Um problema clássico do desenvolvimento de aplicações são as dificuldades encontradas quando se precisa transferir a execução de uma máquina para outra, seja para um ambiente de testes ou para programação em equipe. O que torna esse processo tão difícil é justamente a causa raiz que o Docker busca resolver, com o uso dos containers é possível a criação de ambientes facilmente compartilháveis nos quais todos os requisitos para o funcionamento do software estejam presentes. Ainda assim, existem outras ferramentas semelhantes que trazem o mesmo benefício, porém o Docker se destaca não só por seu pioneirismo e consolidação no mercado, mas também por sua leveza e velocidade.


Arquitetura

A compreensão da arquitetura do Docker e do seus componentes é essencial para o uso e análise da ferramenta, sendo essa fundamentada nos conceitos a seguir:

Contêineres


Os contêineres são unidades leves e portáteis de software que encapsulam todo o ambiente necessário para executar um aplicativo, incluindo bibliotecas, dependências e configurações. Eles são isolados uns dos outros e do sistema operacional host, garantindo que cada aplicativo em um contêiner tenha tudo o que precisa para funcionar sem interferir em outros aplicativos ou no sistema operacional subjacente. Os contêineres Docker são criados a partir de imagens Docker e podem ser implantados e executados em qualquer lugar que o Docker esteja instalado, fornecendo consistência entre ambientes de desenvolvimento, teste e produção.

Imagens


As imagens no Docker são essencialmente modelos virtuais de sistemas operacionais e aplicativos, encapsulados em um formato compacto e portável. Elas são construídas a partir de um conjunto de instruções definidas em um Dockerfile, que descreve os passos necessários para configurar o ambiente necessário para executar um determinado aplicativo ou serviço. As imagens são compostas por camadas, o que permite reutilização eficiente e compartilhamento de recursos. Elas representam o estado "pronto para usar" de uma aplicação, simplificando a implantação e garantindo consistência em diferentes ambientes.

Registros


Registros Docker são repositórios onde as imagens Docker são armazenadas e compartilhadas. Eles são essenciais para a distribuição e colaboração em projetos de contêineres, oferecendo uma plataforma centralizada para hospedar e acessar imagens. Os registros podem ser públicos, como o Docker Hub, ou privados, mantidos localmente ou em serviços de nuvem, garantindo controle e segurança sobre as imagens. Essa ferramenta é essencial para a disseminação de aplicativos e serviços, permitindo que equipes colaborem efetivamente e implantem atualizações de forma rápida e confiável.

Docker Daemon


O Docker Daemon, muitas vezes referido como dockerd ou docker server, é um serviço executado em segundo plano que escuta requisições feitas a API Docker. Seu papel é gerenciar todos os recursos oferecidos pelo Docker, realizando por exemplo, a partir de comandos do usuário, a criação e manutenção de contêineres e imagens. O processo também é essencial para o estabelecimento de uma rede de comunicação entre os contêineres e o host, garantindo que as aplicações possam se comunicar entre si e com o ambiente externo.

https://miro.medium.com/v2/resize:fit:720/format:webp/1*a1Gm_9NP1eENATGdS0_A9g.png

Docker e Redes

A possibilidade de desenvolver em ambientes isolados traz muitos benefícios, mas ao mesmo tempo requer que para cada um dos contêineres, futuramente, sejam estabelecidas as conexões de rede necessárias, para que assim as aplicações possam se comunicar com outras dentro ou fora do host.

Port Mapping


O mapeamento de portas, ou port mapping, é uma técnica usada em diferentes drivers de rede do Docker para expor portas de contêineres para o host ou para outras partes da rede. Com uso do Docker Deamon, o procedimento é feito para conectar duas portas de diferentes ambientes e permitir que através desse link sejam trocadas requisições e/ou dados. Isso permite que aplicativos em contêineres sejam acessíveis para fora do contêiner ou do host, possibilitando a comunicação com outros contêineres ou sistemas externos. Por exemplo, você pode usar o mapeamento de portas para direcionar solicitações HTTP de um contêiner web para a porta 80 do host, permitindo que o aplicativo web seja acessado por clientes externos, ou mesmo realizar interações entre contêineres e/ou programas em uma mesma máquina.

Drivers de Rede


Os drivers de rede no Docker são responsáveis por configurar a rede de comunicação dos contêineres. Existem diferentes opções desses no Docker, cada um com suas características e casos de uso específicos, os principais sendo:

Bridge Network Driver: É o driver padrão usado para conectar contêineres em uma mesma máquina física. Ele cria uma rede privada virtual para os contêineres e configura um NAT (Network Address Translation) para permitir que eles se comuniquem entre si e com o host.

Macvlan Network Driver: Permite que contêineres tenham endereços MAC e IPs próprios na rede, como se fossem máquinas físicas separadas. Isso é útil para casos em que os contêineres precisam se integrar diretamente à rede física do host.

Host Network Driver: Este driver remove o isolamento da rede entre o contêiner e o host, fazendo com que o contêiner compartilhe a mesma interface de rede do host. Isso pode ser útil para aplicativos que exigem acesso direto aos dispositivos de rede do host ou alto desempenho de rede.

Overlay Network Driver: Este driver é usado para conectar contêineres em diferentes hosts em um cluster Docker Swarm. Ele cria uma rede overlay que abrange vários hosts e permite que os contêineres se comuniquem entre si, independentemente de sua localização física.

None Network Driver: É um driver disponível no Docker que desabilita completamente a rede para um contêiner. Quando este driver é utilizado, o contêiner não terá acesso à rede externa nem mesmo à rede local do host. Isso significa que o contêiner estará isolado da rede e não poderá se comunicar com outros contêineres, serviços externos ou a internet. O uso desse driver pode ser útil em cenários específicos, como contêineres que executam tarefas isoladas sem a necessidade de acesso à rede, ou para fins de segurança, quando se deseja limitar estritamente a conectividade de um contêiner.

Docker vs Máquinas Virtuais e Kubernetes


São comuns confusões entre Docker e máquinas virtuais (VMs), mas essas são tecnologias diferentes, embora ambas sejam usadas para isolar e executar aplicativos. As VMs virtualizam todo o hardware do sistema, permitindo que vários sistemas operacionais e aplicativos sejam executados em uma única máquina física. Por outro lado, o Docker virtualiza apenas o sistema operacional e os recursos necessários para executar um aplicativo específico, permitindo que múltiplos contêineres compartilhem o mesmo kernel do sistema operacional. Isso torna os contêineres mais leves e mais eficientes em termos de recursos do que as VMs. Já Kubernetes, é uma plataforma de orquestração de contêineres que automatiza o dimensionamento, a distribuição e a operação de aplicativos em contêineres. Ele pode ser usado em conjunto com o Docker para gerenciar e coordenar grandes clusters de contêineres em ambientes de produção, mas não o substitui.

https://i.ytimg.com/vi/TvnZTi_gaNc/maxresdefault.jpg

Casos de Uso e Exemplos Práticos

Por trazer tantas facilidades ao desenvolvimento de softwares o Docker se tornou hoje em dia uma das ferramentas mais utilizadas do mundo por profissionais da área, sendo uma das principais escolhas para diferentes situações e momentos do trabalho.

Desenvolvimento de aplicações


No desenvolvimento de aplicações, o Docker é amplamente utilizado para criar um ambiente de desenvolvimento consistente e isolado. Desenvolvedores podem definir todas as dependências necessárias para suas aplicações em um arquivo Dockerfile e, em seguida, criar uma imagem Docker a partir dele. Essa imagem pode ser compartilhada entre a equipe de desenvolvimento, garantindo que todos tenham exatamente o mesmo ambiente de desenvolvimento, independentemente do sistema operacional ou configurações individuais.

Ambientes de teste e staging


Em ambientes de teste e staging, o Docker é utilizado para facilitar a criação de ambientes sob demanda que correspondam exatamente ao ambiente de produção. Isso permite que as equipes de QA testem as aplicações em um ambiente controlado e consistente antes de implantá-las em produção. Além disso, o Docker facilita a reprodução de bugs, já que o ambiente de teste pode ser facilmente replicado em diferentes máquinas ou em diferentes estágios do ciclo de vida do desenvolvimento.

Aplicações em produção


Em ambientes de produção, o Docker é utilizado para criar, implantar e gerenciar aplicações de forma eficiente e escalável. As imagens Docker são usadas para empacotar o código da aplicação junto com suas dependências, facilitando a implantação em diferentes ambientes de produção. Além disso, ferramentas de orquestração como Docker Swarm ou Kubernetes são usadas para gerenciar clusters de contêineres, garantindo alta disponibilidade, escalabilidade automática e resiliência a falhas.




Desafios e Limitações

Por mais que o Docker seja uma ferramenta poderosa e versátil, ele também apresenta desafios e limitações, provenientes diretamente da maneira que a ferramenta foi desenvolvida e de suas características. Alguns dos principais desafios e limitações do Docker incluem:

Escalabilidade


Um dos desafios do Docker em relação à escalabilidade está relacionado à gestão de grandes clusters de contêineres. Embora ferramentas como Docker Swarm e Kubernetes facilitem a escalabilidade horizontal dos contêineres, configurar e gerenciar esses clusters pode ser complexo e exigir conhecimentos avançados de infraestrutura e automação. Além disso, o desafio de dimensionar eficientemente os recursos de CPU, memória e armazenamento para atender às demandas variáveis de carga de trabalho também pode surgir, exigindo uma estratégia cuidadosa de dimensionamento automático e alocação de recursos.

Desempenho


Embora os contêineres Docker sejam mais leves do que as máquinas virtuais, eles ainda introduzem uma camada adicional de virtualização que pode afetar o desempenho, especialmente em cargas de trabalho intensivas em recursos. O compartilhamento do kernel do sistema operacional entre os contêineres pode levar a conflitos de recursos e interferência entre os contêineres, afetando o desempenho geral do sistema. Além disso, o tempo de inicialização e o consumo de recursos durante a inicialização de contêineres também podem impactar negativamente o desempenho em ambientes onde a latência e o tempo de resposta são críticos.

Uso em ambientes heterogêneos


Outro desafio do Docker é o uso em ambientes heterogêneos, onde há uma variedade de sistemas operacionais e arquiteturas de hardware. Embora o Docker seja amplamente suportado em sistemas operacionais Linux, seu suporte em sistemas Windows e macOS é menos abrangente e pode apresentar limitações em termos de recursos e funcionalidades disponíveis. Além disso, garantir a compatibilidade entre diferentes versões do Docker e suas dependências, bem como entre diferentes plataformas de hardware, pode ser complicado e exigir testes extensivos e ajustes de configuração.

Segurança


Embora os contêineres Docker ofereçam isolamento de recursos, ainda há desafios de segurança a serem considerados. Vulnerabilidades no kernel do sistema operacional compartilhado podem ser exploradas para comprometer a segurança de todos os contêineres em um host. Além disso, a confiança nas imagens Docker de terceiros e a falta de visibilidade completa sobre o conteúdo das imagens podem introduzir riscos de segurança, como a presença de código malicioso ou vulnerabilidades não corrigidas. Garantir a segurança em todas as camadas do ambiente Docker, incluindo a rede, o sistema operacional host e os próprios contêineres, é fundamental para mitigar esses riscos.




Conclusão

Com base nos tópicos apresentados, podemos concluir que o Docker é uma tecnologia poderosa que revolucionou a forma como as aplicações são desenvolvidas, implantadas e gerenciadas. Ao fornecer uma plataforma de contêineres leve e portátil, o Docker permite aos desenvolvedores criar, distribuir e executar aplicativos de maneira consistente em diferentes ambientes. Sua arquitetura modular e flexível, juntamente com sua ampla adoção pela comunidade e suporte de ferramentas de orquestração como Kubernetes, tornam-no uma escolha popular para uma variedade de casos de uso, desde o desenvolvimento até a produção.

Já com olhos no futuro, espera-se que o Docker continue evoluindo para lidar com desafios emergentes e requisitos do mercado, como melhorias de desempenho, segurança aprimorada e suporte expandido para ambientes heterogêneos. O Docker também pode desempenhar um papel importante na adoção de práticas de DevOps e na modernização de infraestruturas de TI, facilitando a automação, a entrega contínua e a implantação de aplicativos em escala.

Ainda assim, o Docker já demonstrou transformar radicalmente a forma como as equipes de desenvolvimento e operações colaboram e entregam software. Ao reduzir a complexidade e o tempo necessário para configurar ambientes de desenvolvimento e produção, o Docker ajuda as organizações a acelerar a inovação, reduzir custos e aumentar a eficiência operacional. No futuro, seu impacto continuará a crescer à medida que mais empresas adotarem a tecnologia e explorarem novas maneiras de aproveitar seus benefícios.


Bibliografia



What is Docker? How does it work
Disponível em: https://devopscube.com/what-is-docker/

What is Docker
Disponível em: https://www.redhat.com/en/topics/containers/what-is-docker

Qual é a diferença entre o Docker e uma VM?
Disponível em: https://aws.amazon.com/pt/compare/the-difference-between-docker-vm/

Qual é a diferença entre o Kubernetes e o Docker?
Disponível em: https://aws.amazon.com/pt/compare/the-difference-between-kubernetes-and-docker/

Docker Networking
Disponível em: https://towardsdatascience.com/docker-networking-919461b7f498

Docker Advantages and Disadvantages
Disponível em: https://duplocloud.com/blog/docker-advantages-and-disadvantages/

Docker Containerization and Virtualization
Disponível em: https://medium.com/@haticeyildiz/docker-containerization-and-virtualization-benefits-advantages-and-disadvantages-737b31b86213

Understanding Communication Between Docker Containers
Disponível em: https://cloudkul.com/blog/understanding-communication-docker-containers/

Docker Networking
Disponível em: https://spacelift.io/blog/docker-networking

Docker Overview
Disponível em: https://docs.docker.com/get-started/overview/

Docker Port Mapping Image
Disponível em: https://www.code4it.dev/blog/run-mongodb-on-docker/Docker-ports.png