Build, Ship, and Run Any App, Anywhere ou, em tradução livre, “Crie, envie e execute qualquer apli­ca­tivo, de qualquer lugar”, é o lema do Docker. A pla­ta­forma de con­têi­ne­res de código aberto oferece uma al­ter­na­tiva flexível, já que requer poucos recursos para emular com­po­nen­tes de hardware baseados em máquinas virtuais (VMs). No nosso tutorial de Docker para ini­ci­an­tes, com­pa­ra­mos as di­fe­ren­ças entre as duas técnicas de vir­tu­a­li­za­ção, apre­sen­ta­mos o projeto de código aberto Docker e damos ins­tru­ções claras e de­ta­lha­das sobre sua uti­li­za­ção.

Teste o VPS da IONOS grátis

Ex­pe­ri­mente seu vServer de graça agora - Teste um servidor virtual por 30 dias!

  • Recursos dedicados
  • Tráfego ilimitado
  • Consultor pessoal

Enquanto a vir­tu­a­li­za­ção de hardware tra­di­ci­o­nal é baseada na ini­ci­a­li­za­ção de múltiplos sistemas con­vi­da­dos em um sistema de hos­pe­da­gem comum, as apli­ca­ções Docker são exe­cu­ta­das como processos isolados em um mesmo sistema, com a ajuda de con­têi­ne­res. Esse processo recebe o nome de vir­tu­a­li­za­ção baseada em con­têi­ne­res, sendo também conhecido como vir­tu­a­li­za­ção em nível de sistema ope­ra­ci­o­nal.

A imagem a seguir mostra di­fe­ren­ças fun­da­men­tais na estrutura ar­qui­tetô­nica de cada uma das técnicas de vir­tu­a­li­za­ção:

Imagem: Comparação entre máquinas virtuais e contêineres softwares
Enquanto cada máquina virtual ini­ci­a­liza seu próprio sistema ope­ra­ci­o­nal, con­têi­ne­res Docker com­par­ti­lham o núcleo do sistema de hos­pe­da­gem

As duas técnicas pos­si­bi­li­tam que de­sen­vol­ve­do­res e ad­mi­nis­tra­do­res de sistemas usem pa­ra­le­la­mente diversas apli­ca­ções, com re­qui­si­tos di­fe­ren­tes, no mesmo sistema. As prin­ci­pais di­fe­ren­ças entre elas estão re­la­ci­o­na­das ao consumo de recursos e à por­ta­bi­li­dade.

Contêiner: Vir­tu­a­li­za­ção com uti­li­za­ção mínima de recursos

Quando apli­ca­ções são en­cap­su­la­das em um processo de vir­tu­a­li­za­ção de hardware tra­di­ci­o­nal, o en­cap­su­la­mento é realizado por um hi­per­vi­sor. Ele atua como uma camada de abstração entre o sistema de hos­pe­da­gem e os sistemas virtuais con­vi­da­dos. Cada sistema convidado é im­ple­men­tado como uma máquina completa, com um núcleo de sistema ope­ra­ci­o­nal exclusivo. Recursos de hardware do sistema de hos­pe­da­gem (CPU, memória, espaço em disco rígido e pe­ri­fé­ri­cos dis­po­ní­veis) são atri­buí­dos pro­por­ci­o­nal­mente pelo hi­per­vi­sor.

Por outro lado, na vir­tu­a­li­za­ção baseada em con­têi­ne­res, nenhum sistema convidado completo é simulado. Em vez disso, as apli­ca­ções são iniciadas nos con­têi­ne­res. Elas com­par­ti­lham o mesmo núcleo (o sistema de hos­pe­da­gem), mas são exe­cu­ta­das como processos isolados no espaço de usuário.

Nota

Em geral, sistemas ope­ra­ci­o­nais modernos com­par­ti­lham a memória virtual em duas áreas separadas: no espaço de núcleo (core space) e no espaço de usuário (user space). Enquanto o espaço de núcleo é reservado ex­clu­si­va­mente à operação do núcleo e de outros com­po­nen­tes do sistema ope­ra­ci­o­nal, o espaço de usuário re­pre­senta a área da memória dis­po­ní­vel para apli­ca­ções. A separação entre o espaço de núcleo e o espaço de usuário é feita prin­ci­pal­mente para proteger o sistema contra apli­ca­ções perigosas ou de­fei­tu­o­sas.

Uma grande vantagem da vir­tu­a­li­za­ção baseada em con­têi­ne­res é que apli­ca­ções com re­qui­si­tos di­fe­ren­tes podem ser exe­cu­ta­das iso­la­da­mente umas das outras, sem que ocorra so­bre­carga em um sistema convidado separado. Para tanto, a tec­no­lo­gia de con­têi­ne­res usa duas funções básicas do núcleo Linux: grupos de controle (cgroups)eespaços de nome (na­mes­pa­ces) do núcleo.

  • Os cgroups limitam o acesso dos processos à memória, CPU e recursos I/O, e previnem que os re­qui­si­tos de um processo afetem os demais em execução.
  • Os na­mes­pa­ces limitam um processo e seus processos filhos a uma porção es­pe­cí­fica de um sistema sub­ja­cente. Para processos en­cap­su­la­dos, o Docker usa espaços de nome em cinco áreas di­fe­ren­tes:
    • Iden­ti­fi­ca­ção de sistema (UTS): Espaços de nomes UTS são usados na vir­tu­a­li­za­ção baseada em con­têi­ne­res para atribuir host e nomes de domínio aos con­têi­ne­res.
    • IDs de processo (PID): Todo contêiner Docker usa um espaço de nomes único para processar IDs. Processos exe­cu­ta­dos fora de um contêiner não são visíveis dentro dele. Portanto, processos en­cap­su­la­dos em con­têi­ne­res no mesmo sistema de hos­pe­da­gem podem ter o mesmo PID sem que ocorram conflitos.
    • Co­mu­ni­ca­ção entre processos (IPC): Espaços de nomes IPC isolam processos em um contêiner, de forma que a co­mu­ni­ca­ção fora desse contêiner é impedida.
    • Recursos de rede (NET): Com os espaços de nomes de rede, cada contêiner pode receber recursos de rede separados, como endereços IP ou tabelas de ro­te­a­mento.
    • Pontos de montagem do sistema de arquivos (MNT): Graças aos espaços de nomes de montagem, um processo isolado nunca enxerga o sistema de arquivos inteiro do host, apenas uma pequena parte dele (em geral, uma imagem criada es­pe­ci­fi­ca­mente para esse contêiner).

Até a versão 0.8.1, o Docker baseava seus processos somente em con­têi­ne­res Linux (LXC). Desde a versão 0.9, o formato de contêiner Lib­con­tai­ner passou a ser dis­po­ni­bi­li­zado aos usuários. Ele pos­si­bi­lita que o Docker seja im­ple­men­tado em diversas pla­ta­for­mas e execute o mesmo contêiner em vários sistemas de hos­pe­da­gem. A mudança também permitiu que uma versão do Docker fosse dis­po­ni­bi­li­zada para os sistemas ope­ra­ci­o­nais Windows e macOS.

Es­ca­la­bi­li­dade, alta dis­po­ni­bi­li­dade e por­ta­bi­li­dade

A tec­no­lo­gia de con­têi­ne­res não re­pre­senta apenas uma al­ter­na­tiva que requer menos recursos quando comparada à vir­tu­a­li­za­ção de hardware tra­di­ci­o­nal. Con­têi­ne­res softwares também permitem que apli­ca­ções sejam con­fi­gu­ra­das entre pla­ta­for­mas e em in­fra­es­tru­tu­ras di­fe­ren­tes, sem que con­fi­gu­ra­ções especiais de hardware ou software sejam ne­ces­sá­rias no res­pec­tivo sistema de hos­pe­da­gem.

O Docker usa imagens portáteis para con­têi­ne­res softwares. As imagens de contêiner contêm apli­ca­ções in­di­vi­du­ais, incluindo todas as bi­bli­o­te­cas, arquivos binários e arquivos de con­fi­gu­ra­ção ne­ces­sá­rios para executar os processos de apli­ca­ções en­cap­su­la­das. Elas exigem poucos recursos do res­pec­tivo sistema de hos­pe­da­gem, o que permite que o contêiner de uma aplicação seja realocado entre diversos sistemas Linux, Windows ou macOS, sem con­fi­gu­ra­ção adicional (desde que a pla­ta­forma Docker tenha sido instalada como camada de abstração). Devido a essas ca­rac­te­rís­ti­cas, o Docker tornou-se a base ideal para a im­ple­men­ta­ção de ar­qui­te­tu­ras de software es­ca­lá­veis e de alta dis­po­ni­bi­li­dade. Ele é usado em sistemas de produção de empresas como Spotify, Google e eBay.

