Artigo original: https://www.freecodecamp.org/news/docker-simplified-96639a35ff36/

Caso você esteja planejando iniciar sua carreira em DevOps (ou mesmo se já estiver nela), se você já não tem o Docker em seu currículo, sem dúvida é hora de pensar nele, pois é uma das habilidades fundamentais para qualquer um que esteja na área de DevOps.

Neste artigo, vou tentar explicar o Docker da maneira mais simples possível.

Antes de examinarmos o assunto com mais profundidade e de começarmos a explorar o Docker, vamos dar uma olhada nos tópicos que cobriremos como parte deste guia para iniciantes.

Vamos começar entendendo: o que é Docker?

Em termos simples, o Docker é uma plataforma de software que simplifica o processo de criação, execução, gerenciamento e distribuição de aplicações. Ele faz isso virtualizando o sistema operacional do computador no qual ele está instalado e rodando.

A primeira edição do Docker foi lançada em 2013.

O Docker é desenvolvido usando a linguagem de programação GO.

Tendo em conta o rico conjunto de funcionalidades que o Docker tem para oferecer, ele tem sido amplamente utilizado para executar e gerir as aplicações de algumas das principais organizações e universidades do mundo, como a Visa, PayPal, Universidade de Cornell e Universidade de Indiana (só para citar algumas).

Agora vamos tentar entender o problema e a solução que o Docker pode oferecer.

O problema

Digamos que você tem três aplicações diferentes baseadas em Python que planeja hospedar em um único servidor (que pode ser uma máquina física ou virtual).

Cada uma dessas aplicações utiliza uma versão diferente do Python, assim como as bibliotecas e dependências associadas, que diferem de uma aplicação para outra.

Por não podermos ter diferentes versões do Python instaladas na mesma máquina, não conseguimos hospedar as três aplicações no mesmo computador.

A solução

Vamos ver sugestões para resolver esse problema sem usar o Docker. Nesse cenário, poderíamos usar três máquinas físicas, ou somente uma única máquina física poderosa o bastante para hospedar e executar três máquinas virtuais nela.

Ambas as opções nos permitiriam instalar diferentes versões do Python em cada uma dessas máquinas, juntamente com suas dependências associadas.

Independentemente da solução que escolhermos, os custos associados à aquisição e manutenção do hardware são bastante caros.

Agora, vamos ver como o Docker pode ser uma solução eficiente e econômica para esse problema.

Para entender isso, precisamos analisar exatamente como o Docker funciona.

1_MbxLUFB2HRPmLAn60tQKZA

A máquina na qual o Docker está instalado e em execução é geralmente chamada de Docker Host ou Host em termos simples.

Então, quando você planeja implantar uma aplicação no host, ele cria uma entidade lógica para hospedar essa aplicação. Na terminologia do Docker, chamamos essa entidade lógica de container ou Docker Container, para ser mais preciso.

Um Docker Container, ou contêiner do Docker (em português), não tem nenhum sistema operacional instalado e em execução nele. Ele, no entanto, tem uma cópia virtual da tabela de processos, da(s) interface(s) de rede e do(s) ponto(s) de montagem do sistema de arquivos. Tudo isso foi herdado do sistema operacional do host no qual o contêiner está hospedado e em execução.

Enquanto isso, o kernel do sistema operacional do host é partilhado por todos os contêineres que estão rodando nele.

Isso permite que cada contêiner seja isolado dos outros no mesmo host. Sendo assim, vários contêineres com diferentes requisitos e dependências de aplicações podem ser executados no mesmo host, desde que tenham os mesmos requisitos de sistema operacional.

Para entender como o Docker tem sido benéfico na resolução desse problema, é necessário consultar a próxima seção, que discute as vantagens e desvantagens da utilização do Docker.

Em resumo, o Docker virtualiza o sistema operacional do host no qual está instalado e em execução em vez de virtualizar os componentes de hardware.

Vantagens e desvantagens do uso do Docker

Vantagens do uso do Docker

Alguns dos principais benefícios do uso do Docker são:

  • O Docker suporta várias aplicações com diferentes requisitos e dependências, a serem hospedadas em conjunto no mesmo host, desde que tenham os mesmos requisitos de sistema operacional.
  • Armazenamento otimizado: um grande número de aplicações pode ser alojado no mesmo host, uma vez que os contêineres têm normalmente poucos megabytes de tamanho e consomem muito pouco espaço em disco.
  • Robustez: um contêiner não tem um sistema operacional instalado. Assim, consome muito pouca memória em comparação com uma máquina virtual (que teria um sistema operacional completo instalado e em execução). Isto também reduz o tempo de instalação para apenas alguns segundos, em comparação com alguns minutos necessários para subir uma máquina virtual.
  • Custos reduzidos: o Docker é menos exigente sobre o hardware necessário para executá-lo.

Desvantagens da utilização do Docker

  • As aplicações com diferentes requisitos de sistema operacional não podem ser alojadas em conjunto no mesmo Docker Host. Por exemplo, digamos que temos 4 aplicações diferentes, das quais 3 requerem um sistema operacional baseado em Linux e a outra aplicação requer um sistema operacional baseado em Windows. Neste cenário, as 3 aplicações que requerem um sistema operacional baseado em Linux podem ser alojadas num único Docker Host, enquanto a aplicação que requer um sistema operacional baseado em Windows tem de ser alojada num Docker Host diferente.

Componentes principais do Docker

Docker Engine é um dos principais componentes do Docker. Ele é responsável pelo funcionamento geral da plataforma do Docker.

Docker Engine é uma aplicação baseada em client-servidor e consiste em 3 componentes principais.

  1. Servidor
  2. API REST
  3. Client
1_MYX0ClbWoitxS0RNUVvj8A
Fonte: https://docs.docker.com

O servidor executa um daemon, conhecido como dockerd (Docker Daemon), que nada mais é do que um processo. Ele é responsável por criar e gerenciar imagens, contêineres, redes e volumes do Docker na plataforma do Docker.

A API REST especifica como as aplicações podem interagir com o servidor e instruí-lo para realizar o seu trabalho.

O client nada mais é do que uma interface de linha de comandos, que permite aos utilizadores interagir com o Docker utilizando os comandos.

Terminologia do Docker

Vamos dar uma olhada rápida em algumas das terminologias associadas ao Docker.

As imagens e os contêineres do Docker são as duas coisas essenciais que você encontrará diariamente ao trabalhar com o Docker.

Em termos simples, uma imagen do Docker é um modelo que contém a aplicação e todas as dependências necessárias para executar essa aplicação no Docker.

Por outro lado, como dito anteriormente, um contêiner do Docker é uma entidade lógica. Em termos mais precisos, é uma instância em execução da imagem do Docker.

O que é o Docker Hub?

O Docker Hub é o repositório oficial on-line onde se encontram todas as imagens do Docker disponíveis para utilização.

O Docker Hub também nos permite armazenar e distribuir as nossas imagens personalizadas, se assim desejarmos. Podemos também torná-las públicas ou privadas, com base nos nossos requisitos.

Observação: podemos manter somente uma imagem do Docker como privada sendo usuários do plano gratuito. Se quisermos manter mais de uma imagem do Docker privada, precisamos de um plano pago.

Docker Editions

O Docker está disponível em 2 edições diferentes, conforme listadas abaixo:

  • Community Edition (CE)
  • Enterprise Edition (EE)

A Community Edition é adequada para programadores individuais e pequenas equipes. Oferece funcionalidades limitadas, em comparação com a Enterprise Edition.

A Enterprise Edition, por outro lado, é adequada para grandes equipes e para a utilização do Docker em ambientes de produção.

A Enterprise Edition é ainda categorizada em três edições diferentes, conforme listadas abaixo:

  • Basic
  • Standard
  • Advanced

Instalação do Docker

Uma última coisa que precisamos saber antes de prosseguirmos e mergulharmos no Docker é como instalá-lo.

Abaixo você verá os links para os guias oficiais de instalação do Docker CE (em inglês). Recomendo seguir estes guias para instalar o Docker na sua máquina, pois são simples e diretos.

Quer pular a instalação e ir direto para a prática do Docker?

Caso não queira instalar o Docker, ou não tenha recursos suficientes disponíveis no seu computador, não precisa se preocupar – aqui está a solução para o seu problema.

Você pode usar o Play with Docker, que é um playground on-line para o Docker. Com ele, você pode praticar comandos do Docker imediatamente, sem ter que instalar nada na sua máquina. A melhor parte é que é simples de usar e está disponível gratuitamente.

Comandos do Docker