Docker: Estrutura e funções

O Docker é o projeto de software mais popular de tec­no­lo­gia de vir­tu­a­li­za­ção baseada em con­têi­ne­res. A pla­ta­forma de código aberto tem três com­po­nen­tes básicos: o Docker Engine, o Docker Images e o Docker Hub. Para executar con­têi­ne­res, usuários precisam do Docker Engine e de Docker Images (imagens Docker). Estas podem ser obtidas por meio do Docker Hub, ou criadas ma­nu­al­mente.

Docker Images (imagens Docker)

Similares a máquinas virtuais, con­têi­ne­res Docker são baseados em imagens. Uma imagem é uma template somente para leitura, que contém todas as ins­tru­ções que o Docker Engine precisa para criar um contêiner. Uma imagem Docker pode ser descrita como uma imagem portátil de um contêiner em formato de arquivo de texto, também chamado de Doc­ker­file. Se um contêiner for ini­ci­a­li­zado em um sistema, um pacote com a res­pec­tiva imagem é pre­vi­a­mente carregado (desde que ele não exista lo­cal­mente). A imagem carregada fornece o sistema de arquivos que inclui todos os pa­râ­me­tros ne­ces­sá­rios para a execução. Um contêiner pode ser con­si­de­rado um processo de execução de uma imagem.

Docker Hub

O Docker Hub é um registro para re­po­si­tó­rios de software baseado em nuvem. Em outras palavras, ele é a bi­bli­o­teca das imagens Docker. O serviço on-line é dividido em uma seção pública e uma privada. A seção pública permite que usuários enviem suas próprias imagens e com­par­ti­lhem-nas com a co­mu­ni­dade. Diversas imagens oficiais dis­po­ni­bi­li­za­das pela equipe de de­sen­vol­vi­mento do Docker e de outros projetos de código aberto con­sa­gra­dos também podem ser en­con­tra­das no Docker Hub. Imagens enviadas para a seção privada do re­po­si­tó­rio não podem ser acessadas pu­bli­ca­mente e só são com­par­ti­lha­das, por exemplo, dentro do círculo interno de uma empresa, ou entre amigos e co­nhe­ci­dos.

Docker Engine

O Docker Engine seria, por assim dizer, o coração do projeto Docker. Ele é uma aplicação cliente-servidor de código aberto, dis­po­ní­vel a todos os usuários da versão atual, em todas as pla­ta­for­mas. A ar­qui­te­tura básica do Docker Engine é dividida em três com­po­nen­tes: daemoncom funções de servidor;interface de pro­gra­ma­ção (API)baseada no paradigma de pro­gra­ma­ção REST (Re­pre­sen­ta­ti­o­nal State Transfer); eterminal do sistema ope­ra­ci­o­nal (interface de linha de comando ou CLI), que funciona como interface de usuário (cliente).

  • Docker daemon: O processodaemon atua como servidor para o Docker Engine. Ele é executado em segundo plano no sistema de hos­pe­da­gem e usado no controle central do Docker Engine. Esta função cria e gerencia todas as imagens, con­têi­ne­res e redes.
  • REST-API: A REST-API es­pe­ci­fica um conjunto de in­ter­fa­ces que permite que outros programas se co­mu­ni­quem com o Docker daemon e passem ins­tru­ções a ele. Um desses programas é o terminal do sistema ope­ra­ci­o­nal.
  • Terminal: O Docker usa o terminal do sistema ope­ra­ci­o­nal como um programa de cliente. A in­te­gra­ção do terminal com o Docker daemon, por meio da REST-API, pos­si­bi­lita que usuários es­ta­be­le­çam comandos usando scripts ou entradas (inputs).

Com o Docker, con­têi­ne­res softwares de usuários podem ser iniciados, in­ter­rom­pi­dos e ge­ren­ci­a­dos di­re­ta­mente do terminal. O daemon é abordado pelo comando docker ou por ins­tru­ções como build, pull e run. Cliente e servidor podem estar no mesmo sistema. Usuários também têm a opção de acessar um Docker daemon em um outro sistema. De­pen­dendo do tipo de conexão es­ta­be­le­cida, a co­mu­ni­ca­ção entre cliente e servidor pode ocorrer por REST-API, sockets UNIX ou interface de rede.

O gráfico abaixo ilustra a interação entre com­po­nen­tes in­di­vi­du­ais de Docker quando comandos como docker build, docker pull e docker run são usados:

Imagem: Representação esquemática da arquitetura Docker
A ar­qui­te­tura Docker é baseada na co­o­pe­ra­ção entre cliente terminal, servidor Docker daemon e registro Docker Hub

O comando docker build instrui o Docker daemon a criar uma imagem (linha pon­ti­lhada). Para criá-la, é ne­ces­sá­rio que o Doc­ker­file cor­res­pon­dente esteja dis­po­ní­vel. Se a imagem não for criada, mas carregada de um re­po­si­tó­rio do Docker Hub, o comando docker pull deve ser usado (linha tracejada). Já se o Docker daemon receber a instrução por docker run para iniciar um contêiner, o programa em segundo plano verifica se a imagem do contêiner cor­res­pon­dente está dis­po­ní­vel lo­cal­mente. Se estiver, o contêiner é executado (linha sólida). Se o daemon não encontrar a imagem, ele iniciará au­to­ma­ti­ca­mente um comando pull no re­po­si­tó­rio.

Dedicated Servers
Per­for­mance through in­no­va­tion

O encontro do hardware com a nuvem: servidor dedicado com nuvem integrada e cobrança por minuto, incluindo as­sis­tente pessoal!

  • Dedicated en­ter­prise hardware
  • Con­fi­gu­ra­ble hardware equipment
  • ISO-certified data centers

Ins­ta­la­ção do Docker Engine

Embora o Docker tenha sido usado ini­ci­al­mente apenas em dis­tri­bui­ções Linux, a versão atual da tec­no­lo­gia de con­têi­ne­res se ca­rac­te­riza por seu alto grau de in­de­pen­dên­cia de pla­ta­for­mas. Pacotes de ins­ta­la­ção estão dis­po­ní­veis para Microsoft Windows e macOS, bem como para serviços em nuvem, como Amazon Web Services (AWS) e Microsoft Azure. A dis­tri­bui­ções Linux su­por­ta­das incluem:

  • CentOS
  • Debian
  • Fedora
  • Oracle Linux
  • Red Hat En­ter­prise Linux
  • Ubuntu
  • openSUSE
  • SUSE Linux En­ter­prise

Além disso, dis­tri­bui­ções Docker ad­mi­nis­tra­das pela co­mu­ni­dade também estão dis­po­ní­veis para:

  • Arch Linux
  • CRUX Linux
  • Gentoo Linux

Como exemplo, neste tutorial Docker ilus­tra­re­mos o processo de ins­ta­la­ção do Docker Engine usando a popular dis­tri­bui­ção Linux Ubuntu. Ori­en­ta­ções de­ta­lha­das sobre o processo de ins­ta­la­ção do Docker em outras pla­ta­for­mas podem ser en­con­tra­das na do­cu­men­ta­ção oficial do contêiner software.

De­pen­dendo dos re­qui­si­tos a serem atendidos, existem três formas di­fe­ren­tes de instalar a pla­ta­forma de con­têi­ne­res Docker em um sistema Ubuntu:

  • Ins­ta­la­ção manual com pacote .DEB
  • Ins­ta­la­ção pelo re­po­si­tó­rio Docker
  • Ins­ta­la­ção pelo re­po­si­tó­rio Ubuntu

Antes de fazer sua escolha e mergulhar no nosso tutorial Docker, você deve conhecer os re­qui­si­tos de sistema do Docker Engine.

Re­qui­si­tos de sistema

Para instalar a versão atual do Docker em uma dis­tri­bui­ção Ubuntu, você precisa ter a variante de 64 bits de uma das seguintes versões do Ubuntu:

  • Yakkety 16.10
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS)
Nota