Agora é hora de praticar os comandos do Docker, pelos quais todos nós temos esperado até agora.

docker create

O primeiro comando que vamos analisar é o docker create.

Esse comando é usado pra criar um contêiner.

A sintaxe para esse comando é mostrada abaixo:

docker create [opções] IMAGEM [comandos] [argumentos]

Observação: tudo o que estiver entre colchetes é opcional. Isso é aplicável a todos os comandos que você verá neste guia.

Alguns dos exemplos de uso desse comando são mostrados abaixo:

$ docker create fedora
02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

No exemplo acima, o comando docker create criaria um contêiner utilizando a imagem mais recente do Fedora.

Antes de criar o contêiner, ele verificará se a imagem oficial mais recente do Fedora está disponível no Docker Host ou não. Se a imagem mais recente não estiver disponível no Docker Host, baixará a imagem do Fedora do Docker Hub antes de criar o contêiner. Se a imagem do Fedora já estiver presente no Docker Host, ele usará essa imagem e criará o contêiner.

Se o contêiner for criado com sucesso, o Docker retornará o ID do contêiner. Por exemplo, no exemplo acima, 02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03 é o ID do contêiner devolvido pelo Docker.

Cada contêiner tem um ID de contêiner único. Utilizamos o ID de contêiner para efetuar várias operações no contêiner, tais como iniciar, parar, reiniciar etc.

Agora, vamos ver um outro exemplo do comando docker create, que tem opções e comandos sendo passados para ele.

$ docker create -t -i ubuntu bash
30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005

No exemplo acima, o comando docker create cria um contêiner utilizando a imagem do Ubuntu (como referido anteriormente, se a imagem não estiver disponível no Docker Host, este transferirá a imagem mais recente do Hub Docker antes de criar o contêiner).

As opções -t e -i instruem o Docker a alocar um terminal ao contêiner para que o usuário possa interagir com o contêiner, além de instruir o Docker a executar o comando bash sempre que o contêiner for iniciado.

docker ps

O próximo comando que veremos é o docker ps.

O comando docker ps nos permite visualizar todos os contêineres que estão em execução no Docker Host.

$ docker ps
CONTAINER ID IMAGE  COMMAND CREATED        STATUS            PORTS NAMES
30986b73dc00 ubuntu "bash"  45 minutes ago Up About a minute                 elated_franklin

Ele apenas apresenta os contêineres que estão atualmente em execução no Docker Host.

Se você quiser ver todos os contêineres que foram criados nesse Docker Host, independentemente de seu status atual, então você precisa incluir a opção -a, que exibe todos os contêineres que foram criados nesse Docker Host.

$ docker ps -a
CONTAINER ID IMAGE  COMMAND     CREATED           STATUS       PORTS NAMES 30986b73dc00 ubuntu "bash"      About an hour ago Up 29 minutes elated_franklin
02576e880a2c fedora "/bin/bash" About an hour ago Created hungry_sinoussi

Antes de prosseguirmos, vamos tentar decodificar e compreender a saída do comando docker ps.

CONTAINER ID: uma string única composta por caracteres alfanuméricos, associada a cada contêiner (neste caso, 30986b73dc00 para o primeiro e 02576e880a2c para o segundo).

IMAGE: nome da imagem do Docker usada para criar esse contêiner (ubuntu e fedora, respectivamente).

COMMAND: qualquer comando específico da aplicação que precise ser executado quando o contêiner é iniciado ("bash" e "/bin/bash").

CREATED: mostra o tempo decorrido desde que este contêiner foi criado (em ambos os casos, "About an hour ago" – há cerca de uma hora).

STATUS: mostra o estado atual do contêiner, juntamente com o tempo decorrido, no seu estado atual (no primeiro caso, "Up 29 minutes" – em execução há 29 minutos, e, no segundo caso, "Created" – criado) .

Se o contêiner estiver em execução, será apresentado como "Up", juntamente com o tempo decorrido (por exemplo, "Up" há cerca de uma hora ou "Up" há 3 minutos).

Se o contêiner estiver parado, será apresentado como "Exited" seguido do código de estado de saída entre colchetes, juntamente com o tempo decorrido (por exemplo, Exited (0) há 3 semanas ou Exited (137) há 15 segundos, onde 0 e 137 são os códigos de saída).

PORTS: mostra o mapeamento das portas definidas para o contêiner.