Em sistemas pro­du­ti­vos, re­co­men­da­mos o uso de softwares com suporte de longo prazo (LTS). Eles são dis­po­ni­bi­li­za­dos pelo for­ne­ce­dor com atu­a­li­za­ções, mesmo que uma versão sucessora esteja sendo dis­tri­buída no mercado.

Antes de instalar o Docker

O tutorial Docker a seguir é baseado no Ubuntu versão Xenial 16.04 (LTS). O processo de ins­ta­la­ção segue os mesmos passos na versão Yakkety 16.10. Para usuários de Trusty 14.04, re­co­men­da­mos a ins­ta­la­ção de pacotes *linux-image-extra-* antes da ins­ta­la­ção do Docker. Eles pos­si­bi­li­ta­rão o Docker Engine de acessar o driver de ar­ma­ze­na­mento AUFS.

Um método prático para atualizar um sistema Linux é oferecido pelo ge­ren­ci­a­dor de pacotes APT (Advanced Packaging Tool). Para instalar o pacote adicional para Trusty 14.04, siga estes passos:

  1. Abra o terminal: Inicie o Ubuntu e em seguida o terminal. Isso pode ser feito pres­si­o­nando as teclas CTRL + ALT + T.
Imagem: Terminal do Ubuntu Xenial 16.04 LTS
Para executar ações no terminal como ad­mi­nis­tra­dor, use o comando sudo antes de acessar o programa
  1. Atualize a lista de pacotes: Insira o comando a seguir para atualizar a indexação de pacotes locais do seu sistema ope­ra­ci­o­nal. Confirme o comando, pres­si­o­nando a tecla ENTER.
$ sudo apt-get update
Nota

O comando apt-get update não instala novos pacotes. Ele apenas atualiza as des­cri­ções dos pacotes ins­ta­la­dos lo­cal­mente.

Ao adicionar sudo a comandos, você con­se­guirá executar esses comandos como ad­mi­nis­tra­dor (super usuário root). Em de­ter­mi­na­das cir­cuns­tân­cias, alguns comandos podem exigir per­mis­sões root. Nestes casos, o Ubuntu solicita que você informe a senha de ad­mi­nis­tra­dor. Também existe a pos­si­bi­li­dade de você mudar per­ma­nen­te­mente os comandos para comandos de ad­mi­nis­tra­dor digitando sudo -s.

Nota

Para instalar a pla­ta­forma de con­têi­ne­res Docker, você precisa ter per­mis­sões root para o res­pec­tivo sistema de hos­pe­da­gem.

Imagem: Solicitação de senha no terminal do Ubuntu
Ao inserir uma senha no terminal do Ubuntu, você não verá mais nenhum caractere pla­cehol­der

Se você se iden­ti­fi­cou como usuário root inserindo uma senha, o Ubuntu iniciará o processo de atu­a­li­za­ção. O status será exibido no terminal.

Imagem: Gerenciamento de pacotes no terminal do Ubuntu por APT
O comando sudo apt-get update no Ubuntu é usado para exibir a lista atu­a­li­zada dos pacotes dis­po­ní­veis
  1. Instale pacotes adi­ci­o­nais: Quando todas as des­cri­ções de pacotes forem atu­a­li­za­das, você poderá pros­se­guir com a ins­ta­la­ção de novos pacotes. O ge­ren­ci­a­dor de pacotes APT torna isso possível com o comando apt-get install “NomeDoPacote”. Para instalar pacotes adi­ci­o­nais re­co­men­da­dos ao Trusty 14.04 pelo re­po­si­tó­rio Ubuntu, digite o comando a seguir no terminal e pressione a tecla ENTER:
$ sudo apt-get install -y --no-install-recommends \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual
Nota

Se você digitar o comando com a opção -y, todas as perguntas in­te­ra­ti­vas serão res­pon­di­das au­to­ma­ti­ca­mente com “yes” (sim). Já a opção --no-install-recommends impedirá que o Ubuntu instale au­to­ma­ti­ca­mente pacotes re­co­men­da­dos.

Imagem: Instalação de pacotes no terminal do Ubuntu
Antes de instalar novos pacotes, re­co­men­da­mos atualizar a lista de pacotes locais

Depois de fazer o download dos pacotes adi­ci­o­nais para Trust 14.04, todas as funções da pla­ta­forma Docker estarão dis­po­ní­veis para essa versão do Ubuntu.

Se você não sabe qual versão do Ubuntu está rodando no seu sistema ou não tem certeza se possui a ar­qui­te­tura de 64 bits ne­ces­sá­ria para instalar o Docker, você pode solicitar essas in­for­ma­ções ao terminal. Basta digitar o seguinte comando para ter acesso à versão e à ar­qui­te­tura do sistema:

$ sudo uname –rm

A res­pec­tiva versão do Ubuntu, a data de lan­ça­mento e o nickname dela são exibidos com o comando a seguir:

$ sudo lsb_release -a
Imagem: Acesso às informações do sistema Ubuntu no terminal
No Ubuntu, você acessa as in­for­ma­ções do sistema com fa­ci­li­dade pelo terminal

Ins­ta­la­ção manual por pacote .DEB

Em princípio, o pacote de ins­ta­la­ção do Docker pode ser baixado como um pacote .DEB e instalado ma­nu­al­mente. Para tanto, faça o download do arquivo .DEB para sua versão do Ubuntu e inicie o processo de ins­ta­la­ção, inserindo o seguinte comando no terminal:

$ sudo dpkg -i /path/to/package.deb
Nota

Modifique o pla­cehol­der/path/to/ para que o caminho do arquivo aponte para o local de ar­ma­ze­na­mento do pacote .DEB.

No caso de uma ins­ta­la­ção manual, todas as atu­a­li­za­ções de software também devem ser feitas ma­nu­al­mente. A do­cu­men­ta­ção do Docker recomenda que você use o próprio re­po­si­tó­rio Docker para executá-las, per­mi­tindo que a pla­ta­forma de con­têi­ne­res seja instalada de forma prática pelo terminal Ubuntu e permaneça atu­a­li­zada.

A seguir, nosso tutorial Docker ilustrará um processo de ins­ta­la­ção tal qual sugerido pela do­cu­men­ta­ção oficial da pla­ta­forma.

Ins­ta­la­ção pelo re­po­si­tó­rio Docker

Re­co­men­da­mos a ins­ta­la­ção da sua própria pla­ta­forma de con­têi­ne­res pelo re­po­si­tó­rio Docker. Mos­tra­re­mos como con­fi­gu­rar seu sistema para que o gerente de pacotes APT consiga acessar o re­po­si­tó­rio Docker por HTTPS.

  1. Instale os pacotes: Insira o comando a seguir para instalar todos os pacotes ne­ces­sá­rios para acessar o re­po­si­tó­rio Docker:
$ sudo apt-get install -y --no-install-recommends \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
Imagem: Instalação do pacote de configuração pelo terminal do Ubuntu
Siga o processo de ins­ta­la­ção para ver o resultado no terminal
  1. Adicione a chave GPG: Adicione a chave GPG oficial do Docker com o comando a seguir.
$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
Imagem: Adicione a chave GPG com o comando apt-key add
Se a chave for adi­ci­o­nada com sucesso, o Ubuntu retornará com a mensagem OK no terminal
  1. Verifique a chave GPG: Cer­ti­fi­que-se de que a chave GPG seja igual a: ID 5811 8E89 F3A9 1289 7C07 0ADB F762 2157 2C52 609D. Par tanto, use o comando a seguir:
$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

O resultado abaixo será exibido pelo terminal:

pub   4096R/2C52609D 2015-07-14
    Key fingerprint = 5811 8E89 F3A9 1289 7C07  0ADB F762 2157 2C52 609D
uid          Docker Release Tool (releasedocker) docker@docker.com
Imagem: Verificação da chave GPG
Compare o resultado no terminal com a chave GPG do Docker
  1. Configure o re­po­si­tó­rio Docker: Insira o comando abaixo para assegurar o acesso ao re­po­si­tó­rio estável Docker:
$ sudo add-apt-repository \
    "deb https://apt.dockerproject.org/repo/ \
    ubuntu-$(lsb_release -cs) \
    main"
Imagem: Configuração do repositório estável Docker
Configure o acesso ao re­po­si­tó­rio estável Docker

Após esses passos, seu sistema estará to­tal­mente con­fi­gu­rado para instalar a pla­ta­forma de con­têi­ne­res pelo re­po­si­tó­rio estável Docker.

Nota

Como al­ter­na­tiva ao re­po­si­tó­rio estável, você também pode acessar o re­po­si­tó­rio de teste Docker. Para isso, chame o arquivo /etc/apt/sources.list e substitua a palavra main por testing. Em sistemas pro­du­ti­vos, não é re­co­men­dá­vel usar o re­po­si­tó­rio de teste.

  1. Atualize a indexação dos pacotes: Antes de pros­se­guir com a ins­ta­la­ção do Docker Engine, acon­se­lha­mos que você atualize a indexação do seu sistema ope­ra­ci­o­nal mais uma vez, usando aquele mesmo comando:
$ sudo apt-get update
  1. Instale o Docker pelo re­po­si­tó­rio: Existem duas opções dis­po­ní­veis para baixar o Docker Engine do re­po­si­tó­rio Docker e instalá-lo no seu com­pu­ta­dor. Para baixar a versão atual do Docker Engine, use o seguinte comando:
$ sudo apt-get -y install docker-engine
Imagem: Processo de instalação do Docker: exibição de status no terminal
Acompanhe o progresso do processo de ins­ta­la­ção no terminal

A pla­ta­forma de con­têi­ne­res estará pronta para uso assim que o processo de ins­ta­la­ção for concluído. O Docker daemon será iniciado au­to­ma­ti­ca­mente. Se seu sistema ope­ra­ci­o­nal já tiver uma versão antiga do Docker instalada, ela será subs­ti­tuída pelo software atu­a­li­zado.

Além da versão atual, qualquer versão mais antiga do Docker Engine também pode ser instalada. Esse é um recurso útil, por exemplo, para sistemas pro­du­ti­vos. Alguns usuários preferem usar versões con­sa­gra­das, que garantem uma boa ex­pe­ri­ên­cia, em vez de versões mais novas, não tão es­ta­be­le­ci­das.

Para ter acesso a todas as versões de Docker dis­po­ní­veis, use o seguinte comando:

$ apt-cache madison docker-engine
Imagem: Versões do Docker Engine apresentadas pelo terminal
Escolha o lan­ça­mento desejado do Docker na lista de versões dis­po­ní­veis do software

Para instalar uma versão especial do Docker, basta adicionar o número da versão (por exemplo, 1.12.5-0) ao res­pec­tivo comando de ins­ta­la­ção, separando-o do nome do pacote (neste caso, docker-engine) por um sinal de igual.

$ sudo apt-get -y install docker-engine=<VERSÃO>

Ins­ta­la­ção pelo re­po­si­tó­rio Ubuntu

Usuários que não querem depender do re­po­si­tó­rio Docker têm a opção de baixar a pla­ta­forma de con­têi­ne­res pelo re­po­si­tó­rio do próprio sistema ope­ra­ci­o­nal Ubuntu.

Use o comando abaixo para instalar um pacote Docker criado pela co­mu­ni­dade Ubuntu:

$ sudo apt-get install -y docker.io
Nota

O pacote de ins­ta­la­ção da pla­ta­forma de con­têi­ne­res docker.io não deve ser con­fun­dido com o pacote docker, uma bandeja do sistema para apli­ca­ções KDE3/GNOME2 Docklet.

Execução de teste

Após concluir o processo de ins­ta­la­ção com sucesso, cer­ti­fi­que-se de que a pla­ta­forma de con­têi­ne­res esteja fun­ci­o­nando de forma adequada. A equipe de de­sen­vol­vi­mento dis­po­ni­bi­liza o contêiner hello-world para essa fi­na­li­dade. Verifique a ins­ta­la­ção do Docker inserindo o comando a seguir no terminal do Ubuntu e pres­si­o­nando a tecla ENTER:

$ sudo docker run hello-world
Nota

O Docker daemon é vinculado a um socket Unix (ponto de co­mu­ni­ca­ção final fornecido pelo sistema ope­ra­ci­o­nal), que é atribuído por padrão ao usuário root. Os demais usuários só con­se­gui­rão usar comandos Docker com a adição de sudo. Isso pode ser alterado com a criação de um grupo Unix com o nome “Docker” e a adição dos usuários desejados. Mais in­for­ma­ções sobre o processo podem ser en­con­tra­das na do­cu­men­ta­ção do projeto Docker.

O comando docker run instrui o Docker daemon a procurar e iniciar um contêiner com o nome hello-world. Se a ins­ta­la­ção do Docker foi realizada sem erros, o resultado será igual ao exibido na captura de tela abaixo:

Imagem: Resultado do contêiner hello-world exibido no terminal
A saudação Hello from Docker comprova que a ins­ta­la­ção do Docker está fun­ci­o­nando cor­re­ta­mente

Esse resultado no terminal significa o seguinte: para executar o comando docker run hello-world, o Docker daemon procura a imagem do contêiner cor­res­pon­dente nos arquivos locais do seu sistema. Como você estará exe­cu­tando o contêiner hello-world pela primeira vez, a busca do daemon não será bem-sucedida. Como resultado, você receberá a mensagem “Unable to find image”.

$ sudo docker run hello-world
[sudo] password for osboxes:
Unable to find image 'hello-world:latest' locally

Quando o Docker não conseguir encontrar a imagem desejada no sistema local, o daemon iniciará um processo de download(pulling) no re­po­si­tó­rio Docker.

latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Após o download bem-sucedido, você receberá a seguinte mensagem: “Down­lo­a­ded newer image for hello-world:latest”. Então, o contêiner será ini­ci­a­li­zado. Ele incluirá o script simples hello-world com a seguinte mensagem dos de­sen­vol­ve­do­res:

Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the ‘hello-world’ image from the Docker Hub.
 3. The Docker daemon created a new contêiner from that image which runs the executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu contêiner with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Ba­si­ca­mente, o texto informa que sua ins­ta­la­ção do Docker está fun­ci­o­nando cor­re­ta­mente.

De­sins­ta­la­ção do Docker

De­sins­ta­lar o Docker Engine pelo terminal é tão fácil quanto instalá-lo. Se você deseja remover o pacote Docker do seu sistema, insira o comando a seguir no terminal do Ubuntu e pressione a tecla ENTER:

$ sudo apt-get purge docker-engine

Após apre­sen­tar as in­for­ma­ções ne­ces­sá­rias para a de­sins­ta­la­ção, o sistema so­li­ci­tará que o comando seja con­fir­mado.

Imagem: Desinstalação do Docker pelo terminal
De­sins­tale a pla­ta­forma Docker com o comando apt-get purge

Para pros­se­guir, insira “Y” e confirme, pres­si­o­nando a tecla ENTER. Insira “N” se quiser cancelar a de­sins­ta­la­ção.

As imagens e os con­têi­ne­res não serão removidos au­to­ma­ti­ca­mente quando o Docker Engine for de­sins­ta­lado. Você pode excluí-los com a ajuda deste comando:

$ sudo rm -rf /var/lib/docker

Se arquivos de con­fi­gu­ra­ção adi­ci­o­nais tiverem sido ins­ta­la­dos, também será preciso removê-los ma­nu­al­mente.

Uti­li­za­ção do Docker

Depois de confirmar que o Docker Engine foi instalado e está rodando per­fei­ta­mente, é hora de se fa­mi­li­a­ri­zar com as pos­si­bi­li­da­des de aplicação da pla­ta­forma de con­têi­ne­res. Aprenda a controlar o Docker Engine pelo terminal, as pos­si­bi­li­da­des o que Docker Hub oferece e porque os con­têi­ne­res Docker podem re­vo­lu­ci­o­nar a gestão de apli­ca­ções com o nosso tutorial Docker.

Como controlar o Docker Engine

A partir da versão 16.04, o Ubuntu passou a usar o programa de segundo plano systemd(junção das palavrassystemedaemon) para gerenciar processos.Systemdé um processoinit, também usado em outras dis­tri­bui­ções Linux, como RHEL, CentOS e Fedora. Nor­mal­mente, osystemdrecebe o ID de processo 1. Por ser o primeiro processo do sistema, odaemoné res­pon­sá­vel por iniciar, monitorar e encerrar todos os processos seguintes. Nas versões an­te­ri­o­res do Ubuntu (14.10 e mais antigas), o programa de segundo planoupstart era o res­pon­sá­vel por essa função.