NAMES: para além do CONTAINER ID, a cada contêiner também é atribuído um nome único. Podemos referir-nos a um contêiner utilizando o seu ID de contêiner ou o seu nome único. O Docker atribui automaticamente um nome único a cada contêiner que cria, mas se você quiser especificar o seu próprio nome para o contêiner, pode fazê-lo incluindo a opção --name (nome com duplo hífen) no comando docker create ou docker run (veremos o comando docker run mais adiante).

Espero que isso dê a você uma melhor compreensão da saída do comando docker ps.

docker start

O próximo comando que veremos é o comando docker start.

Esse comando inicia qualquer contêiner que estiver parado.

A sintaxe para esse comando é mostrada abaixo:

docker start [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]

Podemos iniciar um contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome.

Alguns dos exemplos de utilização desse comando são mostrados abaixo:

$ docker start 30986

No exemplo acima, o Docker inicia o contêiner que começa com o ID de contêiner 30986.

$ docker start elated_franklin

Nesse exemplo, o Docker inicia o contêiner chamado "elated_franklin".

docker stop

O próximo comando da lista é o comando docker stop.

Este comando paralisa qualquer contêiner em execução.

A sintaxe para esse comando é mostrada abaixo:

docker stop [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]

É semelhante ao comando docker start.

Podemos parar o contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome.

Alguns dos exemplos de uso desse comando são mostrados abaixo:

$ docker stop 30986

No exemplo acima, o Docker interromperá a execução do contêiner que começa com o ID de contêiner 30986.

$ docker stop elated_franklin

Nesse exemplo, o Docker interromperá a execução do contêiner chamado "elated_franklin".

docker restart

O próximo comando que veremos é o comando docker restart.

Esse comando reinicia qualquer contêiner em execução.

A sintaxe para esse comando é mostrada abaixo:

docker restart [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]

Podemos reiniciar o contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome.

Alguns dos exemplos de utilização desse comando são mostrados abaixo:

$ docker restart 30986

No exemplo acima, o Docker reiniciará o contêiner começando com o ID do contêiner 30986.

$ docker restart elated_franklin

Nesse exemplo, o Docker reiniciará o container chamado "elated_franklin".

docker run

O próximo comando que veremos é o comando docker run.

Esse comando primeiro cria o contêiner e, em seguida, o inicia. Em resumo, esse comando é uma combinação dos comandos docker create e docker start.

A sintaxe desse comando é mostrada abaixo:

docker run [opções] IMAGEm [comandos] [argumentos]

Ele tem uma sintaxe semelhante à do comando docker create.

Alguns dos exemplos de uso desse comando são mostrados abaixo:

$ docker run ubuntu
30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520

No exemplo acima, o Docker criará o contêiner usando a imagem mais recente do Ubuntu e, em seguida, iniciará o contêiner imediatamente.

Se executássemos o comando acima, ele iniciaria o contêiner e o pararia imediatamente – não teríamos nenhuma chance de interagir com o contêiner.

Se quisermos interagir com o contêiner, então precisamos especificar as opções: -it (hífen seguido de i e t) para o comando docker run mostrar o terminal, com o qual podemos interagir com o contêiner escrevendo os comandos apropriados. Veja o exemplo abaixo.

$ docker run -it ubuntu
root@e4e633428474:/#

Para sair do contêiner, é necessário escrever exit no terminal.

docker rm

Vamos passar para o próximo comando – se quisermos apagar um contêiner, usamos o comando docker rm.

A sintaxe desse comando é a mostrada abaixo:

docker rm [opções] CONTAINER ID/NAME [CONTAINER ID/NAME...]

Alguns dos exemplos de uso desse comando são mostrados abaixo:

$ docker rm 30fa elated_franklin

No exemplo acima, estamos instruindo o Docker para excluir 2 contêineres com um único comando. O primeiro contêiner a ser eliminado é especificado através do seu ID de contêiner (30fa) e o segundo contêiner a ser eliminado é especificado através do seu nome ("elated_franklin").

Observação: os contêineres precisam estar estar parados para serem eliminados.

docker images

docker images é o próximo comando da lista.

Esse comando lista todas as imagens do Docker que estão presentes no seu Docker Host.