O Docker daemon também pode ser con­tro­lado pelo systemd. Na versão padrão, a pla­ta­forma de con­têi­ne­res é con­fi­gu­rada para que o daemon seja executado au­to­ma­ti­ca­mente quando o sistema é ini­ci­a­li­zado. Essa con­fi­gu­ra­ção padrão pode ser per­so­na­li­zada pela fer­ra­menta de linha de comando systemctl.

Com o systemctl, você envia comandos para o systemd para controlar um processo ou solicitar seu status. A sintaxe desse comando é a seguinte:

Systemctl [OPÇÃO] [COMANDO]

Alguns comandos se referem a recursos es­pe­cí­fi­cos (por exemplo, Docker). Na ter­mi­no­lo­gia do systemd, eles são chamados de units (unidades). Neste caso, o comando resulta da res­pec­tiva instrução e do nome da unidade a ser abordada.

Se você quiser ativar (enable) a ini­ci­a­li­za­ção au­to­má­tica do Docker daemonou desativá-la (disable), use a fer­ra­menta de linha de comandosystemctl, jun­ta­mente com os seguintes comandos:

$ sudo systemctl enable docker
$ sudo systemctl disable docker

A fer­ra­menta de linha de comando systemctl também permite que você consulte o status de uma unidade:

$ sudo systemctl status docker

Se o Docker Engine estiver ativo no seu sistema Ubuntu, o resultado apre­sen­tado no terminal será se­me­lhante ao exibido na captura de tela:

Imagem: A consulta via systemctl mostra que o status do Docker Engine é active running, ou seja, está ativo
Consulta via systemctl: o status do Docker Engine é active running, ou seja, ativo

Se o seu Docker Engine estiver de­sa­ti­vado, você receberá a de­cla­ra­ção de status inactive (dead). Neste caso, será ne­ces­sá­rio iniciar ma­nu­al­mente o Docker daemon para executar os con­têi­ne­res.

Imagem: A consulta via systemctl mostra que o status do Docker Engine é inactive dead, ou seja, inativo
Consulta via systemctl: o status do Docker Engine é inactive dead ou inativo

Se você quiser iniciar, in­ter­rom­per ou reiniciar ma­nu­al­mente seu Docker Engine, use systemd com um dos comandos a seguir.

Para iniciar o daemon de­sa­ti­vado, digite systemctl em com­bi­na­ção com start:

$ sudo systemctl start docker

Se precisar encerrar o Docker daemon, use o comando stop:

$ sudo systemctl stop docker

A rei­ni­ci­a­li­za­ção do Docker Engine pode ser realizada com o comando restart:

$ sudo systemctl restart docker

Como usar o Docker Hub

Se o Docker Engine é o coração da pla­ta­forma de con­têi­ne­res, o Docker Hub é a alma desse projeto de código aberto, já que é nele que a co­mu­ni­dade se reúne. Neste re­po­si­tó­rio baseado em nuvem, usuários encontram tudo o que precisam para dar vida à ins­ta­la­ção do Docker.

O serviço on-line oferece re­po­si­tó­rios oficiais di­ver­si­fi­ca­dos, com mais de 100.000 apli­ca­ções grátis. Lá, usuários também podem criar arquivos de imagens e com­par­ti­lhá-los pu­bli­ca­mente ou com grupos de trabalho. Além de suporte pro­fis­si­o­nal dis­po­ni­bi­li­zado pela equipe de de­sen­vol­vi­mento, ini­ci­an­tes também encontram na co­mu­ni­dade um ótimo lugar para networ­king. Ainda, há um fórum de suporte dis­po­ní­vel no GitHub.

Imagem: Registro no Docker Hub
Crie seu Docker ID pessoal de graça re­gis­trando-se no Docker Hub; fonte: hub.docker.com

Registre-se no Docker Hub

O registro no Docker Hub é gratuito. Usuários só precisam ter um endereço de e-mail e escolher um Docker ID. Pos­te­ri­or­mente, o ID servirá como seu espaço de nomes de re­po­si­tó­rio e lhe concederá acesso a todos os serviços Docker. Atu­al­mente, esses serviços incluem Docker Cloud, Docker Store e programas em fase beta, além do Docker Hub. O Docker ID também é usado para acessar a central de suporte do Docker, bem como o portal de sucesso e o fórum Docker.

O processo de registro requer cinco passos:

  1. Escolha um Docker ID: No primeiro passo, você deve escolher um nome de usuário que, pos­te­ri­or­mente, será con­si­de­rado seu Docker ID pessoal. Um nome de usuário no Docker Hub (e em todos os demais serviços Docker) deve ter entre quatro e 30 ca­rac­te­res, e conter somente letras mi­nús­cu­las e números.
  2. Informe um endereço de e-mail: Seu endereço de e-mail será ne­ces­sá­rio para confirmar seu registro no Docker Hub.
  3. Defina uma senha: Escolha uma senha entre seis e 128 ca­rac­te­res.
  4. Submeta o registro: Clique no botão “Sign up” para enviar seu registro. Após seus dados serem recebidos, o Docker enviará um link de ve­ri­fi­ca­ção para o endereço de e-mail que você informou no passo 2.
  5. Confirme o endereço de e-mail: Na caixa de entrada da sua conta de e-mail, clique no link de ve­ri­fi­ca­ção recebido para confirmar seu endereço de e-mail e concluir o registro.

Os serviços on-line do projeto Docker serão dis­po­ni­bi­li­za­dos a você ime­di­a­ta­mente após a conclusão do registro. Com eles, você poderá criar re­po­si­tó­rios e grupos de trabalho, ou pesquisar recursos públicos no Docker Hub usando a função “Explore”.

Imagem: Painel do Docker Hub
Selecione e configure re­po­si­tó­rios e grupos de trabalho no painel do Docker Hub; fonte: hub.docker.com

Você também consegue se registrar di­re­ta­mente pelo terminal do seu sistema ope­ra­ci­o­nal, usando o comando docker login. O pro­ce­di­mento detalhado está descrito na do­cu­men­ta­ção do Docker.

Em princípio, o Docker Hub também é dis­po­ni­bi­li­zado a usuários que não possuem uma conta ou um Docker ID. No entanto, nestes casos, somente imagens de re­po­si­tó­rios públicos podem ser baixadas. Não é possível enviar (push) imagens próprias sem um Docker ID.

Crie re­po­si­tó­rios no Docker Hub

A conta gratuita do Docker Hub dis­po­ni­bi­liza somente um re­po­si­tó­rio privado, mas permite criar re­po­si­tó­rios públicos ili­mi­ta­dos. Caso precise de mais re­po­si­tó­rios privados, você pode des­blo­queá-los com um upgrade pago.

Para criar um re­po­si­tó­rio, siga estes passos:

  1. Escolha um espaço de nomes: Re­po­si­tó­rios recém-criados são atri­buí­dos au­to­ma­ti­ca­mente ao espaço de nomes do seu Docker ID. Também é possível utilizar o ID da or­ga­ni­za­ção para a qual você trabalha.
  2. Clas­si­fi­que o re­po­si­tó­rio: Atribua um nome ao re­po­si­tó­rio recém-criado.
  3. Adicione uma descrição: Escreva uma breve descrição, assim como ins­tru­ções de uso de­ta­lha­das.
  4. Configure a vi­si­bi­li­dade: Defina se o re­po­si­tó­rio será visível a todos (opção “public”) ou apenas para você ou sua or­ga­ni­za­ção (opção “private”).

Confirme suas escolhas e clique em “Create”.

Imagem: Docker Hub: Formulário de criação de repositório
Seus re­po­si­tó­rios serão criados au­to­ma­ti­ca­mente no espaço de nomes do seu Docker ID; fonte: hub.docker.com

Crie equipes e or­ga­ni­za­ções no Docker Hub

Pelo Hub, o Docker dis­po­ni­bi­liza uma pla­ta­forma baseada em nuvem. Lá, imagens criadas são ge­ren­ci­a­das cen­tral­mente e com­par­ti­lha­das com grupos de trabalho de um jeito prático. Na ter­mi­no­lo­gia Docker, esses grupos são chamados de or­ga­ni­za­ções (or­ga­ni­za­ti­ons). Assim como contas de usuários in­di­vi­du­ais, or­ga­ni­za­ções recebem IDs que podem ser usados para dis­tri­buir imagens e fazer downloads. Direitos e funções dentro de uma or­ga­ni­za­ção podem ser atri­buí­dos a equipes. Por exemplo, usuários da equipe “Owners” têm au­to­ri­dade para criar re­po­si­tó­rios públicos e privados, e atribuir direitos de acesso.

Grupos de trabalho também podem ser criados e ge­ren­ci­a­dos di­re­ta­mente no painel. Para mais in­for­ma­ções sobre or­ga­ni­za­ções e equipes, consulte a do­cu­men­ta­ção do Docker.

Trabalhe com imagens e con­têi­ne­res

Além de um primeiro ponto de contato com os recursos oficiais do Docker, o Docker Hub é também o ponto de partida para a in­tro­du­ção do uso de imagens e de con­têi­ne­res. A própria equipe de de­sen­vol­ve­do­res da pla­ta­forma dis­po­ni­bi­liza uma imagem de de­mons­tra­ção, chamada whalesay. Ela será usada como base pelo nosso tutorial de Docker.

Baixe imagens Docker

Para encontrar a imagem whalesay, acesse a página inicial do Docker Hub e digite o termo whalesay na barra de pesquisa, no lado esquerdo da tela, perto do logotipo Docker.

Imagem: Função de pesquisa no Docker Hub
Faça uma busca no Docker Hub usando a barra de pesquisa ou o botão Explore; fonte: hub.docker.com

Nos re­sul­ta­dos da pesquisa, clique no recurso in­ti­tu­lado docker/whalesay para acessar o re­po­si­tó­rio público dessa imagem.

Os re­po­si­tó­rios Docker seguem o mesmo padrão: no cabeçalho da página, usuários encontram o título da imagem, a categoria do re­po­si­tó­rio e a data do último envio (last pushed).

Imagem: Repositório Docker
No re­po­si­tó­rio, usuários costumam encontrar todas as in­for­ma­ções ne­ces­sá­rias para usar uma imagem; fonte: hub.docker.com

Cada re­po­si­tó­rio Docker também dis­po­ni­bi­liza os seguintes campos de in­for­ma­ção:

  • Descrição curta (short des­crip­tion): Breve descrição do recurso.
  • Descrição completa (full des­crip­tion): Descrição detalhada, que costuma incluir ins­tru­ções de uso.
  • Comando docker pull(docker pull command): Diretiva de linha de comando usada para fazer o download da imagem do re­po­si­tó­rio (pull).
  • Pro­pri­e­tá­rio (owner): In­for­ma­ções sobre o criador do re­po­si­tó­rio.
  • Co­men­tá­rios (comments): Seção de co­men­tá­rios ao final da página.

Os campos de in­for­ma­ção dis­po­ni­bi­li­za­dos pelo re­po­si­tó­rio mostram que whalesay é uma mo­di­fi­ca­ção do script de código aberto cowsay para Perl. O programa, de­sen­vol­vido por Tony Monroe em 1999, gera um gráfico ASCII na forma de uma vaca, que é exibida em conjunto com uma mensagem, no terminal do usuário.

Para fazer o download de docker/whalesay, use o comando docker pull com o seguinte padrão:

$ docker pull [OPÇÕES] NOME [:TAG|@DIGEST]

O comando docker pull instrui o daemon a carregar uma imagem do re­po­si­tó­rio. Você es­pe­ci­fica que imagem é essa ao inserir o título (NOME) dela. Você também pode instruir o Docker sobre qual comando deve ser realizado (OPÇÕES). In­for­ma­ções opcionais incluemtags(:TAG) enúmeros de iden­ti­fi­ca­çãoin­di­vi­du­ais (@DIGEST), que permitem fazer o download de uma versão es­pe­cí­fica de uma imagem.

Uma cópia local da imagem docker/whalesay pode ser obtida com o seguinte comando:

$ docker pull docker/whalesay

Na maioria das vezes, você pode pular esse passo. Caso você deseje ini­ci­a­li­zar um contêiner, o Docker daemon fará o download au­to­má­tico das imagens do re­po­si­tó­rio, caso elas não sejam en­con­tra­das no sistema local.

Inicie imagens Docker como con­têi­ne­res

Para iniciar uma imagem Docker, use o comando docker run com o padrão a seguir:

$ docker run [OPÇÕES] IMAGEM [:TAG|@DIGEST] [CMD] [ARG...]

A única parte obri­ga­tó­ria do comando docker run é o nome da imagem Docker. Contudo, ao iniciar um contêiner, você também pode definir opções adi­ci­o­nais, TAGseDIGESTs. Além disso, o comando docker run também pode ser combinado com outros comandos que são exe­cu­ta­dos assim que o contêiner é iniciado. No nosso exemplo, o CMD (comando definido pelo criador da imagem e executado au­to­ma­ti­ca­mente quando o contêiner é iniciado) foi subs­ti­tuído. Outras con­fi­gu­ra­ções opcionais podem ser definidas por meio de ar­gu­men­tos adi­ci­o­nais(ARG…). Eles pos­si­bi­li­tam, por exemplo, adicionar usuários ou trans­fe­rir variáveis de ambiente.

Digite a seguinte diretiva de linha de comando:

$ docker run docker/whalesay cowsay boo

Ela fará o download do script Perl já existente como imagem e o executará em um contêiner. Note que este whalesay é bastante diferente do script original.

Imagem: Resultado do contêiner docker whalesay no terminal: a baleia diz boo
Se docker whalesay for executado com o comando padrão, a baleia Docker se limitará a dizer boo

Se a imagem docker/whalesay for executada, o script resultará em um gráfico ASCII na forma de baleia, com a mensagem “boo”, trans­mi­tida com o comando cowsay no terminal.

Assim como na execução teste, nas demais o daemon também procura primeiro a imagem desejada no diretório de arquivos local. Somente se não houver nenhum pacote com o mesmo título, a busca no re­po­si­tó­rio Docker é iniciada. Em seguida, o daemon inicia o programa cowsay mo­di­fi­cado. Ao final da execução, o contêiner será encerrado au­to­ma­ti­ca­mente.

Assim como cowsay, whalesay do Docker permite modificar a sequência do programa e alterar o texto exibido no terminal. Você pode testar essa função subs­ti­tuindo, no comando, “boo” por qualquer outra frase. Por exemplo, por um meme sobre baleias:

$ sudo docker run docker/whalesay cowsay A baleia é amiga da sereia
Imagem: Resultado do contêiner docker whalesay no terminal: baleia com mensagem personalizada
Faça sua baleia Docker dizer o que você quiser, subs­ti­tuindo as palavras no balão de fala

Exiba todas as imagens Docker no sistema local

Se você não tem certeza se já fez o download de uma imagem em especial, é possível solicitar uma lista de todas as imagens presentes no seu sistema local. Para tanto, use a seguinte diretiva de linha de comando:

$ sudo docker image

O comando docker image resultará na exibição de todas as imagens locais, com in­for­ma­ções como tamanho do arquivo, tag e ID da imagem.

Imagem: Lista de todas as imagens presentes no sistema local
O terminal exibe as imagens hello-world e docker whalesay

Se você iniciar um contêiner, uma cópia da imagem sub­ja­cente será baixada do re­po­si­tó­rio e ar­ma­ze­nada per­ma­nen­te­mente no seu com­pu­ta­dor. Isso lhe ajudará a eco­no­mi­zar tempo, sempre que quiser acessar a imagem. Um novo download só será realizado se a origem da imagem for alterada. Por exemplo, sempre que a versão for atu­a­li­zada no re­po­si­tó­rio.

Exiba todos os con­têi­ne­res no sistema local

Se você quiser obter a lista de todos os con­têi­ne­res em execução no seu sistema, ou já exe­cu­ta­dos no passado, use a diretiva de linha de comando docker ps, combinada à opção --all ou -a (forma abreviada):

$ sudo docker ps -a
Imagem: Lista de contêineres no sistema local
O terminal exibe todos os con­têi­ne­res que foram iniciados no Docker Engine

O resultado exibido no terminal contém in­for­ma­ções como ID do contêiner; imagem sub­ja­cente; comando executado quando o contêiner foi iniciado; hora em que ele foi iniciado e status.

Se você quiser que somente os con­têi­ne­res atu­al­mente em execução no sistema sejam exibidos, use a diretiva de linha de comando docker ps, sem adicionar nenhuma outra opção.

$ sudo docker ps

No entanto, ao executar este comando logo após a ins­ta­la­ção do Docker, é provável que nenhum contêiner esteja em execução no seu sistema.

Crie imagens Docker