$ docker images
REPOSITORY  TAG      IMAGE          CREATED        SIZE
mysql       latest   7bb2586065cd   38 hours ago   477MB
httpd       latest   5eace252f2f2   38 hours ago   132MB
ubuntu      16.04    9361ce633ff1   2 weeks ago    118MB
ubuntu      trusty   390582d83ead   2 weeks ago    188MB
fedora      latest   d09302f77cfc   2 weeks ago    275MB
ubuntu      latest   94e814e2efa8   2 weeks ago    88.9MB

Vamos decodificar o resultado do comando docker images.

REPOSITORY: representa o nome único da imagem do Docker.

TAG: cada imagem está associada a uma tag exclusiva. Uma tag basicamente representa uma versão da imagem.

Uma tag é geralmente representada usando uma palavra, um conjunto de números ou uma combinação de caracteres alfanuméricos.

IMAGE ID: uma string única constituída por caracteres alfanuméricos, associada a cada imagem.

CREATED: mostra o tempo decorrido desde que a imagem foi criada.

SIZE: mostra o tamanho da imagem.

docker rmi

O próximo comando da lista é o comando docker rmi.

O docker rmi nos permite remover uma imagem (ou imagens) do Docker Host.

A sintaxe desse comando é mostrada abaixo:

docker rmi [opções] IMAGE NAME/ID [IMAGE NAME/ID...]

Alguns dos exemplos de uso desse comando são mostrados abaixo:

docker rmi mysql

O comando acima remove a imagem chamada "mysql" do Docker Host.

docker rmi httpd fedora

O comando acima remove as imagens chamadas "httpd" e "fedora" do Docker Host.

docker rmi 94e81

O comando acima remove a imagem que começa com o ID de imagem "94e81" do Docker Host.

docker rmi ubuntu:trusty

O comando acima remove a imagem chamada "ubuntu", com a tag "trusty" do Docker Host.

Esses foram alguns dos comandos mais comuns usados no Docker. Há muitos outros comandos do Docker a serem explorados.

Conclusão

A conteinerização tem recebido recentemente a atenção que merece, embora já exista há muito tempo. Algumas das principais empresas de tecnologia, como Google, Amazon Web Services (AWS), Intel, Tesla e Juniper Networks, têm sua própria versão personalizada de container engines (em português, algo como "motor de containerização"). Essas empresas dependem fortemente das engines para criar, executar, gerir e distribuir as suas aplicações.

O Docker é um motor de containerização extremamente poderoso e tem muito para oferecer quando se trata de criar, executar, gerir e distribuir as suas aplicações de maneira eficiente.

Você acabou de ver uma visão extremamente geral do Docker. Há muito mais para aprender sobre o Docker, como:

  • Comandos do Docker (comandos mais poderosos)
  • Imagens do Docker (como criar suas próprias imagens personalizadas)
  • Docker Networking (configurar e implantar a rede)
  • Docker Services (agrupamento de contêineres que utilizam a mesma imagem)
  • Docker Stack (agrupamento de serviços exigidos por uma aplicação)
  • Docker Compose (ferramenta para gerir e executar vários contêineres)
  • Docker Swarm (agrupamento e gestão de uma ou mais máquinas nas quais o Docker está sendo executado)
  • E muito mais…

Se achou o Docker fascinante e está interessado em aprender mais sobre ele, então recomendo que se inscreva nos cursos que estão listados abaixo. Eles são muito informativos e objetivos.

Se é um iniciante, então sugiro que se inscreva neste curso (em inglês), que foi projetado para principiantes.

Se você tem um bom conhecimento sobre o Docker, se está bastante confiante com as coisas básicas e se quer expandir seu conhecimento, então eu sugiro que você se inscreva neste curso, que é mais voltado para tópicos avançados relacionados ao Docker.

Docker é uma habilidade muito importante para o futuro e está apenas ganhando impulso.

Investir seu tempo e dinheiro para aprender Docker não será algo de que você se arrependerá.

Espero que você tenha achado este artigo informativo. sinta-se à vontade para compartilhá-lo. Isso realmente significa muito para mim.

Antes de dizer adeus...

Para manter contato com o autor, clique aqui para cadastrar seu e-mail.

Agradeço por dedicar seu precioso tempo à leitura deste artigo.

Isenção de responsabilidades: todos os nomes de produtos e empresas são marcas comerciais™ ou marcas comerciais registradas® dos respectivos titulares. O uso deles não implica qualquer endosso. Pode haver links de afiliados neste artigo.