Nosso tutorial Docker já ensinou como encontrar imagens no Docker Hub, assim como a baixá-las e executá-las com o Docker Engine. Mas além de acessar e utilizar registros dis­po­ni­bi­li­za­dos pela pla­ta­forma e por terceiros, usuários também podem criar imagens próprias e com­par­ti­lhá-las com outros de­sen­vol­ve­do­res.

Você já aprendeu que cada imagem Docker é baseada em um Doc­ker­file. ODoc­ker­fileatua como um modelo de criação para imagens. Trata-se de um arquivo de texto simples, com todas as ins­tru­ções que o Docker precisa para criar uma imagem. Nos passos a seguir, você aprenderá a escrever este tipo deDoc­ker­file e a instruir o Docker a utilizar sua escrita para criar uma nova imagem.

  1. Crie um novo diretório: A equipe de de­sen­vol­vi­mento do Docker recomenda criar um diretório para cada Doc­ker­file. Di­re­tó­rios podem ser criados com fa­ci­li­dade pelo terminal do Linux. Use o comando a seguir para criar um diretório com o nome my­doc­ker­build:
$ mkdir mydockerbuild
Imagem: Comando mkdir no terminal do Ubuntu:
Crie novos di­re­tó­rios com o comando mkdir
  1. Navegue pelo novo diretório: Use o comando cd para navegar pelo diretório recém-criado.
$ cd mydockerbuild
Imagem: Comando cd no terminal do Ubuntu
Com a ajuda do comando cd, mude de diretório de trabalho
  1. Crie um novo arquivo de texto: Você também pode criar arquivos de texto com fa­ci­li­dade pelo terminal do Ubuntu. Para fazer isso, use um editor de código, como Nano ou Vim. Crie um arquivo de texto com o nome Doc­ker­file no diretório my­doc­ker­build.
$ nano Dockerfile
Imagem: Terminal do Ubuntu: crie arquivos de texto com o Nano
O editor de texto Nano vem pré-instalado em todas as versões do Ubuntu
  1. Escreva o Doc­ker­file: O arquivo de texto recém-criado servirá como base para a imagem a ser de­sen­vol­vida por você. Em vez de programar a imagem do zero, nosso tutorial Docker usará a imagem de de­mons­tra­çãodocker/whalesaycomo modelo. Ela será integrada pelo comando FROM noDoc­ker­file. Use atag :latest para apontar para a versão mais nova da imagem.
FROM docker/whalesay:latest

Até o momento, você adicionou falas à baleia com o docker/whalesay. No terminal, o exato texto inserido por você foi exibido jun­ta­mente com o comando de ini­ci­a­li­za­ção do contêiner. Não seria mais in­te­res­sante, contudo, se o próprio script gerasse o novo resultado de texto au­to­ma­ti­ca­mente? Isso pode ser feito! Use, por exemplo, o programa Furtunes, dis­po­ní­vel em todos os sistemas Linux. A função básica do Fortunes é gerar frases estilo “sorte do dia” e ditados bem-humorados. Digite o comando abaixo para atualizar a indexação do seu pacote local e instalar o Fortunes:

RUN apt-get -y update && apt-get install -y fortunes

Em seguida, defina uma de­cla­ra­ção CMD. Ela deve ser executada após o comando RUN, a menos que tenha sido subs­ti­tuída pelo chamado (docker run image CMD). Use o comando abaixo para executar o programa Fortunes com a opção -a (se­le­ci­o­nar de todos os bancos de dados) e exibir os re­sul­ta­dos no terminal, usando o programa cowsay:

CMD /usr/games/fortune -a | cowsay

Seu Doc­ker­file ficará assim:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Ob­ser­va­ção: Os comandos dentro de um Doc­ker­filesempre devem conter es­pa­ça­mento simples e começar com uma palavra-chave. Sua sintaxe não di­fe­ren­cia letras maiús­cu­las e mi­nús­cu­las. No entanto, o uso con­sis­tente de maiús­cu­las nas palavras-chave se po­pu­la­ri­zou.

Imagem: Editor de texto Nano no terminal do Ubuntu
Controle o editor de texto Nano com as com­bi­na­ções de teclas sugeridas pelo rodapé
  1. Salve o arquivo de texto: Salve sua entrada. Se estiver usando o editor Nano, use a com­bi­na­ção de teclas CTRL + O e confirme pres­si­o­nando ENTER. O Nano informará que três linhas foram escritas no arquivo se­le­ci­o­nado. Feche o editor de texto usando a com­bi­na­ção de teclas CTRL + X.

  2. Crie uma imagem como um Doc­ker­file: Para criar uma imagem a partir de umDoc­ker­file, navegue até o diretório onde o arquivo de texto está lo­ca­li­zado. Inicie a criação da imagem com a diretiva de linha de comando docker build. Se quiser nomear in­di­vi­du­al­mente a imagem ou atribuir umataga ela, use a opção-t, seguida pela com­bi­na­ção desejada de título etag. O formato padrão énome:tag.

Em nosso exemplo, uma imagem com o nome docker-whale será criada:

$ docker build -t docker-whale .

O ponto final indica que o Doc­ker­file sub­ja­cente se encontra no diretório se­le­ci­o­nado. Você também pode es­pe­ci­fi­car um caminho ou URL para os arquivos de origem.

Imagem: Criação de imagem no terminal do Ubuntu
Criação de imagem com Docker build

O processo build começa assim que o comando é con­fir­mado, pres­si­o­nando a tecla ENTER. Primeiro, o Docker daemon verifica se possui todos os arquivos que ele precisa para criar a imagem. Na ter­mi­no­lo­gia Docker, isso é chamado de context (contexto). A seguinte mensagem de status é exibida no terminal:

Sending build context to Docker daemon 2.048 kB

Em seguida, a imagem docker/whalesay com a tag: latest é lo­ca­li­zada:

Step 1/3 : FROM docker/whalesay:latest
    ---> 6b362a9f73eb

Se o contexto ne­ces­sá­rio para a criação da imagem já existir em to­ta­li­dade, o Docker daemon iniciará o modelo de imagem anexado com o comando FROM em um contêiner tem­po­rá­rio, e avançará para o próximo comando no Doc­ker­file. Em nosso exemplo, usamos o comando RUN, que faz com que o programa Fortunes seja instalado.

Step 2 : RUN apt-get -y update && apt-get install -y fortunes
    ---> Running in 80b81eda1a11
…etc.

Ao final de cada passo do processo de criação de uma imagem, o Docker informa um ID para a camada que foi criada. Isso significa que cada linha no Doc­ker­file sub­ja­cente cor­res­ponde a uma camada da imagem nele cons­truída.

Quando o comando RUN é concluído, o Docker daemon in­ter­rompe o contêiner criado, faz a remoção dele e inicia um novo contêiner tem­po­rá­rio para a camada da de­cla­ra­ção CMD.

Step 3/3 : CMD /usr/games/fortune -a | cowsay
 ---> Running in c3ac46675e7a
 ---> 4419af61d32d
Removing intermediate container c3ac46675e7a

Ao final do processo de criação, o contêiner tem­po­rá­rio criado no terceiro passo também é encerrado e removido. Fi­nal­mente, o Docker informará o ID da nova imagem:

Successfully built 4419af61d32d
Imagem: Terminal do Ubuntu: mensagem de status durante a criação de uma imagem
As imagens Docker são criadas em múltiplas camadas

A imagem recém-criada pode ser iden­ti­fi­cada pelo nome docker-whale na lista de imagens salvas lo­cal­mente.

$ sudo docker images
Imagem: Terminal do Ubuntu: lista de todas as imagens
A imagem recém-criada é exibida na lista de imagens

Para iniciar um contêiner a partir da sua nova imagem, use a diretiva de linha de comando sudo docker run combinada com o nome da imagem:

$ sudo docker run docker-whale

Se a imagem for criada cor­re­ta­mente pelo Doc­ker­file, sua baleia será uma fonte de ins­pi­ra­ção, apre­sen­tando frases sábias es­pi­ri­tu­o­sas. Ob­ser­va­ção: sempre que você reiniciar o contêiner, uma nova frase será gerada.

Imagem: Contêiner baseado em docker-whale: resultado do texto no terminal
Graças ao Fortunes, a baleia em ASCII com­par­ti­lha frases es­pi­ri­tu­o­sas

Atribua tags às imagens Docker e carregue-as no Docker Hub

Se você deseja carregar sua imagem docker-whale per­so­na­li­zada no Hub e dis­po­ni­bi­lizá-la à co­mu­ni­dade ou a um grupo de trabalho, primeiro é ne­ces­sá­rio vinculá-la a um re­po­si­tó­rio. Ele deverá ter o mesmo nome do seu próprio espaço de nomes. Na ter­mi­no­lo­gia Docker, esta etapa é chamada de tagging.

Para publicar uma imagem no Docker Hub, siga estes passos:

  1. Crie um re­po­si­tó­rio: Acesse o Docker Hub usando seu Docker ID e sua senha pessoal. Em seguida, crie um re­po­si­tó­rio público com o nome docker-whale.
Imagem: Docker Hub: formulário para criação de repositório
Crie um re­po­si­tó­rio para sua imagem per­so­na­li­zada
  1. Defina o ID da imagem: Defina o ID da sua imagem docker-whale per­so­na­li­zada usando a diretiva de linha de comando docker images.
$ sudo docker images
REPOSITORY		TAG	IMAGE ID		CREATED		SIZE
docker-whale		latest	4419af61d32d		22 hours ago		275 MB
hello-world		latest	48b5124b2768		6 weeks ago		1.84 kB
docker/whalesay	latest	6b362a9f73eb		21 months ago		247 MB

No nosso caso, o ID cor­res­pon­dente à imagem é 4419af61d32d. Pre­ci­sa­re­mos dele no próximo passo do processo de tagging.

Imagem: Lista de todas as imagens locais no terminal do Ubuntu
O comando docker images exibe a lista de todas as imagens salvas no sistema
  1. Atribua uma tag à imagem: Atribua uma tag à imagem docker-whale usando a linha de comando docker tag com o seguinte padrão:
$ sudo docker tag [ID da imagem][Docker ID]/[Nome da imagem]:[TAG]

No exemplo do nosso tutorial Docker, a diretiva de linha de comando para tagging é a seguinte

$ sudo docker tag 4419af61d32d myfreedockerid/docker-whale:latest

Você pode conferir se atribuiu a tag cor­re­ta­mente à sua imagem so­li­ci­tando a lista de imagens do Docker. O nome do re­po­si­tó­rio passará a incluir seu Docker ID.

Imagem: Terminal do Ubuntu: lista das imagens antes e depois do processo de tagging
Vincule imagens ao seu Docker ID usando o comando docker tag
  1. Envie a imagem: Para enviar a imagem, você precisa acessar o Docker Hub usando sua conta. Isso pode ser feito pelo terminal, com o comando docker login.
$ sudo docker login

O terminal so­li­ci­tará que você insira seu nome de usuário (Docker ID) e senha.

Imagem: Acesso ao Docker Hub pelo terminal do Ubuntu
Antes de enviar uma imagem ao Docker Hub, você precisa acessar sua conta

Se o acesso for bem-sucedido, use a diretiva de linha de comando push para enviar sua imagem ao re­po­si­tó­rio recém-criado.

$ sudo docker push myfreedockerid/docker-whale

O processo de envio deve levar apenas alguns segundos. O status é informado no terminal.

Imagem: Terminal do Ubuntu: mensagem de status do envio da imagem
Após o envio, a imagem ficará dis­po­ní­vel no grupo tag latest do Docker Hub

Acesse o Docker Hub pelo navegador para vi­su­a­li­zar a imagem enviada.

Imagem: Docker Hub: visão detalhada do repositório myfreedockerid docker-whale
A última atu­a­li­za­ção do seu re­po­si­tó­rio será exibida na visão detalhada

Se você quiser enviar mais de uma imagem por re­po­si­tó­rio, use tags di­ver­si­fi­ca­das para dis­po­ni­bi­li­zar suas imagens em versões di­fe­ren­tes. Por exemplo:

$ sudo docker images
REPOSITORY       TAG    IMAGE ID      CREATED       SIZE
docker-whale     latest 4419af61d32d  22 hours ago  275 MB
hello-world      latest 48b5124b2768  6 weeks ago   1.84 kB
docker/whalesay  latest 6b362a9f73eb  21 months ago 247 MB

Uma visão geral das diversas versões da imagem é exibida no re­po­si­tó­rio do Docker Hub, na aba “Tags”.

Imagem: Docker Hub: aba Tags
Na aba Tags, você encontra todas as versões de uma imagem; fonte: hub.docker.com

No entanto, imagens de projetos di­fe­ren­tes devem ser dis­po­ni­bi­li­za­das em re­po­si­tó­rios distintos.

Se o envio for bem-sucedido, sua imagem per­so­na­li­zada estará dis­po­ní­vel no re­po­si­tó­rio público a todos os usuários de Docker ao redor do mundo.

  1. Execute um teste: Efetue o download da imagem teste para checar se o envio foi bem-sucedido.

Observe que a versão local da imagem precisa ser excluída antes que o download de uma nova cópia com a mesma tag seja realizado. Do contrário, o Docker informará que a imagem desejada já existe em versão atu­a­li­zada.

Imagem: Mensagem de status: Image is up to date
Se a imagem já existir lo­cal­mente, o comando pull será cancelado

Para excluir uma imagem Docker lo­cal­mente, use o comando docker rmi combinado com o res­pec­tivo ID da imagem. Como de costume, isso deve ser feito por meio do Docker Images. Se o Docker registrar um conflito (por exemplo, se o ID de uma imagem estiver sendo usado em múltiplos re­po­si­tó­rios ou em um contêiner), reitere o comando com a opção –force ou -f (forma abreviada), para forçar sua exclusão.

sudo docker rmi -f 4419af61d32d
Imagem: Comando docker rmi combinado à opção -f force
Use o comando docker rmi combinado à opção -f para forçar uma exclusão

Exiba a lista de todas as imagens locais novamente:

$ sudo docker Images

Os elementos excluídos não devem mais ser exibidos pelo terminal. Use o comando pull no re­po­si­tó­rio para fazer o download de uma nova cópia da imagem pelo Docker Hub.

$ sudo docker pull myfreedockerid/docker-whale
Imagem: Terminal do Ubuntu: download pelo Docker Hub
O download da imagem publicada foi realizado com sucesso

De ini­ci­an­tes a pro­fis­si­o­nais em Docker

Neste tutorial Docker, mostramos que a pla­ta­forma de con­têi­ne­res se difere da tra­di­ci­o­nal vir­tu­a­li­za­ção de hardware em vários aspectos fun­da­men­tais. O Docker conta com con­têi­ne­res softwares e, por isso, evita a so­bre­carga do sistema ope­ra­ci­o­nal virtual convidado. Os con­têi­ne­res com­par­ti­lham o núcleo do mesmo host e geram tudo o que é ne­ces­sá­rio para executar apli­ca­ções como processos isolados no espaço de usuário. O resultado é por­ta­bi­li­dade máxima. Com o Docker, um único contêiner software pode ser executado em diversas pla­ta­for­mas e em vários sistemas e in­fra­es­tru­tu­ras. Re­qui­si­tos são somente: ins­ta­la­ção local do Docker Engine e acesso ao Docker Hub baseado em nuvem.

Nosso exemplo de­mons­trou como é rápido im­ple­men­tar uma pla­ta­forma de con­têi­ne­res ple­na­mente funcional no Ubuntu — uma popular dis­tri­bui­ção Linux — usando o Docker. Você aprendeu a instalar e con­fi­gu­rar o Docker no Ubuntu, fazer o download de apli­ca­ções como imagens pelo Docker Hub e executá-las lo­cal­mente em con­têi­ne­res. Você escreveu um Doc­ker­file, criou sua própria imagem e a dis­po­ni­bi­li­zou a outros usuários de Docker por meio do serviço em nuvem. Resumindo: você se fa­mi­li­a­ri­zou com o básico da pla­ta­forma de con­têi­ne­res.

Não se esqueça, porém, que o universo Docker é gi­gan­tesco. Com o passar do tempo, o pro­e­mi­nente projeto de código aberto se trans­for­mou em um ecos­sis­tema Docker vivo. Devido ao seu sucesso, diversos con­cor­ren­tes tentam emplacar al­ter­na­ti­vas ao Docker no mercado. O Docker é uma opção in­te­res­sante para ad­mi­nis­tra­do­res, es­pe­ci­al­mente aos que operam apli­ca­ções complexas, com múltiplos con­têi­ne­res paralelos, em sistemas di­fe­ren­tes. A solução também oferece diversas funções para a or­ques­tra­ção de con­têi­ne­res, com Swarm e Compose.

Ir para o menu principal